- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
在启用了 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/
我正在将大型代码库移植到 Linux 内核设备驱动程序。 ASIC 使用大量的 DMA channel 。 我使用 GFP_KERNEL|GFP_DMA 分配内存。在启动 DMA 之前,我使用 dma
我试图了解 ARM 架构上的 DMA 内部结构,引用内核文档:http://lxr.free-electrons.com/source/Documentation/DMA-API-HOWTO.txt
在启用了 IOMMU 的系统中,有什么区别-dma_alloc_coherent或者kalloc 后跟 dma_map_single。 我对此很困惑 最佳答案 dma_alloc_coherent()
我是一名优秀的程序员,十分优秀!