cachingDMA环境中的一致性问题

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

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

在这种情况下,如何通知CPU刷新脏caching线?

DMA电路通常直接与主存储器一起工作,而不涉及CPU(这是主要思想,将CPU从I / O中解放出来,从而可以在硬件的其他地方完成,从而节省CPU周期)。 所以,你可能会遇到缓存一致性问题 。 Microsoft建议在使用DMA时刷新I / O缓冲区 。

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

我能想到的有三种方法:

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

这取决于硬件和操作系统的功能。

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

等待I / O设备完成可能是一个太多的限制,所以DMA控制器可能会将进程地址空间复制到辅助缓冲区。

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