gpt4 book ai didi

c - 使 DMA 内存可临时缓存

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:03:20 26 4
gpt4 key购买 nike

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

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

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

有办法吗?

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

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

谢谢!

最佳答案

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

您提出的方法存在问题:

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

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

关于c - 使 DMA 内存可临时缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17029405/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com