我正在将大型代码库移植到 Linux 内核设备驱动程序。 ASIC 使用大量 DMA 通道。
我用kmalloc内存GFP_KERNEL|GFP_DMA
。在启动 DMA 之前,我使用 dma_map_single 获取硬件(物理)内存地址以提供给硬件。 (还会刷新/使 dcache 中的内存无效吗?)有时,在 DMA 完成后,我需要 CPU 访问数据,但这种情况并不常见。在通过代码访问数据之前,我执行 dma_unmap_single 以避免缓存一致性问题。
在我不需要 CPU 访问的情况下,我是否仍然需要调用dma_unmap_single
?我是不是该dma_unmap_single
每个指针我dma_map_single
? Does dma_map_single
消耗资源(例如表条目)dma_unmap_single
会释放吗?
DMA-API.txt 并不清楚良好的 DMA 内存卫生。
Thanks!
With dma_map_single
您映射内存以进行 DMA 传输。您获得了指向内存的物理指针,因此设备可以通过 DMA 访问该地址。
With dma_unmap_single
您取消映射上面映射的内存。您应该在转账结束后执行此操作。
You can map一个内存区域,并将其用于多个 DMA 传输,然后您unmap当工作完成时。每次想要访问 DMA 内存时,都必须对其进行同步。如果设备要访问内存,你应该这样做dma_sync_single_for_device
;如果主机要访问内存,你应该这样做dma_sync_single_for_cpu
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)