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

4

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

1个回答

6

这强烈依赖于平台。实际上,存在两种不同的情况。

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

案例#2. DMA。它允许外围设备异步访问RAM。在这种情况下,DMA控制器与任何CPU没有区别,并且同样参与高速缓存一致性协议。外围的写请求被其他CPU的缓存看到,并且缓存行被无效或更新为新数据。读请求也被其他CPU的缓存看到,并且数据从缓存返回而不是从主RAM返回。(这只是一个示例:实际实现取决于平台。例如,SoC通常不能保证强缓存一致性外围<-> CPU。)
在两种情况下,缓存问题也存在于编译器级别:编译器可能会将数据值缓存在寄存器中。这就是为什么编程语言具有一些禁止此类优化的手段的原因:例如,在C中使用volatile关键字。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接