4

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

同时,设备从 x 到 x+100 发起 DMA 读取请求。

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

4

2 回答 2

2

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

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

于 2012-04-13T11:32:15.410 回答
1

我能想到的方法有以下三种:

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

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

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

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

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

于 2012-04-13T11:40:47.650 回答