gpt4 book ai didi

linux - dma_alloc_coherent 和 kalloc+dma_map_single 的区别

转载 作者:太空宇宙 更新时间:2023-11-04 10:04:10 24 4
gpt4 key购买 nike

在启用了 IOMMU 的系统中,有什么区别-dma_alloc_coherent或者kalloc 后跟 dma_map_single。

我对此很困惑

最佳答案

dma_alloc_coherent() 如果您的内核程序只需要分配一个 DMA 缓冲区并继续使用它直到程序退出,则效果很好。它通过在 CPU(您的程序)或 DMA Controller 从 DMA 缓冲区读取之前刷新缓存来确保一致性,因此您在读/写 DMA 缓冲区之前不必太注意“同步”CPU/缓存/DMA Controller 。唯一让我烦恼的是,您需要跟踪物理地址 dma_addr_t、缓冲区地址和分配的大小,以便稍后可以正确地dma_free_coherent()

dma_map_single()/dma_unmap_single() 是流 API,并且应该比 dma_alloc_coherent() 具有更好的性能,以防每次调用都单独使用 DMA 缓冲区DMA Controller 。尽管我没有看到它们之间有任何显着的性能差异。并且您应该使用 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 区域。

关于linux - dma_alloc_coherent 和 kalloc+dma_map_single 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53820253/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com