在启用了IOMMU的系统中,两者之间有什么区别 -dma_alloc_coherent 要么 kalloc之后是dma_map_single。
我对此感到困惑
答案 0 :(得分:1)
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区域。