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