首页 > 解决方案 > AArch64,多级缓存刷新,级别刷新的顺序

问题描述

很快,我们将讨论具有 2 级缓存(L1、L2)的 SoC。我需要将缓存中的所有数据刷新到主 DDR 内存中。问题是应该按什么顺序完成


详细信息:
有问题的 SoC 是具有 4 个 CPU 的 AArch64 芯片。每个 CPU 都有单独的 L1 缓存和共享的 L2 缓存,主 DDR 内存在 L2 缓存之后。
在系统 CPU0 启动和

现在 CPU0,在允许其他人启动之前,刷新整个缓存(L1 和 L2)以使全局环境变量可供其他人正确初始化。主要初始化是由关闭缓存的其他 CPU 完成的,因此将数据保存在主内存中很重要,而不仅仅是在共享 L2 中。dc csw ...通过使用指令迭代所有集合/方式来刷新缓存。

问题是一些全局变量并没有完全进入主内存。我可以看到 CPU(CPU0 除外)使用默认值读取这些变量(就像 CPU0 从未分配过它们一样)。

重要提示:当缓存按“whole L1”-“whole L2”顺序刷新时会发生这种情况。当我将刷新顺序更改为 L2 - L1 时,一切都很好,CPU 从内存中读取正确的值。

但这仍然可能只是一种“运气”,所有必要的环境变量都被缓存控制器从缓存中逐出,而不是我的缓存刷新例程。

那么刷新缓存的正确顺序是什么?谢谢。

PS:

标签: hardwarecpu-architecturearm64cpu-cachearmv8

解决方案


ARMv8 参考手册在 D4.4.7 下说:

缓存维护指令可以定义的点根据指令是通过 VA 操作还是通过 set/way 操作而有所不同。

  • 对于通过 set/way 操作的指令,该点被定义为到下一级缓存。[...]

所以正确的顺序应该是L1,然后是L2。


推荐阅读