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

时间:2015-06-03 06:43:34

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

上下文和目标

我想在运行 ARM Cortex-A7 Olimex A20 Lime 平台上运行两个完全独立的应用程序。目标是为每个应用程序专用一个核心。到现在为止还挺好。

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

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

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

问题

  

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

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

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

感谢您的帮助。

修改

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

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

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

  

如果两个内核共享整个L2缓存,技术上是否可以让一个内核访问另一个内核的缓存数据?

参考

2 个答案:

答案 0 :(得分:3)

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

在A7上,缓存行也是VM id标记的。因此,如果要强制在两个核心上运行的代码之间进行分离,可以为每个核心设置第二阶段页面表,并使用不同的VM ID标记它们。 EL0 / 1违反地址空间将导致陷阱到EL2(Hypervisor)。这与EL1强制分离EL0地址空间的方式非常相似。

要进行配置,您必须能够访问引导代码。通常从安全的EL1 / EL3启动代码直接切换到非安全EL1模式。您必须修改此流程并改为切换到EL2模式。在EL2模式下设置并为每个核心启用非交叉的第二阶段页表。同时设置EL2向量表以捕获第二阶段MMU异常。

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

如果您不打算使用虚拟化扩展/第二阶段页表/ SMP;你也可以关掉ACTLR.SMP位。这可能会提高性能,因为L1缓存并发块将被关闭。

注意:此答案适用于已修改的问题

答案 1 :(得分:1)

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