Caching 如何在ARM Cortex-A7上的内核之间划分二级缓存? 背景和目标

Caching 如何在ARM Cortex-A7上的内核之间划分二级缓存? 背景和目标,caching,linux-kernel,arm,cpu-cache,cortex-a,Caching,Linux Kernel,Arm,Cpu Cache,Cortex A,我想在我的Olimex A20 Lime平台上运行两个完全独立的应用程序,它们运行的是ARM Cortex-A7。目标是为每个应用程序指定一个核心。到目前为止还不错 现在,我想用以下方式在核心之间划分二级缓存: L2 cache (256KB) --------------------------- | CPU0 | CPU1 | | (128KB) | (128KB) | --------------------------- 因此,每个核心

我想在我的Olimex A20 Lime平台上运行两个完全独立的应用程序,它们运行的是ARM Cortex-A7。目标是为每个应用程序指定一个核心。到目前为止还不错

现在,我想用以下方式在核心之间划分二级缓存:

       L2 cache (256KB)
---------------------------
|    CPU0    |    CPU1    |
|   (128KB)  |   (128KB)  |
---------------------------
因此,每个核心只能访问其私有的128KB二级缓存

问题: 如何在ARM Cortex-A7上的内核之间划分二级缓存

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

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

谢谢你的帮助

编辑 这里,我所说的独立应用程序实际上是指Linux操作系统。因此,我们的目标是将一个内核专用于一个操作系统。因此,每个操作系统都运行在(请参阅)下面的单处理器系统上。到目前为止,整个框架已经在运行

多亏了我收到的答案,我现在明白了,即使它们是独立操作系统,不使用相同的虚拟映射,核心也可以同时使用L2。实际上,这与拥有虚拟地址空间的两个进程是一样的

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

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

工具书类
    • 关于L2内存系统(7.1)
    • 识别寄存器(4.2.18)

二级缓存除了作为缓存外,还有助于不同核心的一级缓存之间的缓存一致性。如果您以某种方式成功实现了这一点(每个核心都有专用的L2缓存),那么您将失去SMP特性。此外,二级缓存控制器已经负责加载所有内核使用的数据/代码的缓存,这比在启动时静态划分缓存要好。

两段不使用相同物理内存的代码不会导致任何缓存冲突,因为缓存在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,但需要您进行大量设置

如果您不打算使用虚拟化扩展/2nd stage page tables/SMP,您也可以关闭ACTLR.SMP位。这可能会给您带来一点性能提升,因为一级缓存并发块将被关闭


注意:这个答案是针对编辑过的问题的

你想通过这样做解决什么问题?这可能取决于二级缓存PL310或PL4xx的配置,但正如unixsmurf所暗示的,这可能没有帮助。假设任务1是内存限制,任务2是CPU限制,那么你希望二级缓存转到第一个任务。因此,尽管这是可能的(考虑到与L2的不同AXI总线接口)这可能没有什么好处。也许有更好的方法可以让系统变得更好……想想看——两个操作系统实例可以命中相同的缓存条目,如果并且只有当它们访问相同的物理地址时——如果访问两个不同的物理地址能够返回相同的数据,那么缓存将是最基本的联盟崩溃。如果你真的关心隔离,那么在板上运行带KVM的SMP Linux,然后在每个主机CPU上运行一个固定的单核心应用程序VM。你在使用吗?L2是信任区感知的,将尝试保持L2安全锁定,而不是被正常的世界L2活动逐出(L1也是如此)。存在类似于的远程信息泄漏;但由于上下文切换粒度更大,TrustZone更难做到这一点。如果不使用TrustZone,则任何操作系统都可能映射物理内存,而缓存是问题中最小的。HDL是硬件描述语言。ARM提供二级逻辑的代码,供应商可能会使用t参数。它们可能有两个到二级缓存的AXI总线接口,并且对该数据有某种优先级;但并非所有PL310都有此功能,因为它是一个参数。PL310接口中有功能寄存器来确定使用了哪些参数。但我实际上不想要任何SMP特性。事实上,我eed正好相反。它更符合AMP体系结构:我希望每个应用程序都能在自己的核心上查看和运行。我理解您的观点,即二级缓存将缓存所有核心使用的数据/代码。但是,它如何处理每个核心都在使用自己的虚拟映射的情况?@cid根据手册,Cortex-A7的L2是物理索引的,物理标记的,因此没有vir