AArch64,多级缓存刷新,级刷新顺序
AArch64, multi level cache flush, order of level flushing
简而言之,我们谈论的是具有 2 级缓存(L1、L2)的 SoC。我需要将缓存中的所有数据刷新到主 DDR 内存中。问题是应该按什么顺序完成
- 同花顺 L1,同花顺 L2
- 或冲洗L2,冲洗L1。
详情:
所讨论的 SoC 是具有 4 CPUs 的 AArch64 芯片。每个CPU有单独的L1缓存和共享的L2缓存,主DDR内存在L2缓存之后。
在系统 CPU0 上启动并
- 初始化自己
- 初始化OS
- 初始化环境(实际上是一堆全局变量)
- 为其他CPU做准备
- 其他 CPU 的发布重置,因此他们可以开始、初始化自己并开始做工作。
现在 CPU0,在允许其他人启动之前,刷新整个缓存(L1 和 L2),以便其他人可以使用全局环境变量进行正确的初始化。主要初始化由其他 CPUs 完成,缓存关闭,因此重要的是将数据放在主内存中,而不仅仅是共享 L2 中。
通过使用 dc csw ...
指令遍历所有 sets/ways 来刷新缓存。
问题是一些全局变量没有完全进入主内存。我可以看到 CPUs(CPU0 除外)使用默认值读取这些变量(就像它们从未被 CPU0 分配过一样)。
重要提示: 当缓存按 'whole L1' - 'whole L2' 的顺序刷新时会发生这种情况。
当我将刷新顺序更改为 L2 - L1 时,一切都很好并且 CPUs 从内存中读取了正确的值。
但这仍然可能只是一个 'luck',所有必要的环境变量都被缓存控制器而不是我的缓存刷新例程从缓存中逐出。
那么刷新缓存的正确顺序是什么?
谢谢
PS:
- 我很确定每个缓存的刷新例程都很好,这只是 2
for
循环集合和方式。首先刷新整个缓存,然后再刷新另一个缓存。
- 缓存没有什么是确定的,L1-L2 顺序通常有效。但我经常遇到问题。所以 'working' 在这种情况下只是运气数据驱逐。
- 我们不是在谈论任何特定的 OS
D4.4.7下的ARMv8 Reference Manual说:
The points to which a cache maintenance instruction can be defined differ depending on whether the instruction operates by VA or by set/way.
- For instructions operating by set/way, the point is defined to be to the next level of caching. [...]
所以正确的顺序应该是L1,然后是L2。
简而言之,我们谈论的是具有 2 级缓存(L1、L2)的 SoC。我需要将缓存中的所有数据刷新到主 DDR 内存中。问题是应该按什么顺序完成
- 同花顺 L1,同花顺 L2
- 或冲洗L2,冲洗L1。
详情:
所讨论的 SoC 是具有 4 CPUs 的 AArch64 芯片。每个CPU有单独的L1缓存和共享的L2缓存,主DDR内存在L2缓存之后。
在系统 CPU0 上启动并
- 初始化自己
- 初始化OS
- 初始化环境(实际上是一堆全局变量)
- 为其他CPU做准备
- 其他 CPU 的发布重置,因此他们可以开始、初始化自己并开始做工作。
现在 CPU0,在允许其他人启动之前,刷新整个缓存(L1 和 L2),以便其他人可以使用全局环境变量进行正确的初始化。主要初始化由其他 CPUs 完成,缓存关闭,因此重要的是将数据放在主内存中,而不仅仅是共享 L2 中。
通过使用 dc csw ...
指令遍历所有 sets/ways 来刷新缓存。
问题是一些全局变量没有完全进入主内存。我可以看到 CPUs(CPU0 除外)使用默认值读取这些变量(就像它们从未被 CPU0 分配过一样)。
重要提示: 当缓存按 'whole L1' - 'whole L2' 的顺序刷新时会发生这种情况。 当我将刷新顺序更改为 L2 - L1 时,一切都很好并且 CPUs 从内存中读取了正确的值。
但这仍然可能只是一个 'luck',所有必要的环境变量都被缓存控制器而不是我的缓存刷新例程从缓存中逐出。
那么刷新缓存的正确顺序是什么? 谢谢
PS:
- 我很确定每个缓存的刷新例程都很好,这只是 2
for
循环集合和方式。首先刷新整个缓存,然后再刷新另一个缓存。 - 缓存没有什么是确定的,L1-L2 顺序通常有效。但我经常遇到问题。所以 'working' 在这种情况下只是运气数据驱逐。
- 我们不是在谈论任何特定的 OS
D4.4.7下的ARMv8 Reference Manual说:
The points to which a cache maintenance instruction can be defined differ depending on whether the instruction operates by VA or by set/way.
- For instructions operating by set/way, the point is defined to be to the next level of caching. [...]
所以正确的顺序应该是L1,然后是L2。