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