LDD3(p:453)演示dma_map_single使用作为参数传入的缓冲区.
bus_addr = dma_map_single(&dev->pci_dev->dev, buffer, count, dev->dma_dir);
Run Code Online (Sandbox Code Playgroud)
Q1:这个缓冲区来自哪里/哪里?
kmalloc?
Q2:为什么DMA-API-HOWTO.txt状态我可以使用raw 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?问题3:DMA传输完成后,我可以通过kmalloc地址读取内核驱动程序中的数据吗?
addr = kmalloc(...);
...
printk("test result : 0x%08x\n", addr[0]);
Run Code Online (Sandbox Code Playgroud)
问题4:将这个用户空间送到用户空间的最佳方式是什么?
copy_to_user?我正在将大型代码库移植到 Linux 内核设备驱动程序。ASIC 使用大量 DMA 通道。
我 kmalloc 内存与GFP_KERNEL|GFP_DMA. 在启动 DMA 之前,我使用 dma_map_single 来获取硬件(物理)内存地址以提供给硬件。(也会刷新/使 dcache 中的内存无效?)我有时需要 CPU 访问数据,一旦 DMA 完成,但不经常。在通过代码访问数据之前,我执行了 dma_unmap_single 以避免缓存一致性问题。
在我不需要 CPU 访问的情况下,我还需要调用dma_unmap_single吗?我应该dma_unmap_single每一个指针dma_map_single吗?是否dma_map_single消耗dma_unmap_single将释放的资源(例如,表条目)?
DMA-API.txt 不清楚良好的 DMA 内存卫生。
谢谢!