AArch64,多级缓存刷新,级别刷新顺序

问题描述

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

  • 冲洗L1,冲洗L2
  • 或冲洗L2,冲洗L1。

详细信息:
有问题的SoC是具有4个CPU的AArch64芯片。每个CPU都有单独的L1缓存和共享的L2缓存,主DDR内存紧随L2缓存。
在系统CPU0上启动并
  • 初始化自身
  • 初始化操作系统
  • 初始化环境(实际上是一堆全局变量)
  • 为其他CPU做准备
  • 释放其他CPU的复位设置,以便它们可以启动,自行初始化并开始执行工作。

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

问题是某些全局变量不能完全进入主存。我可以看到,CPU(除CPU0之外)使用默认值读取了这些变量(如CPU0从未分配过这些变量)。

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

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

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

PS:

  • 我非常确定每个高速缓存的刷新例程都很好,这就是2 for遍历集合和方式的循环。首先,刷新整个一个缓存,然后刷新整个另一个缓存。
  • 对于缓存而言,并不确定,L1-L2顺序的工作更多。但是我经常有问题。因此,在这种情况下,“工作”只是运气而已。
  • 我们不是在谈论任何特定的操作系统

解决方法

ARMv8 Reference Manual在D4.4.7下说:

可以定义缓存维护指令的点取决于该指令是按VA还是按组/方式操作。

  • 对于按集合/方式操作的指令,该点定义为到达下一级缓存。 [...]

因此正确的顺序应该是L1,然后是L2。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...