【发布时间】:2011-04-06 09:39:52
【问题描述】:
LDD3 (p:453) 演示 dma_map_single 使用作为参数传入的缓冲区。
bus_addr = dma_map_single(&dev->pci_dev->dev, buffer, count, dev->dma_dir);
Q1:这个缓冲区来自什么/哪里?
kmalloc?
Q2:为什么 DMA-API-HOWTO.txt 声明我可以使用原始 kmalloc 进行 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 内存?
- 其他人?
【问题讨论】:
标签: linux linux-kernel linux-device-driver dma