Caching 使用内存映射I/O管理缓存

Caching 使用内存映射I/O管理缓存,caching,memory,memory-management,operating-system,memory-barriers,Caching,Memory,Memory Management,Operating System,Memory Barriers,我有一个关于内存映射io的问题。 假设有一个内存映射IO外设,其值由CPU读取。读取后,该值存储在缓存中。但内存中的值已由外部IO外围设备更新。 在这种情况下,CPU将如何确定缓存已失效,这种情况下的解决方法是什么?这与平台密切相关。实际上,有两种不同的情况 大小写#1.内存映射外围设备。这意味着对某些物理内存地址范围的访问被路由到外围设备。没有涉及实际的RAM。例如,为了控制缓存,x86具有MTRR(“内存类型范围寄存器”)和PAT(“页面属性表”)。它们允许在特定范围的物理内存上设置缓存模式

我有一个关于内存映射io的问题。 假设有一个内存映射IO外设,其值由CPU读取。读取后,该值存储在缓存中。但内存中的值已由外部IO外围设备更新。
在这种情况下,CPU将如何确定缓存已失效,这种情况下的解决方法是什么?

这与平台密切相关。实际上,有两种不同的情况

大小写#1.内存映射外围设备。这意味着对某些物理内存地址范围的访问被路由到外围设备。没有涉及实际的RAM。例如,为了控制缓存,x86具有MTRR(“内存类型范围寄存器”)和PAT(“页面属性表”)。它们允许在特定范围的物理内存上设置缓存模式。在正常情况下,映射到RAM的内存范围是可写回缓存的,而映射到外围设备的内存范围是不可缓存的。第11.3节“可用的缓存方法”中描述了不同的缓存策略。所以,当您向内存映射的外围设备发出读或写请求时,CPU缓存被绕过,请求直接发送到设备

案例2.DMA。它允许外围设备异步访问RAM。在这种情况下,DMA控制器和任何CPU都没有区别,并且平等地参与缓存一致性协议。来自外围设备的写请求被其他CPU的缓存看到,缓存线要么失效,要么用新数据更新。读请求也被其他CPU的缓存看到,数据从缓存返回,而不是从主RAM返回。(这只是一个示例:实际实现取决于平台。例如,SoC通常不保证外围CPU的强缓存一致性。)

在这两种情况下,缓存问题也存在于编译器级别:编译器可能在寄存器中缓存数据值。这就是为什么编程语言有一些禁止这种优化的方法:例如,C中的
volatile
关键字