【发布时间】:2021-02-05 14:24:17
【问题描述】:
简而言之,我们谈论的是具有 2 级缓存(L1、L2)的 SoC。我需要将缓存中的所有数据刷新到主 DDR 内存中。问题是应该按什么顺序完成
- 冲洗 L1,冲洗 L2
- 或冲洗 L2,冲洗 L1。
详情:
有问题的 SoC 是具有 4 个 CPU 的 AArch64 芯片。每个 CPU 都有单独的 L1 缓存和共享的 L2 缓存,主 DDR 内存在 L2 缓存之后。
在系统 CPU0 启动和
- 初始化自己
- 初始化操作系统
- init 环境(实际上是一堆全局变量)
- 为其他 CPU 做准备
- 释放其他 CPU 的重置,以便它们可以启动、初始化自己并开始执行作业。
现在 CPU0,在允许其他人启动之前,刷新整个缓存(L1 和 L2),以便使全局环境变量可供其他人正确初始化。主要初始化是由关闭缓存的其他 CPU 完成的,因此将数据保存在主内存中很重要,而不仅仅是在共享 L2 中。
通过使用dc csw ... 指令迭代所有集合/方式来刷新缓存。
问题是一些全局变量并没有完全进入主内存。我可以看到 CPU(除了 CPU0)使用默认值读取这些变量(就像 CPU0 从未分配过它们一样)。
重要提示:当缓存按“whole L1”-“whole L2”顺序刷新时会发生这种情况。 当我将刷新顺序更改为 L2 - L1 时,一切正常,CPU 从内存中读取正确的值。
但这仍然可能只是一种“运气”,所有必要的环境变量都被缓存控制器从缓存中逐出,而不是我的缓存刷新例程。
那么刷新缓存的正确顺序是什么? 谢谢。
PS:
- 我很确定每个缓存的刷新例程都很好,这只是 2
for在集合和方式上循环。首先刷新整个缓存,然后刷新另一个。 - 缓存没有什么是确定的,L1-L2 顺序通常更有效。但我经常遇到问题。因此,在这种情况下,“工作”只是获得运气数据驱逐。
- 我们不是在谈论任何特定的操作系统
【问题讨论】:
-
内存顺序+缓存一致性对于您描述的问题应该是不必要的。所以你可能只需要冲洗不连贯的东西?
-
辅助 CPU 从缓存关闭开始,在那个阶段缓存一致性不适用
-
The manual 在 D4.4.7 下说:“可以定义缓存维护指令的点取决于指令是通过 VA 操作还是通过 set/way 操作。对于通过 set/ 操作的指令方式,重点被定义为下一级缓存。”所以看起来清洁 L1 后跟 L2 确实是预期/正确的顺序。
-
@Siguza,这就是我想要的。你能把它作为答案吗
标签: hardware cpu-architecture arm64 cpu-cache armv8