1

我有一个 arm cortex-a9 四核设备,我正在编写一个多进程应用程序。这些进程共享相同的输入源——它们都使用 mmap() 调用访问的 DMA 缓冲区。

我注意到进程访问 DMA 内存所需的时间比我将输入源更改为正常分配的缓冲区(即使用 malloc 分配)所需的时间要长得多。

我理解为什么 DMA 缓冲区必须是不可缓存的,但是,因为我有能力确定缓冲区何时稳定(硬件未更改,大多数情况下都是如此)或脏(数据已更改)我想如果我将内存区域设为临时可缓存,我可能会获得显着的速度提升。

有没有办法做到这一点?

我目前正在使用这条线来映射内存:

void *buf = mmap(0, size, PROT_READ | PROT_WRITE,MAP_SHARED, fd, phy_addr);

谢谢!

4

1 回答 1

1

大多数现代 CPU 使用窥探来确定是否/何时必须将缓存行刷新到内存或标记为无效。在此类 CPU 上,“DMA 缓冲区”与kmalloc()缓冲区相同。当然,这假设 snoop 功能正常工作并且操作系统利用了 snoop 功能。如果您发现对 DMA 和非 DMA 内存区域的访问存在差异,那么我只能假设您的 CPU 要么没有缓存侦听功能(查看 CPU 文档),要么没有使用该功能,因为它不起作用(查看 CPU 勘误表) )。

您提出的方法存在的问题:

  1. 你知道什么时候应该将内存区域改回不可缓存的吗?
  2. 更改内存区域的 MMU 设置并不总是微不足道的(取决于 CPU),我不确定您的操作系统中是否存在用于更改此类设置的 API。
  3. 即使可能,更改内存区域的 MMU 设置也是有风险的,并且此类更改必须与您的 DMA 操作仔细同步,否则实际上可以保证数据损坏。

kmalloc()鉴于所有这些重大问题,我建议更好的方法是在检测到 DMA 缓冲区已更新时将数据从 DMA 缓冲区复制到缓冲区。

于 2013-06-10T20:13:33.290 回答