dma_alloc_coherent和kalloc+dma_map_single的区别

3
在启用IOMMU的系统中,dma_alloc_coherent和kalloc后跟dma_map_single有什么区别?我很困惑。
1个回答

4

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区域。


如果您重複使用緩衝區,則通常不需要進行映射取消映射操作,同步API就是為此而設。 - 0andriy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接