如何在 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-A15 和 Cortex-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?
参考资料
- ARM Cortex-A7 MPCore TRM
- 关于 L2 内存系统 (7.1)
- 识别寄存器 (4.2.18)
二级缓存除了作为缓存外,还有助于不同内核的一级缓存之间的缓存一致性。如果你以某种方式设法实现它(每个核心的私有 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 缓存并发块将被关闭。
注意:此答案针对已编辑的问题
背景和目标
我想 运行 在我的 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-A15 和 Cortex-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?
参考资料
- ARM Cortex-A7 MPCore TRM
- 关于 L2 内存系统 (7.1)
- 识别寄存器 (4.2.18)
二级缓存除了作为缓存外,还有助于不同内核的一级缓存之间的缓存一致性。如果你以某种方式设法实现它(每个核心的私有 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 缓存并发块将被关闭。
注意:此答案针对已编辑的问题