首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AArch64,多级缓存刷新,级别刷新顺序

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

Stack Overflow用户
提问于 2020-10-22 14:28:47
回答 1查看 362关注 0票数 0

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

  • 刷新L1,刷新L2
  • 或者刷新L2,刷新L1。

详细信息:

问题中的SoC是带有4个CPU的AArch64芯片。每个CPU都有单独的L1缓存和共享的L2缓存,主DDR内存在L2缓存之后。

在系统CPU0启动和

  • 使其本身
  • init操作系统
  • init环境(实际上是一堆全局变量)
  • 为其他CPU做好准备
  • 为其他CPU释放重置,这样它们就可以启动、插入并开始执行任务。

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

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

重要:当缓存按‘整个L1’-‘整个L2’顺序刷新时发生的。当我将刷新顺序改为L2 - L1时,一切正常,CPU从内存中读取正确的值。

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

那么闪存的正确顺序是什么呢?谢谢。

PS:

  • 我很确定每个缓存的闪烁例程都很好,这只是在sets和ways上的两个for循环。首先刷新整个缓存,然后再刷新另一个缓存。
  • 没有什么是确定的缓存,L1-L2秩序更经常工作。但我经常有问题。因此,在这种情况下,“工作”就是运气好的数据驱逐。
  • 我们不是在谈论任何特定的操作系统
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-26 18:01:03

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

根据指令是由VA操作还是按设置/方式操作,可以定义缓存维护指令的点不同。

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64484441

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档