假设 CPU 修改了位置 x+50 中的值并且不将其刷新回主存(回写)。
同时,设备从 x 到 x+100 发起 DMA 读取请求。
在那种情况下,如何通知 CPU 刷新脏缓存行?
假设 CPU 修改了位置 x+50 中的值并且不将其刷新回主存(回写)。
同时,设备从 x 到 x+100 发起 DMA 读取请求。
在那种情况下,如何通知 CPU 刷新脏缓存行?
DMA 电路通常直接与主存储器一起工作,而不涉及 CPU(这是主要思想,将 CPU 从硬件其他地方可以完成的 I/O 中解放出来,从而节省 CPU 周期)。因此,您可能确实会遇到缓存一致性问题。Microsoft 建议在使用 DMA 时刷新 I/O 缓冲区。
但有些系统确实支持 CPU 和 DMA 电路之间的高速缓存一致性协议,就像多处理器系统中的 CPU 之间一样。最终答案取决于实际的硬件。
我能想到的方法有以下三种:
这取决于硬件和操作系统的功能。
确保进程没有运行在多任务操作系统上并不太奇怪,因为进程拥有的内存上的 DMA 可能是由进程执行系统调用(例如写入)触发的。该进程可以取消调度,并运行其他进程,直到 DMA 完成。
等待 I/O 设备完成可能会受到太多限制,因此 DMA 控制器可能正在从进程地址空间复制到辅助缓冲区。
因此,如果您遇到这种情况,请概述示例以及您运行的测试。