この呼び出しから返された DMA アドレスは物理アドレスと同じですか? LDD3 は、ドライバが DMA アドレスを不透明として扱う必要があることを示しています。ユーザー空間が直接読み書きできるように、この DMA バッファーを mmap したいと考えています。質問は、remap_pfn_range にどの PFN を指定する必要があるかです (これは、I/O メモリと同じようにコンベンショナル メモリでも機能するようになりました (カーネル 3.4 以降))。DMA アドレスを unsigned long にキャストして、それを PFN に変換することはできますか? これはLDD3が不透明性について言ったことに違反していませんか?
dma_alloc_coherent
常に__get_free_pages
内部で使用しますか? これは、領域が常に過剰に割り当てられる可能性があることを意味しますか (最初の関数はバイトを使用しますが、2 番目の関数はページ単位で割り当てるため)?への呼び出しから取得された複数の連続したページに対して単一のストリーミング マッピングをセットアップする方法はあります
__get_free_pages
か?dma_map_page
単一ページのみに適用されます。
質問する
17500 次
1 に答える
12
いいえ、返されるアドレスは仮想アドレスです。そうしないと、カーネル空間からアクセスできなくなります。物理アドレスを表す dma_handle ですが、不透明です。返されるアドレスで virt_to_phys を使用し、これを remap_pfn_range に渡す必要があります。
そうだとは思いませんが(プラットフォームに依存する可能性があります)、ページを割り当てます。DMA 用に少量のメモリが必要な場合は、dma_pool_create を使用して、そこから領域を割り当てる必要があります。
dma_map_page の代わりに dma_map_single を使用できます。
このようなものの詳細については、DMA-API.txtを参照することをお勧めします。
于 2012-08-23T13:10:20.217 に答える