CPUECTLR.SMPEN,缓存和MMU之间的关系

时间:2016-01-14 00:27:28

标签: caching arm mmu

我正在阅读ARM文档(ARM®Cortex®-A57 MPCore处理器)并查看以下有关

的说明

在启用缓存和MMU之前,必须将CPUECTLR.SMPEN设置为1,或者执行任何指令缓存或TLB维护操作。

CPUECTLR.SMPEN用于:

使处理器能够接收从群集中的其他处理器广播的指令缓存和TLB维护操作。 必须在启用高速缓存和MMU之前设置此位,或执行任何高速缓存和TLB维护操作。 您必须在处理器断电序列期间清除该位。

但是,我仍然不清楚真正的原因(即,为什么我们应该在缓存和MMU启用之前将CPUECTLR.SMPEN设置为1)。请帮帮我。感谢。

1 个答案:

答案 0 :(得分:0)

简单地说,SMPEN基本上控制核心是否参与一致性协议。

如果没有设置,核心执行的任何TLB或缓存维护操作只会影响核心,并且它不会知道其他核心做同样的事情,也不会知道其他核心中的数据“私有缓存 - 在SMP系统上,所有核心都在相同的内存区域运行,这通常是数据损坏和灾难的一种方法。

假设每个人都启用了MMU和缓存,并且核心A重新映射了一些内存页 - 它将零写入PTE,使其VAB的TLB无效,然后写入更新的PTE。核心B也可以为该VA提供TLB条目:除非TLBI是广播的,否则核心B将不会意识到它对该VA的条目不再有效,并且可能会读取虚假数据或更糟糕地破坏旧的物理页面它可能已被重用于其他东西。

好吧,也许核心B没有在其TLB中缓存该地址,但是在更新后访问它并启动页面表行走。没有cache coherency,这有几个方面:

  • 核心B碰巧将页面表缓存在其L1中;除非它可以窥探核心A的L1,知道其他人现在拥有该行的脏副本,而且它自己的副本现在无效,它将会读取陈旧的旧PTE并出错。
  • 核心B没有在L1处缓存的页面表;除非它能够从核心A的L1中连贯地窥探脏线,否则读取到L2或主存储器,击中陈旧的旧PTE并出错。
  • 核心B没有在L1缓存的页面表,但核心A的第一次写入已经传播到L2或更远;除非核心B的读取可以窥探来自核心A的L1的第二次写入,否则它会从L2读取中间无效的PTE并发生故障。
  • 核心B没有在L1处缓存的页表,但核心A的写入都已经传播到L2或更远;核心B的读取命中L2中的新PTE,一切都按照预期纯粹的机会工作。

现在,在某些情况下,您可能不希望这样 - 在非对称多处理中,两个核心可能正在执行完全不相关的事情,运行不同的操作系统,以及在不同的区域中工作内存,在后台不进行不必要的一致性聊天可能会带来一些好处 - 在极少数情况下,内核可能希望在那里相互通信,他们可能会通过处理器间中断和特定内容来实现这一点。共享的未缓存内存区域。但是对于SMP,你真的希望核心相互了解并成为相同的一致性域的一部分之前他们有机会开始实际分配缓存行和TLB条目,这正是为什么所有广播和一致性机制的控制都包含在一个有点模糊的“SMP启用”位中。

要详细说明实际进入和退出一致性,进入时要确保整个数据缓存无效以避免冲突条目 - 如果CPU进入SMP,其缓存中已有有效行已存在于行所拥有的地址中其他CPU的连贯缓存,一致性协议被破坏,数据丢失/损坏随之而来。相反,当脱机时,CPU必须保证其缓存是干净的以避免数据丢失 - 它可以通过禁用其缓存/ MMU来阻止本身弄脏任何更多的条目,但它也必须退出一致性到防止脏线从其后面的其他 CPU传输。只有这样才能安全地执行清理整个本地缓存所需的设置/方式操作,然后才能在断电时丢失内容。