Hardware AArch64,多级缓存刷新,级别刷新顺序
简而言之,我们将讨论具有两级缓存(L1、L2)的SoC。我需要将缓存中的所有数据刷新到主DDR内存中。问题是应该按什么顺序进行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
- 或者刷新L2,刷新L1
详细信息:
所讨论的SoC是带有4个CPU的AArch64芯片。每个CPU都有单独的一级缓存和共享的二级缓存,主DDR内存在二级缓存之后。
在系统上,CPU0启动并
- 初始化本身
- 初始化操作系统
- init环境(有效的全局变量组)
- 为其他CPU做准备
- 释放其他CPU的重置,以便它们可以启动、初始化自己并开始执行作业
dc csw…
指令对所有集合/方式进行迭代来刷新缓存
问题是,一些全局变量并没有完全到达主内存。我可以看到CPU(除了CPU0)用默认值读取这些变量(就像它们从来没有被CPU0赋值一样)
重要提示:按“整个L1”-“整个L2”顺序刷新缓存时会发生这种情况。
当我将刷新顺序更改为L2-L1时,一切正常,CPU从内存中读取正确的值
但这可能只是一个“运气”,所有必要的环境变量都被缓存控制器从缓存中逐出,而不是我的缓存刷新例程
那么闪烁缓存的正确顺序是什么?
谢谢
附言:
- 我很确定每个缓存的闪烁例程都很好,对于集合和路径上的循环,只需2个
。首先刷新整个缓存,然后刷新整个缓存
- 对于缓存,没有什么是确定的,L1-L2顺序通常起作用。但我经常收到这个问题。因此,在这种情况下,“工作”只是“运气好”数据驱逐
- 我们不是在谈论任何特定的操作系统
- 对于按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,这就是我要找的。你能把它作为一个答案吗