【问题标题】:Cache coherence issues in a DMA contextDMA 上下文中的缓存一致性问题
【发布时间】:2012-04-25 17:41:55
【问题描述】:

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

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

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

【问题讨论】:

  • 在“旧日”部分内存在操作系统设置 DMA 请求之前被标记为不可缓存。为什么您认为在您概述的情况下没有发生或不可能发生?
  • @gbulmer 你的意思是DMA请求只能处理不可缓存的内存区域?

标签: c linux memory memory-management cache-control


【解决方案1】:

DMA 电路通常直接与主存储器一起工作,而不涉及 CPU(这是主要思想,将 CPU 从硬件其他地方可以完成的 I/O 中解放出来,从而节省 CPU 周期)。所以,你可能确实会遇到cache coherency problems。微软推荐flushing I/O buffers when using DMA

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

【讨论】:

    【解决方案2】:

    我能想到三种方法:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-10-31
      • 2011-10-22
      • 1970-01-01
      • 1970-01-01
      • 2020-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多