【问题标题】:How to divide the L2 cache between the cores on a ARM Cortex-A7?如何在 ARM Cortex-A7 的内核之间划分 L2 缓存?
【发布时间】:2015-08-17 05:25:12
【问题描述】:

背景和目标

我想在运行 ARM Cortex-A7Olimex A20 Lime 平台上运行两个完全独立的应用程序。目标是将一个核心专用于每个应用程序。到目前为止,一切都很好。

现在我想通过以下方式在内核之间划分二级缓存:

       L2 cache (256KB)
---------------------------
|    CPU0    |    CPU1    |
|   (128KB)  |   (128KB)  |
---------------------------

因此,每个内核只能访问他的私有 128KB 二级缓存。

问题

如何在 ARM Cortex-A7 的内核之间划分二级缓存?

据我了解,在以前的 SoC 上,经常使用像 PL310 这样的外部缓存控制器。现在,Cortex-A15Cortex-A7 等较新的 SoC 使用集成缓存控制器。这个控制器以某种方式集成到 SCU 组件中。

我在CP15系统中发现了一些与缓存相关的寄存器,如CSSELR、CCSIDR、CLIDR等,甚至还有系统控制寄存器(SCTLR )。但是他们似乎都没有让我为每个核心配置一个大小。这还可以吗?

感谢您的帮助。

编辑

这里,独立应用程序实际上是指 Linux 操作系统。所以目标是将一个核心专用于一个操作系统。因此,每个操作系统都运行在(参见)下面的 单处理器 系统上。整个框架已经在运行,到目前为止一切顺利。

感谢我收到的答案,我现在明白,即使它们是不使用相同虚拟映射的独立操作系统,内核也可以使用 L2。实际上它确实与拥有自己的虚拟地址空间的 2 个进程相同。

但最后困扰我的是安全方面:

如果两个核心共享整个二级缓存,一个核心在技术上是否可以访问另一个核心的缓存数据?

参考文献

【问题讨论】:

  • 您这样做是为了解决什么问题?
  • 这可能取决于 L2 缓存 PL310 或 PL4xx 的配置,但正如 unixsmurf 所暗示的那样,它可能没有帮助。假设任务 1 受内存限制,任务 2 受 CPU 限制,那么您希望 L2 执行第一个任务。因此,尽管有可能(鉴于 L2 有不同的 AXI 总线接口),但它可能没有好处。可能有更好的方法可以让您努力使系统变得更好......
  • 想一想 - 两个操作系统实例可能会命中相同的缓存条目当且仅当它们访问相同的物理地址 - 如果访问两个不同的物理地址能够返回相同的数据,缓存将从根本上被破坏。如果您真的关心隔离,那么在板上运行带有 KVM 的 SMP Linux,然后运行固定到每个主机 CPU 的单核应用程序 VM。
  • 你在使用trustzone吗? L2 是 trustzone 感知的,并将尝试保持 L2-secure 锁定并且不被正常的世界 L2 活动驱逐(对于 L1 也是如此)。根据Colin Percival's cache miss with hyper-threading,存在远程信息泄漏;但这对于 TrustZone 来说更加困难,因为上下文切换粒度更大。如果您不使用 TrustZone,则任何一个操作系统都可能映射物理内存,而缓存是最少的问题。
  • HDL硬件描述语言。 ARM 为 L2 逻辑提供 代码,供应商可以为该缓存设置 参数。它们可能有两个连接到 L2 的 AXI BUS 接口,并且对这些数据有某种优先级;但并非所有 PL310 都具有此功能,因为它是一个参数。 PL310 接口中有特性寄存器来确定使用了哪些参数

标签: caching linux-kernel arm cpu-cache cortex-a


【解决方案1】:

不使用相同物理内存的两段代码不会导致任何缓存冲突,因为缓存在 A7 处理器(任何具有虚拟化扩展的 ARM 处理器)上进行了物理标记。

