在DMA上下文中缓存一致性问题

时间:2012-04-13 10:52:44

标签: c linux memory memory-management cache-control

假设CPU修改了位置x + 50中的值,并且没有将其刷回主存储器(回写)。

同时,设备启动从x到x + 100的DMA读取请求。

在这种情况下,如何通知CPU刷新脏缓存行?

2 个答案:

答案 0 :(得分:2)

DMA电路通常直接与主存储器配合工作,而不涉及CPU(这是主要的想法,使CPU免于执行可在硬件中的其他地方完成的I / O,从而节省CPU周期)。所以,你可能会遇到cache coherency problems。 Microsoft建议flushing I/O buffers when using DMA

但有些系统确实支持CPU和DMA电路之间的缓存一致性协议,就像多处理器系统中的CPU之间一样。最终的答案取决于实际的硬件。

答案 1 :(得分:1)

我可以想到三种方法:

  1. 内存被标记为不可缓存,
  2. DMA控制器与缓存控制器协调,
  3. 操作系统保证永远不会发生这种情况,例如:通过确保进程的CPU部分没有运行。
  4. 这取决于硬件和操作系统的功能。

    确保进程未运行在多任务操作系统上并不太奇怪,因为进程拥有的内存上的DMA很可能是由进行系统调用的进程触发的,例如,写。可以取消该进程,并运行其他进程,直到DMA完成。

    等待I / O设备完成可能有太大的限制,因此DMA控制器可能正在从进程地址空间复制到辅助缓冲区。

    因此,如果您遇到过这种情况,请概述示例以及您运行的测试。