LinuxカーネルのコンテキストでDMAマッピングとDMAエンジンとは何ですか? LinuxデバイスドライバでDMAマッピングAPIとDMAエンジンAPIを使用することができますか? 実際のLinuxデバイスドライバの例を参考にしてください。LinuxカーネルのコンテキストでDMAマッピングとDMAエンジンとは何ですか?
答えて
dmaengineは、DMAコントローラドライバを開発するための汎用的なカーネルフレームワークです。
あなたは読むことができます: dmaengine provider 。 多くのdmaengineドライバの例はdrivers/dmaの下にあります。
質問の最初の部分にも回答が必要です。上記の私のコメントを参照してください。 – 0andriy
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デバイスドライバの例を参考にしてください。
Linuxカーネル内には様々な本物のドライバーのためにdrivers/dmaに目を向けることができます。
実際のコンセプトの例については、http://lxr.free-electrons.comのカーネルソースツリーのドライバを指摘してください。 – JagsVG
しばらくお待ちください回答を更新します –
@JagsVGが満足していますか? –
- 1. ザイリンクスのZynqベースのプラットフォームでAXI-DMA IPを使用するPCM DMAエンジン
- 2. LinuxでDMAにアクセスする方法
- 3. ユーザ空間バスエラーからのLinux DMA
- 4. PCIeとDMAのベンチマーク方法
- 5. Linuxカーネル:ストリーミングDMAマッピングを無期限に開いたままにしても構いませんか?
- 6. DMAチャネル仮想化とは何を意味しますか?
- 7. 大規模PCIe DMA Linux x86-64
- 8. stm32 SPI + DMA
- 9. DMA転送データレート
- 10. STM32F4 DMA UART
- 11. DMAを使用したバイトI/O、利点は何ですか?
- 12. 「6チャンネルDMA」とはどういう意味ですか?
- 13. STM32F0 DMA「入力オーバーフロー」
- 14. 同時DMAユーザメモリに
- 15. DMAで途中で中断することはできますかSTM32f0
- 16. OpenGLのVBO DMA配列
- 17. ラズベリーパイ雷DMAのPWMフリッカー
- 18. Linuxカーネルで実際のGRAND祖先プロセスとは何ですか?
- 19. Linuxカーネルのkzalloc_nodeのメモリノードとは何ですか?
- 20. Linuxカーネルのバージョンとの違いは何ですか?
- 21. DMAコントローラが選択されるとどうなりますか?
- 22. STM32F4 DMAは並行して動作できますか?
- 23. ACなし起動時のDMAエラー
- 24. 大きなDMAバッファの割り当て
- 25. DMAを使用してPCIeと通信する
- 26. stm32f407xxをターミナルログとして使用するDMA USART Tx
- 27. DMAとCPUの並行処理について
- 28. STM32F302異なるサイズとチャンネルのDMAを使用したAdc
- 29. "typedef __u16 __bitwise __le16;"とは何ですか? Linuxカーネルの意味ですか?
- 30. DMAを使用してLinuxデバイスドライバからハードドライブに書き込む方法
DMAマッピングは、仮想アドレス指定メモリから物理アドレス(実際にはバスアドレス)上でDMA可能なメモリへの変換です。あなたは、そのためのカーネルのドキュメントを読む必要がありますhttps://www.kernel.org/doc/Documentation/DMA-API-HOWTO.txt – 0andriy
申し訳ありません@AndyShevchenko私はあなたがコメントを投稿したことを知らなかった。私は書いていたあなたのコメントの前の答え。私はあなたが私の質問に答えて気にしないことを願っています。 –