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

Hardware AArch64,多级缓存刷新,级别刷新顺序,hardware,cpu-architecture,arm64,cpu-cache,armv8,Hardware,Cpu Architecture,Arm64,Cpu Cache,Armv8,简而言之,我们将讨论具有两级缓存(L1、L2)的SoC。我需要将缓存中的所有数据刷新到主DDR内存中。问题是应该按什么顺序进行 冲洗L1,冲洗L2 或者刷新L2,刷新L1 详细信息: 所讨论的SoC是带有4个CPU的AArch64芯片。每个CPU都有单独的一级缓存和共享的二级缓存,主DDR内存在二级缓存之后。 在系统上,CPU0启动并 初始化本身 初始化操作系统 init环境(有效的全局变量组) 为其他CPU做准备 释放其他CPU的重置,以便它们可以启动、初始化自己并开始执行作业 现在

简而言之,我们将讨论具有两级缓存(L1、L2)的SoC。我需要将缓存中的所有数据刷新到主DDR内存中。问题是应该按什么顺序进行

  • 冲洗L1,冲洗L2
  • 或者刷新L2,刷新L1

详细信息:
所讨论的SoC是带有4个CPU的AArch64芯片。每个CPU都有单独的一级缓存和共享的二级缓存,主DDR内存在二级缓存之后。
在系统上,CPU0启动并
  • 初始化本身
  • 初始化操作系统
  • init环境(有效的全局变量组)
  • 为其他CPU做准备
  • 释放其他CPU的重置,以便它们可以启动、初始化自己并开始执行作业
现在,在允许其他人启动之前,先刷新整个缓存(L1和L2),以便使全局环境变量可供其他人使用,以便进行适当的初始化。主初始化是在缓存关闭的情况下由其他CPU完成的,因此在主存中保存数据,而不仅仅是在共享L2中,这一点很重要。 通过使用
dc csw…
指令对所有集合/方式进行迭代来刷新缓存

问题是,一些全局变量并没有完全到达主内存。我可以看到CPU(除了CPU0)用默认值读取这些变量(就像它们从来没有被CPU0赋值一样)

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

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

那么闪烁缓存的正确顺序是什么? 谢谢

附言:

  • 我很确定每个缓存的闪烁例程都很好,对于集合和路径上的循环,只需2个
    。首先刷新整个缓存,然后刷新整个缓存
  • 对于缓存,没有什么是确定的,L1-L2顺序通常起作用。但我经常收到这个问题。因此,在这种情况下,“工作”只是“运气好”数据驱逐
  • 我们不是在谈论任何特定的操作系统
D4.4.7中规定:

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

  • 对于按set/way操作的指令,该点被定义为下一级缓存。[……]
因此正确的顺序应该是L1,然后是L2。

D4.4.7中的说明:

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

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

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

内存顺序+缓存一致性应该使您描述的问题不需要这样做。因此,您可能只需要刷新非一致性的内容?辅助CPU从关闭缓存开始,在该阶段,缓存一致性不适用,如D4.4.7所述:“缓存维护指令可定义的点不同,这取决于该指令是通过VA操作还是通过set/way操作。对于按set/way操作的指令,该点被定义为下一级缓存。“看来L1后面跟L2确实是预定的/正确的顺序。@Siguza,这就是我要找的。你能把它作为一个回答吗?记忆顺序+缓存一致性应该使你描述的问题不需要这样做。因此,您可能只需要刷新非一致性的内容?辅助CPU从关闭缓存开始,在该阶段,缓存一致性不适用,如D4.4.7所述:“缓存维护指令可定义的点不同,这取决于该指令是通过VA操作还是通过set/way操作。对于按set/way操作的指令,该点被定义为下一级缓存。“因此,看起来L1后跟L2确实是预期的/正确的顺序。@Siguza,这就是我要找的。你能把它作为一个答案吗