我将一个大型代码库移植到Linux内核设备驱动程序中。 ASIC使用大量的DMA通道。
kmalloc内存与GFP_KERNEL|GFP_DMA
。 在启动DMA之前,我使用dma_map_single来获取硬件(物理)内存地址以供给硬件。 (也做一个刷新/无效的内存从dcache?)我有时需要CPU访问数据一旦DMA完成,但不经常。 在通过代码访问数据之前,我使用dma_unmap_single来避免caching一致性问题。
在我不需要CPU访问的情况下,是否还需要调用dma_unmap_single
? 我应该dma_unmap_single
每个指针我dma_map_single
? dma_map_single
是否消耗dma_unmap_single
将释放的资源(例如,表格条目)?
DMA-API.txt在良好的DMA存储器卫生方面并不明确。
谢谢!
用dma_map_single
映射DMA传输的内存。 你得到的物理指针的内存,所以设备可以DMA的地址。
用dma_unmap_single
你可以取消映射上面映射的内存。 当你的转账结束后,你应该这样做。
您可以映射内存区域,并将其用于多个DMA传输,然后在作业完成时取消映射 。 每次要访问DMA存储器时,都必须对其进行同步。 如果设备要访问内存,则应该执行dma_sync_single_for_device
; 它主机要访问内存,你应该做的dma_sync_single_for_cpu
dma_map api可能会分配反弹缓冲区,在这种情况下,您将需要调用dma_unmap函数。