【发布时间】:2015-08-17 05:25:12
【问题描述】:
背景和目标
我想在运行 ARM Cortex-A7 的 Olimex A20 Lime 平台上运行两个完全独立的应用程序。目标是将一个核心专用于每个应用程序。到目前为止,一切都很好。
现在我想通过以下方式在内核之间划分二级缓存:
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。实际上它确实与拥有自己的虚拟地址空间的 2 个进程相同。
但最后困扰我的是安全方面:
如果两个核心共享整个二级缓存,一个核心在技术上是否可以访问另一个核心的缓存数据?
参考文献
-
ARM Cortex-A7 MPCore TRM
- 关于 L2 内存系统 (7.1)
- 标识寄存器 (4.2.18)
【问题讨论】:
-
您这样做是为了解决什么问题?
-
这可能取决于 L2 缓存 PL310 或 PL4xx 的配置,但正如 unixsmurf 所暗示的那样,它可能没有帮助。假设任务 1 受内存限制,任务 2 受 CPU 限制,那么您希望 L2 执行第一个任务。因此,尽管有可能(鉴于 L2 有不同的 AXI 总线接口),但它可能没有好处。可能有更好的方法可以让您努力使系统变得更好......
-
想一想 - 两个操作系统实例可能会命中相同的缓存条目当且仅当它们访问相同的物理地址 - 如果访问两个不同的物理地址能够返回相同的数据,缓存将从根本上被破坏。如果您真的关心隔离,那么在板上运行带有 KVM 的 SMP Linux,然后运行固定到每个主机 CPU 的单核应用程序 VM。
-
你在使用trustzone吗? L2 是 trustzone 感知的,并将尝试保持 L2-secure 锁定并且不被正常的世界 L2 活动驱逐(对于 L1 也是如此)。根据Colin Percival's cache miss with hyper-threading,存在远程信息泄漏;但这对于 TrustZone 来说更加困难,因为上下文切换粒度更大。如果您不使用 TrustZone,则任何一个操作系统都可能映射物理内存,而缓存是最少的问题。
-
HDL 是硬件描述语言。 ARM 为 L2 逻辑提供 代码,供应商可以为该缓存设置 参数。它们可能有两个连接到 L2 的 AXI BUS 接口,并且对这些数据有某种优先级;但并非所有 PL310 都具有此功能,因为它是一个参数。 PL310 接口中有特性寄存器来确定使用了哪些参数。
标签: caching linux-kernel arm cpu-cache cortex-a