在启用IOMMU的系统中,dma_alloc_coherent和kalloc后跟dma_map_single有什么区别?我很困惑。
dma_alloc_coherent()
可以很好地分配DMA缓冲区并在程序退出之前一直使用它,通过在CPU(你的程序)或DMA控制器从DMA缓冲区中读取之前刷新缓存来确保一致性。因此,在读写DMA缓冲区之前,不需要过多关注“同步”CPU/缓存/DMA控制器。唯一让我烦恼的是,你需要跟踪物理地址dma_addr_t、缓冲区地址和分配大小,以便稍后正确地使用dma_free_coherent()
。
dma_map_single()/dma_unmap_single()
是流API,假设DMA缓冲区仅用于每次调用DMA控制器,应具有比dma_alloc_coherent()
更好的性能。尽管我没有看到它们之间有任何显着的性能差异。您应该使用dma_sync_single_for_device()/dma_sync_single_for_cpu()
自行确保一致性。
在某些情况下,dma_map_single()
优先于dma_alloc_coherent()
。在我的一个项目中,DMA函数必须接受调用者分配的缓冲区(由kzalloc()/kmalloc()
分配)作为参数,并将其映射到DMA区域。在这种情况下,我无法控制缓冲区何时以及如何分配/释放,但只能使用dma_map_single()/dma_unmap_single()
将其映射到DMA区域。