用于 DMA 的快速映射内存缓冲区

Posted

技术标签:

【中文标题】用于 DMA 的快速映射内存缓冲区【英文标题】:Fast mmaped memory buffer for DMA 【发布时间】:2016-09-12 12:56:42 【问题描述】:

我目前正在为 DMA 开发 linux 驱动程序。 驱动程序使用dma_alloc_coherent 分配内存区域,我使用_dma_mmap_id = (int*) mmap(NULL, buffer_size, PROT_READ | PROT_WRITE, MAP_SHARED, _dma_device_id, 0); 将其映射到用户空间。在用户空间中,我对该区域进行读写操作并触发 DMA 传输。

但是,我注意到写入映射区域的速度非常慢(~100MB/s)。 因此,我正在寻找加速这一过程的方法。

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

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

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

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

最好的问候, 载脂蛋白

【问题讨论】:

【参考方案1】:

您使用的是什么架构?如果您使用 AMRv7 dma_alloc_coherent 分配未缓存的内存,这是最终的性能损失。

【讨论】:

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

以上是关于用于 DMA 的快速映射内存缓冲区的主要内容,如果未能解决你的问题,请参考以下文章

Linux内存从0到1学习笔记(8.8 无限DMA Fence)

Linux内存从0到1学习笔记(8.8 无限DMA Fence)

javaNio 通道和缓冲区

STM32F429第二十七篇之DMA

STM32F429第二十七篇之DMA

Linux内存从0到1学习笔记(8.7 DMA-BUF代码解读)