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 状态我可以使用 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 内存?
- 其他的?