- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在将大型代码库移植到 Linux 内核设备驱动程序。 ASIC 使用大量的 DMA channel 。
我使用 GFP_KERNEL|GFP_DMA
分配内存。在启动 DMA 之前,我使用 dma_map_single 获取硬件(物理)内存地址以提供给硬件。 (还有刷新/使 dcache 中的内存无效吗?)一旦 DMA 完成,我有时需要 CPU 访问数据,但不经常。在通过代码访问数据之前,我执行 dma_unmap_single 以避免缓存一致性问题。
在我不需要 CPU 访问的情况下,我还需要调用 dma_unmap_single
吗?我应该 dma_unmap_single
dma_map_single
中的每个指针吗? dma_map_single
是否消耗了 dma_unmap_single
将释放的资源(例如,表条目)?
DMA-API.txt 并不清楚良好的 DMA 内存卫生。
谢谢!
最佳答案
使用 dma_map_single
,您可以为 DMA 传输映射内存。您获得指向内存的物理指针,因此设备可以通过 DMA 访问该地址。
使用dma_unmap_single
取消映射上面映射的内存。您应该在传输结束后执行此操作。
您可以映射一个内存区域,并将其用于多个 DMA 传输,然后在工作完成后取消映射。每次要访问 DMA 内存时,都必须同步它。如果设备要访问内存,你应该做dma_sync_single_for_device
;如果主机要访问内存,您应该执行 dma_sync_single_for_cpu
关于linux - 是否每个 dma_map_single 调用都需要相应的 dma_unmap_single?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16172118/
我有一种情况需要在 dma_sync_single_for_cpu 之后调用 dma_unmap_single。以下是我的场景。 使用 kmalloc() 为缓冲区分配内存 使用 dma_map_si
我正在将大型代码库移植到 Linux 内核设备驱动程序。 ASIC 使用大量的 DMA channel 。 我使用 GFP_KERNEL|GFP_DMA 分配内存。在启动 DMA 之前,我使用 dma
我是一名优秀的程序员,十分优秀!