dma_map_single
パラメータとして渡されたバッファを使用したLDD3 (p:453) のデモ。
bus_addr = dma_map_single(&dev->pci_dev->dev, buffer, count, dev->dma_dir);
Q1 : このバッファーはどこから来たのですか?
kmalloc
?
Q2 : DMA-API-HOWTO.txt に rawkmalloc
を DMA に使用できると記載されているのはなぜですか?
フォームhttp://www.mjmwired.net/kernel/Documentation/DMA-API-HOWTO.txt
L:51 ページ アロケータ kmalloc() を介してメモリを取得した場合は、これらのルーチンから返されたアドレスを使用して、そのメモリとの間で DMA を実行できます。
L:74 kmap() 呼び出しと DMA のリターンを取得することはできません。
- から返されたアドレス
kmalloc
をハードウェアデバイスに渡すことができますか? - それとも最初に実行する必要があり
virt_to_bus
ますか? - または、これをに渡す必要があり
dma_map_single
ますか?
Q3 : DMA 転送が完了したら、アドレス経由でカーネル ドライバのデータを読み取ることはできkmalloc
ますか?
addr = kmalloc(...);
...
printk("test result : 0x%08x\n", addr[0]);
Q4 : これをユーザー空間に移動する最良の方法は何ですか?
copy_to_user
?- kmallocメモリをmmapしますか?
- 他?