在 A7 上,缓存行也带有 VM id 标记。因此,如果您想强制在两个内核上运行的代码之间进行分离,您可以为每个内核设置第二阶段的分页表,并用不同的 VM id 标记它们。 EL0/1 对地址空间的任何违反都会导致 EL2(管理程序)陷入陷阱。这与 EL1 强制分离 EL0 地址空间的方式非常相似。

要进行配置,您必须有权访问引导代码。通常从安全 EL1/EL3 引导代码直接切换到非安全 EL1 模式。您将不得不修改此流程并改为切换到 EL2 模式。在 EL2 模式下设置并为每个内核启用不相交的第二阶段页表。还要设置一个 EL2 向量表来捕获您的第二阶段 MMU 异常。

这将导致性能略有下降。这将比使用 KVM 更有效(上次我检查 KVM 不是很适合 ARM v7 并且由于设计而导致大量开销)。 XEN 更适合 ARM,但需要您进行大量设置。

如果您不打算使用虚拟化扩展/第二阶段页表/SMP;您也可以关闭 ACTLR.SMP 位。由于 L1 缓存并发块将被关闭,这可能会给您带来一点性能提升。

注意:此答案适用于已编辑的问题

【讨论】:

  • 谢谢,关于 PL 分离和 ACTLR.SMP 位的有用信息。你能不能对这个标志更精确一点?似乎对我的用例很有希望,因为我确实不会使用虚拟化扩展。
  • @cid 恐怕这不适用于 A7。仔细查看 TRM,几乎所有缓存都将被禁用,如果设置了 SMP 位,任何缓存/TLB 维护操作或 LDREX/STREX 操作都会导致中止。 A15 TRM 似乎表明禁用 SMP 位的限制较少,可能会达到预期的结果(我相信这是因为两个 proc 之间的 L2 缓存架构不同)。这在 A15 上是值得的实验,但我猜在 A7 上不是。很抱歉给了性能提升的错误希望。
【解决方案2】:

除了作为缓存之外,L2 缓存还有助于不同内核的 L1 缓存之间的缓存一致性。如果您以某种方式设法将其拉下来(每个内核的私有 L2 缓存),您将失去您的 SMP 特性。此外,L2 缓存控制器已经负责将所有内核使用的数据/代码加载到缓存中,这比在启动时静态划分缓存要好。

【讨论】:

  • 但我实际上不想要任何 SMP 特性。事实上,我需要的恰恰相反。它更多地对应于 AMP 架构:我希望 每个应用程序他自己的核心 上查看和运行。我理解您对 L2 将缓存所有内核使用的数据/代码这一事实的观点。但是,它如何处理每个核心都使用自己的虚拟映射的情况呢?
  • @cid 根据手册,Cortex-A7 的 L2 是物理索引、物理标记的,因此没有虚拟混叠问题。考虑一个运行多个单线程用户进程的 SMP 操作系统 - 每个内核将花费大部分时间在自己的地址空间中运行一个隔离的应用程序,听起来很熟悉吗?就个人而言,我会忘记这一点,直到您有数据证明缓存污染是损害您的应用程序性能的唯一因素,并且您不可能通过重新设计代码来解决它。没有它,它似乎更像是一个纯粹想象的“问题”。
  • @Notlikethat 这可能是一个简单的答案;只需使用不会 L2 散列到同一行的地址(每个 CPU 相邻的 128kB 物理块)。至少,他可以做到这一点,看看它是否会给性能带来很大的提升。我也相当确定有一些方法可以对 L2 缓存进行分区,但这取决于实现者设置的 HDL 参数。
猜你喜欢
  • 2017-01-21
  • 1970-01-01
  • 1970-01-01
  • 2017-09-24
  • 2016-02-04
  • 1970-01-01
  • 2016-09-30
  • 2023-03-14
  • 2019-12-14
相关资源
最近更新 更多