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

How to divide the L2 cache between the cores on a ARM Cortex-A7?

背景和目标

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

现在我想按以下方式在内核之间划分 L2 缓存:

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

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

问题

How can I divide the L2 cache between the cores on a ARM Cortex-A7?

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

我在CP15系统中找到了一些与缓存相关的寄存器,如CSSELR、CCSIDR、CLIDR等,甚至系统控制寄存器 (SCTLR)。但是其中 none 似乎让我为每个核心配置一个大小。那还能做吗?

感谢您的帮助。

编辑

在这里,独立应用程序我的意思是事实上LinuxOS。所以目标是将一个核心专用于一个 OS。因此,每个 OS 运行s 在(参见)下面的 单处理器 系统上。整个框架已经 运行ning,到目前为止一切顺利。

感谢我收到的答复,我现在明白了,即使内核是独立的 OS 不使用相同的虚拟映射,也应该可以同时使用 L2。实际上它确实与拥有虚拟地址 space.

的 2 个进程相同

然而,最让我困扰的是安全方面:

If both cores share the whole L2 cache, is it technically possible for one core to access cached data of the other core?

参考资料

二级缓存除了作为缓存外,还有助于不同内核的一级缓存之间的缓存一致性。如果你以某种方式设法实现它(每个核心的私有 L2 缓存),你将失去你的 SMP 特性。此外,L2 缓存控制器已经负责加载所有内核使用的 data/code 缓存,这比在启动时静态划分缓存要好。

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

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

的方式非常相似

要配置它,您必须能够访问引导代码。通常从secure EL1/EL3 bootcode直接切换到Non-Secure EL1模式。您将不得不修改此流程并改为切换到 EL2 模式。在 EL2 模式下设置并为每个核心启用非交叉第二阶段页面 table。还要设置一个 EL2 向量 table 来捕获您的第二阶段 MMU 异常。

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

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

注意:此答案针对已编辑的问题