2016-05-16 108 views
2

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

但是,我注意到写入mmaped区域非常缓慢(〜100MB/s)。 因此,我寻找加快这一点的方法。

我试图分配非相干存储器(使用kmallocdma_alloc_noncoherent)用于测试目的(只是为了看看是否这加速了存储器存取),但在这些情况下的内存我卡恩分配量是非常有限的(例如,对于kmalloc,为4MB),这比我要在单个DMA访问中传输的内存量要小。

所以我不确定什么是可能的选择,可能会导致更高的性能。

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

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

最好的问候, 阿婆

+0

看看巨大的页面 – stark

回答

1

您正在使用什么架构?如果您使用的是AMRv7,则dma_alloc_coherent会分配未缓存的内存,这是最终的性能提升。

+0

我已经使用了lma_alloc_coherent',但不幸的是,从“正常”内存转移到非缓存非常缓慢。 – Apoptose