我对内存映射io有疑问。 假设有一个内存映射IO外设,其值由CPU读取。读取后,该值将存储在缓存中。但内存中的值已由外部IO外设更新。 在这种情况下,CPU如何确定缓存已失效,以及这种情况的解决方法是什么?
答案 0 :(得分:3)
这是强烈依赖平台的。实际上,有两种不同的情况。
案例#1。内存映射外设。这意味着对某些物理内存地址的访问将路由到外围设备。没有涉及实际的RAM。例如,为了控制缓存,M86具有MTRR(“存储器类型范围寄存器”)和PAT(“页面属性表”)。它们允许在特定范围的物理内存上设置缓存模式。在正常情况下,映射到RAM的内存范围是可写回缓存,而映射到外围设备的内存范围是不可缓存。 Intel's system programming guide,11.3“可用缓存方法”中描述了不同的缓存策略。因此,当您向内存映射外设发出读取或写入请求时,会绕过CPU缓存,并且请求将直接发送到设备。
案例#2。 DMA。它允许外围设备异步访问RAM。在这种情况下,DMA控制器与任何CPU没有区别,并且同样参与缓存一致性协议。来自外围的写请求被其他CPU的高速缓存看到,并且高速缓存行无效或用新数据更新。其他CPU的缓存也可以看到读取请求,并且从缓存而不是从主RAM返回数据。 (这只是一个示例:实际实现取决于平台。例如,SoC通常不保证强大的高速缓存一致性外设< - > CPU。)
在这两种情况下,缓存问题也存在于编译器级别:编译器可能会将数据值缓存在寄存器中。这就是为什么编程语言有一些禁止这种优化的方法:例如,C中的volatile
关键字。