Linux dma#alloc#u相干和kalloc#x2B之间的差异;dma_映射_单个

Linux dma#alloc#u相干和kalloc#x2B之间的差异;dma_映射_单个,linux,linux-kernel,linux-device-driver,Linux,Linux Kernel,Linux Device Driver,在启用IOMMU的系统中,两者之间的区别是什么 -dma_alloc_相干 或 kalloc后跟dma\u map\u single 如果您的内核程序只需要分配一个dma缓冲区并一直使用它直到程序退出,我对此感到困惑。它通过在CPU(您的程序)或DMA控制器从DMA缓冲区读取之前刷新缓存来确保一致性,因此您在读取/写入DMA缓冲区之前不必太注意“同步”CPU/cache/DMA控制器。唯一让我恼火的是,您需要跟踪物理地址dma\u addr\u t、缓冲区地址和分配的大小,以便以后可以dma\u

在启用IOMMU的系统中,两者之间的区别是什么 -dma_alloc_相干 或 kalloc后跟dma\u map\u single

如果您的内核程序只需要分配一个dma缓冲区并一直使用它直到程序退出,我对此感到困惑。它通过在CPU(您的程序)或DMA控制器从DMA缓冲区读取之前刷新缓存来确保一致性,因此您在读取/写入DMA缓冲区之前不必太注意“同步”CPU/cache/DMA控制器。唯一让我恼火的是,您需要跟踪物理地址dma\u addr\u t、缓冲区地址和分配的大小,以便以后可以
dma\u free\u coherent()
正确地执行它

dma\u-map\u-single()/dma\u-unmap\u-single()
是流API,在每次调用dma控制器时都使用dma缓冲区的情况下,应该比
dma\u-alloc\u-coherent()
具有更好的性能。虽然我没有看到它们之间有任何显著的性能差异。您应该使用
dma\u sync\u single\u for_device()/dma\u sync\u single\u for_cpu()
来确保一致性


在某些情况下,
dma\u map\u single()
优于
dma\u alloc\u coherent()
。在我的一个项目中,DMA函数必须将分配的缓冲区(由
kzalloc()/kmalloc()
分配)作为调用者的参数,并将其映射到DMA区域。在这种情况下,我无法控制如何以及何时分配/释放缓冲区,但只能使用
DMA\u map\u single()/DMA\u unmap\u single()

将其映射到DMA区域。如果重用缓冲区,则无需经常映射取消映射,同步API就是用于此目的的。