不久,我们将讨论具有2级缓存的SoC (L1,L2)。我需要将缓存中的所有数据刷新到主DDR内存中。问题是应该按照什么顺序去做。
详细信息:
问题中的SoC是带有4个CPU的AArch64芯片。每个CPU都有单独的L1缓存和共享的L2缓存,主DDR内存在L2缓存之后。
在系统CPU0启动和
现在,CPU0,在允许其他人启动之前,刷新整个缓存(包括L1和L2),以便使全局环境变量可供其他人使用以进行正确的初始化。主初始化是由关闭缓存的其他CPU完成的,因此重要的是在主内存中拥有数据,而不仅仅是共享L2中的数据。缓存是通过使用dc csw ...指令迭代所有集合/方式来刷新的。
问题是,一些全局变量并没有完全进入主内存。我可以看到CPU(CPU0除外)用默认值读取这些变量(就像CPU0从未分配它们一样)。
重要:当缓存按‘整个L1’-‘整个L2’顺序刷新时发生的。当我将刷新顺序改为L2 - L1时,一切正常,CPU从内存中读取正确的值。
不过,这可能只是一个“运气”,因为所有必要的环境变量都被缓存控制器从缓存中逐出,而不是我的缓存刷新例程。
那么闪存的正确顺序是什么呢?谢谢。
PS:
for循环。首先刷新整个缓存,然后再刷新另一个缓存。发布于 2020-10-26 18:01:03
ARMv8参考手册在D4.4.7中说:
根据指令是由VA操作还是按设置/方式操作,可以定义缓存维护指令的点不同。
所以正确的顺序应该是L1,然后是L2。
https://stackoverflow.com/questions/64484441
复制相似问题