背景和目标
我想在我的Olimex A20 Lime平台上运行两个完全独立的应用程序,运行一个ARM Cortex-A7。目标是为每个应用程序贡献一个核心。到目前一切尚好。
现在,我想以以下方式在核心之间划分L2缓存:
L2 cache (256KB)
---------------------------
| CPU0 | CPU1 |
| (128KB) | (128KB) |
---------------------------
因此,每个核心只能访问(他的私有128 L2的L2缓存)。
问题
如何将L2缓存划分为ARM Cortex-A7上的核心?
据我理解,在以前的SoC中,经常使用像PL310这样的外部缓存控制器。现在,新的SoC,如Cortex-A15和Cortex-A7使用了一个集成的高速缓存控制器。此控制器以某种方式集成到SCU组件中。
我在CP15系统中发现了一些与缓存相关的寄存器,如CSSELR、CCSIDR、CLIDR等,甚至系统控制寄存器(SCTLR)。但它们似乎都不允许我为每个核心配置一个大小。还能这样做吗?
谢谢你的帮助。
编辑
这里所说的独立应用程序实际上是指Linux 。因此,我们的目标是将一个核心奉献给一个操作系统。因此,每个操作系统都运行在(见)下面的单处理器系统上。到目前为止,整个框架已经在运行。
感谢我收到的答案,我现在明白了,内核都使用L2应该是可以的,即使它们是独立的操作系统,而不是使用相同的虚拟映射。实际上,这与拥有虚拟地址空间的两个进程是一样的。
然而,最后困扰我的是安全方面:
如果两个核心共享整个L2缓存,那么从技术上讲,一个核心是否有可能访问另一个核心的缓存数据?
参考文献
发布于 2015-06-05 11:00:38
两段不使用相同物理内存的代码不会引起任何缓存冲突,因为缓存是在A7处理器(任何具有虚拟化扩展的ARM处理器)上物理标记的。
在A7上,缓存行也是VM标记。因此,如果您希望在运行在两个核上的代码之间强制隔离,您可以为每个内核设置第二阶段可分页,并使用不同的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缓存并发块将被关闭。
备注:这个答案是针对编辑过的问题
https://stackoverflow.com/questions/30612687
复制相似问题