用于DMA

时间:2016-05-16 16:39:53

标签: c memory dma

我正在为DMA开发一个Linux驱动程序。 驱动程序使用dma_alloc_coherent分配内存区域,我使用_dma_mmap_id = (int*) mmap(NULL, buffer_size, PROT_READ | PROT_WRITE, MAP_SHARED, _dma_device_id, 0);映射到用户空间。在用户空间中,我写入并读取该区域并触发DMA传输。

然而,我注意到写入mmaped区域非常慢(~100MB / s)。 因此,我寻找加速这种方法的方法。

我尝试分配非连贯内存(使用kmallocdma_alloc_noncoherent)用于测试目的(只是为了查看这是否加速了内存访问),但在这些情况下内存量我可以分配的非常有限(例如,kmalloc为4MB),这小于我将在单个DMA访问中传输的内存量。

所以我不确定哪些可能的替代方案可能会带来更高的性能。

  • 是否有可能将数据复制到速度超过memcpy
  • 的区域
  • 是否可以分配更大的缓存内存区域?使用dma_alloc_coherent我可以分配最多64 MB - 为什么这比使用kmalloc分配的内存大得多?
  • 有哪些替代方法?

目前,将数据传输到mmaped区域是我应用程序的瓶颈。

祝你好运, APO

1 个答案:

答案 0 :(得分:1)

您使用的是哪种架构?如果您正在使用AMRv7,则dma_alloc_coherent会分配未缓存的内存,这是最终的性能影响。