2012-04-13 77 views
1

假设CPU修改位置x + 50中的值并且不将其刷新回主内存(写回)。DMA环境中的高速缓存一致性问题

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

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

+0

在操作系统设置DMA请求之前,'过去的日子'内存的一部分被标记为不可缓存。为什么你认为在你列出的情况下没有发生或不能发生? – gbulmer 2012-04-13 11:27:16

+0

@gbulmer你的意思是一个DMA请求只能处理无法访问的内存区域? – sliter 2012-04-13 11:32:00

回答

1

的DMA电路往往与主存储器直接运行而不涉及CPU(这是主要的想法,以摆脱做I/O可以在硬件其他地方,从而完成节省CPU周期的CPU)。所以,你可能会碰到cache coherency problems。 Microsoft建议使用flushing I/O buffers when using DMA

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

1

有三种方法我能想到的:

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

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

确保过程未运行时,在多任务操作系统过于怪异,如DMA由一个进程所拥有的内存可能是由过程做一个系统调用,例如触发一个写。可以取消进程并运行其他进程,直到DMA完成。

这可能是过多的约束,以等待I/O设备来完成的,所以DMA控制器可能被复制从进程地址空间到辅助缓冲器中。

所以,如果你有这个地方已经发生的情况下,请简要说明的例子,你已经运行测试。