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

标签 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 传输。

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

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

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

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

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

最好的问候, 载脂蛋白

最佳答案

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

关于c - 用于 DMA 的快速映射内存缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37258940/

相关文章:

c - 使用 SQLite FTS4 的自动 OR 查询

memory - DMA 如何影响 CPU?

c - Borland C rand() 的实现

c - 带指针的开关盒

c - 识别gtk中滚动条的向上/向下移动

linux - 有没有我可以调用的命令来打印出 malloc 数据结构?

java - 如何处理JavaCPP避免数据复制?

android - Android-应用由于内存错误而崩溃

c - 如何使用 DMA 或不使用 DMA 在 ARM9 s3c2440 上访问以将数据从 io 传输到内存

opengl - 将缓冲内存映射指针传递给 glTex(Sub)Image2D。纹理上传是异步的吗?