2015-12-25 22 views
6

LinuxカーネルのコンテキストでDMAマッピングとDMAエンジンとは何ですか? LinuxデバイスドライバでDMAマッピングAPIとDMAエンジンAPIを使用することができますか? 実際のLinuxデバイスドライバの例を参考にしてください。LinuxカーネルのコンテキストでDMAマッピングとDMAエンジンとは何ですか?

+1

DMAマッピングは、仮想アドレス指定メモリから物理アドレス(実際にはバスアドレス)上でDMA可能なメモリへの変換です。あなたは、そのためのカーネルのドキュメントを読む必要がありますhttps://www.kernel.org/doc/Documentation/DMA-API-HOWTO.txt – 0andriy

+0

申し訳ありません@AndyShevchenko私はあなたがコメントを投稿したことを知らなかった。私は書いていたあなたのコメントの前の答え。私はあなたが私の質問に答えて気にしないことを願っています。 –

答えて

0

dmaengineは、DMAコントローラドライバを開発するための汎用的なカーネルフレームワークです。

あなたは読むことができます: dmaengine provider 。 多くのdmaengineドライバの例はdrivers/dmaの下にあります。

+1

質問の最初の部分にも回答が必要です。上記の私のコメントを参照してください。 – 0andriy

5

LinuxカーネルのコンテキストでDMAマッピングとDMAエンジンとは何ですか?

通常、カーネルは仮想アドレスを使用します。 kmalloc()vmalloc()のような関数は通常、仮想アドレスを返します。 void*に格納することができます。仮想メモリシステムは、これらのアドレスを物理アドレスに変換します。これらの物理アドレスは、実際にドライバにとって有用ではありません。ドライバは、スペースをマップして仮想アドレスを生成するためにioremap()を使用する必要があります。

   CPU     CPU     Bus 
      Virtual    Physical    Address 
      Address    Address    Space 
       Space    Space 

      +-------+    +------+    +------+ 
      |  |    |MMIO | Offset |  | 
      |  | Virtual |Space | applied |  | 
      C +-------+ --------> B +------+ ----------> +------+ A 
      |  | mapping |  | by host |  | 
    +-----+ |  |    |  | bridge |  | +--------+ 
    |  | |  |    +------+    |  | |  | 
    | CPU | |  |    | RAM |    |  | | Device | 
    |  | |  |    |  |    |  | |  | 
    +-----+ +-------+    +------+    +------+ +--------+ 
      |  | Virtual |Buffer| Mapping |  | 
      X +-------+ --------> Y +------+ <---------- +------+ Z 
      |  | mapping | RAM | by IOMMU 
      |  |    |  | 
      |  |    |  | 
      +-------+    +------+ 

デバイスがDMAをサポートしている場合、ドライバは、仮想アドレス(X)を返すkmalloc又は同様のインターフェースを使用してバッファをセットアップします。仮想メモリ は、XをシステムRAMの物理アドレス(Y)にマップします。ドライバ は仮想アドレスXを使用してバッファにアクセスできますが、DMA自体がCPU仮想メモリシステムを経由しないため、デバイス自体は できません。一部のシステムでは、DeviceはDMAを物理アドレスに直接行うことができます。これは、Zは、Yに変換する上でいくつかのシステムIOMMUのハードウェアで は数字で物理address.LookにDMAアドレスを変換するために使用される

DMAマッピングAPIは、Linuxデバイス ドライバーで使用することができますか? DMAマッピングAPIを使用する

理由は、ドライバーが任意のIOMMU マッピングを必要と設定し、DMAアドレスZ.Theドライバは、その後にDMAを行う にデバイスを伝え返すdma_map_single()のようにインタフェースする仮想アドレスXを、返すことができていますZに格納され、IOMMUはそれをシステム RAM内のアドレスYのバッファにマップする。

this linkを参照してください。

実際のLinuxデバイスドライバの例を参考にしてください。

A simple PCI DMA example

Linuxカーネル内には様々な本物のドライバーのためにdrivers/dmaに目を向けることができます。

+0

実際のコンセプトの例については、http://lxr.free-electrons.comのカーネルソースツリーのドライバを指摘してください。 – JagsVG

+0

しばらくお待ちください回答を更新します –

+0

@JagsVGが満足していますか? –

関連する問題