dma_alloc_coherent和kalloc + dma_map_single之间的区别

时间:2018-12-17 17:28:19

标签: linux linux-kernel linux-device-driver

在启用了IOMMU的系统中,两者之间有什么区别 -dma_alloc_coherent 要么 kalloc之后是dma_map_single。

我对此感到困惑

1 个答案:

答案 0 :(得分:1)

如果您的内核程序只需要分配一个DMA缓冲区并继续使用直到程序退出,则

dma_alloc_coherent()可以很好地工作。它通过在从DMA缓冲区读取CPU(您的程序)或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区域。