[英]Linux kernel device driver to DMA from a device into user-space memory
[英]Linux kernel device driver to DMA into kernel space
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]);
问题4 :将这个用户空间送到用户空间的最佳方式是什么?
copy_to_user
? kmalloc确实是获取缓冲区的一个来源。 另一个可以是带有GFP_DMA标志的alloc_page。
意思是kmalloc返回的内存保证在物理内存中连续,而不仅仅是虚拟内存,因此您可以将该指针的总线地址提供给您的硬件。 你需要在返回的地址上使用dma_map_single(),这取决于确切的平台可能不再是virt_to_bus的包装,或者可以执行更多操作(设置IOMMU或GART表)
正确,只需确保遵循缓存一致性指南,如DMA指南所述。
copy_to_user将正常工作,是最简单的答案。 根据您的具体情况,它可能就足够了,或者您可能需要具有更好性能的东西。 您不能正常地将kmalloced地址映射到用户空间,但您可以DMA到用户提供的地址(一些警告适用)或分配用户页面(alloc_page with GFP_USER)
祝好运!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.