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