【问题标题】:relationship between CPUECTLR.SMPEN, caches and MMUCPUECTLR.SMPEN、缓存和MMU之间的关系
【发布时间】:2016-04-19 04:34:35
【问题描述】:

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

的描述

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

CPUECTLR.SMPEN 用于:

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

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

【问题讨论】:

    标签: caching arm mmu


    【解决方案1】:

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

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

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

    好的,也许核心 B 没有在其 TLB 中缓存该地址,但在更新后访问它,并开始页表遍历。没有cache coherency,这有几种方式:

    • Core B 恰好在其 L1 中缓存了页表;除非它可以窥探核心 A 的 L1 以知道其他人现在拥有该行的脏副本并且它自己的副本现在无效,否则它将读取陈旧的旧 PTE 并出错。
    • Core 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 中传入。只有这样才能安全地执行必要的设置/方式操作以在掉电时内容丢失之前清理整个本地缓存。

    【讨论】:

    • 非常有价值的信息。我还有两个问题:1)在数据表中“您必须在处理器断电序列期间清除此位”。能稍微解释一下吗?
    • 我还阅读了另一篇关于 SMP 启用位的文章。如果没有设置 SMP 启用位,如果您能帮助我理解为什么 PC 和 LR 为零,我们将不胜感激。该文章的链接:lkml.org/lkml/2014/4/14/229 谢谢。
    • “如果未设置 SMP 启用位,PC 和 LR 为零” - 不,这仅仅是数据损坏的表现。任务从 CPU A 重新调度到 CPU B,然后返回到 CPU A。随后,它执行类似ldr x30, [sp]; ret 的操作,在 CPU A 的 TLB 中命中一个陈旧条目(因为在 CPU B 上运行时重新映射了某些内容,但缺少的 SMP 意味着 CPU A 没有看到广播 TLBI)现在导致错误的物理页面,碰巧从那里读取零作为其返回地址,然后爆炸。
    • 感谢您的回答,非常合理。
    猜你喜欢
    • 2019-09-13
    • 2019-10-14
    • 1970-01-01
    • 2020-03-18
    • 2019-04-26
    • 1970-01-01
    • 2015-07-17
    • 1970-01-01
    • 2023-03-14
    相关资源
    最近更新 更多