C 用于DMA的快速mmaped内存缓冲区

C 用于DMA的快速mmaped内存缓冲区,c,memory,dma,C,Memory,Dma,我目前正在为DMA开发一个linux驱动程序。 驱动程序使用dma\u alloc\u coherent分配一个内存区域,我使用\u dma\u mmap\u id=(int*)mmap(NULL,缓冲区大小,PROT\u READ,PROT\u WRITE,map\u SHARED,\u dma\u device\u id,0)将其映射到用户空间。在用户空间中,我对该区域进行写入和读取,并触发DMA传输 但是,我注意到写入mmaped区域的速度非常慢(约100MB/s)。 因此,我寻求加速这一

我目前正在为DMA开发一个linux驱动程序。 驱动程序使用
dma\u alloc\u coherent
分配一个内存区域,我使用
\u dma\u mmap\u id=(int*)mmap(NULL,缓冲区大小,PROT\u READ,PROT\u WRITE,map\u SHARED,\u dma\u device\u id,0)将其映射到用户空间。在用户空间中,我对该区域进行写入和读取,并触发DMA传输

但是,我注意到写入mmaped区域的速度非常慢(约100MB/s)。 因此,我寻求加速这一进程的方法

我试图分配非相干内存(使用
kmalloc
dma\u alloc\u noncohcerent
)用于测试目的(只是为了看看这是否会加速内存访问),但在这些情况下,我无法分配的内存量非常有限(例如
kmalloc
为4MB),这比我在一次DMA访问中要传输的内存量要小

因此,我不确定有哪些可能的替代方案可以带来更高的性能

  • 是否有可能将数据复制到比
    memcpy
    更快的区域
  • 是否可以分配更大的缓存内存区域?使用
    dma\u alloc\u coherent
    我可以分配高达64 MB的内存-为什么这比使用
    kmalloc
    可以分配的内存大这么多
  • 什么是替代方法
目前,将数据传输到mmaped区域是我的应用程序中的瓶颈

致以最良好的祝愿,
Apo

您使用的是什么体系结构?如果您使用的是AMRv7 dma_alloc_相干分配未缓存的内存,那么这就是最终的性能损失

我已经使用了“dma_alloc_coherent”,但不幸的是,从“正常”内存到未缓存内存的传输非常缓慢。