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

Caching CPUECTLR.SMPEN、缓存和MMU之间的关系,caching,arm,mmu,Caching,Arm,Mmu,我正在阅读ARM文档(ARM®Cortex®-A57 MPCore处理器),并查看以下关于 在启用缓存和MMU或执行任何指令缓存或TLB维护操作之前,必须将CPUECTLR.SMPEN设置为1 CPUECTLR.SMPEN用于: 使处理器能够从群集中的其他处理器接收指令缓存和TLB维护操作广播。 在启用缓存和MMU或执行任何缓存和TLB维护操作之前,必须设置此位。 在处理器断电序列中,必须清除此位 但是,我仍然不清楚真正的原因(即,为什么我们应该在启用缓存和MMU之前将CPUECTLR.SMPE

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

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

CPUECTLR.SMPEN用于:

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


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

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

如果不设置它,内核执行的任何TLB或缓存维护操作都只会影响该内核,并且它不会知道其他内核也会这样做,也不会知道其他内核的专用缓存中的数据-在所有内核都在同一内存区域上运行的SMP系统上,这通常会导致数据损坏和灾难

假设每个人都启用了MMU和缓存,core A将重新映射某个内存页-它将零写入PTE,使该VA的TLB无效,然后写入更新的PTE。core B还可以为该VA设置TLB条目:除非TLBI被广播,否则core B不会意识到该VA的条目不再有效,并且可能读取虚假数据,或者更糟糕的是,由于旧物理页面可能已被重新用于其他用途,因此会损坏该页面

好的,也许core B的TLB中没有缓存该地址,但在更新后访问它,并开始页表遍历。如果没有,这有几个方面:

  • 核心B碰巧将页表缓存在其L1中;除非它能窥探核心A的L1,知道其他人现在有一个该行的脏副本,并且它自己的副本现在无效,否则它将读取陈旧的旧PTE并出错
  • 核心B没有在L1缓存页表;除非它能连贯地窥探到内核A的L1中的脏线,否则读取的数据将被输出到L2或主存,命中陈旧的PTE并出错
  • Core B没有在L1缓存页表,但Core A的第一次写入已经传播到L2或更远的地方;除非核心B的读操作可以窥探到核心A的L1的第二次写操作,否则它将从L2读取中间无效PTE并发生故障
  • Core B没有在L1缓存页表,但Core A的两次写入都已传播到L2或更远的地方;核心B的读取命中了L2中的新PTE,一切都按照预期工作,这纯属偶然
现在,在某些情况下,您可能不希望出现这种情况-在非对称多处理中,两个内核可能在做完全不相关的事情,运行不同的操作系统,并在不同的内存区域工作,不在后台进行不必要的一致性聊天可能有一点好处——在极少数情况下,内核可能希望在后台彼此通信,它们可能会通过处理器间中断和特定的未缓存内存共享区域来实现。但是,对于SMP,您确实希望在核心有机会开始实际分配缓存线和TLB条目之前,它们彼此了解,并成为同一个一致性域的一部分,这正是为什么所有广播和一致性机制的控制都包含在一个名为“SMP enable”的位中的原因


为了详细说明实际进入和退出一致性,当进入时,您希望确保您的整个数据缓存无效,以避免冲突条目-如果CPU进入SMP时,其缓存中已存在有效行,用于其他CPU一致性缓存中的行所拥有的地址,则一致性协议被破坏,数据丢失/损坏随之发生。相反,当脱机时,CPU必须保证其缓存是干净的,以避免数据丢失-它可以通过禁用其缓存/MMU来防止自己弄脏更多的条目,但它还必须退出一致性,以防止脏线从后面的其他CPU传入。只有这样,在断电时内容丢失之前,才能安全地执行清除整个本地缓存所需的set/way操作。

非常有价值的信息。我仍然有两个问题:1)在数据表中“在处理器断电序列中必须清除此位”。你能解释一下吗?我还读了另一篇关于SMP启用位的文章。如果您能帮助我理解为什么未设置SMP启用位时PC和LR为零,我将不胜感激。文章链接:谢谢。“如果SMP启用位未设置,PC和LR为零”-不,这只是数据损坏的表现。任务从CPU A重新调度到CPU B,然后返回到CPU A。随后,它执行类似于
ldrx30[sp];ret
,在CPU a的TLB中找到了一个过时的条目(因为在CPU B上运行时重新映射了某些内容,但缺少SMP意味着CPU a没有看到广播TLBI),这导致了错误的物理页,碰巧从那里读取了零作为其返回地址,然后发生了爆炸。感谢您的回答,这是非常合理的。