hardware - 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 从未分配过它们一样)。
重要提示:当缓存按“whole L1”-“whole L2”顺序刷新时会发生这种情况。当我将刷新顺序更改为 L2 - L1 时,一切都很好,CPU 从内存中读取正确的值。
但这仍然可能只是一种“运气”,所有必要的环境变量都被缓存控制器从缓存中逐出,而不是我的缓存刷新例程。
那么刷新缓存的正确顺序是什么?谢谢。
PS:
- 我很确定每个缓存的闪烁例程都很好,这只是
for
在集合和方式上的 2 个循环。首先刷新整个缓存,然后再刷新另一个。 - 缓存没有什么是确定的,L1-L2 顺序通常更有效。但我经常遇到问题。因此,在这种情况下,“工作”只是获得运气数据驱逐。
- 我们不是在谈论任何特定的操作系统
解决方案
ARMv8 参考手册在 D4.4.7 下说:
缓存维护指令可以定义的点根据指令是通过 VA 操作还是通过 set/way 操作而有所不同。
- 对于通过 set/way 操作的指令,该点被定义为到下一级缓存。[...]
所以正确的顺序应该是L1,然后是L2。
推荐阅读
- react-native-contacts - 如何在反应原生联系人中使用添加新功能?
- mysql - 使用 where 和 groupBy 重复检查变慢 - Laravel DB 查询
- c# - wpf从viewmodel-c#端制作网格列tnd行
- php - 如何在 laravel 中将默认 cookie 加密更改为更安全的加密?
- c - 为什么比较结构数组的两个元素(从文件中获取和分配)不返回正确的值?
- javascript - 如何在微软办公查看器中实现查找功能?
- python - 如何在熊猫数据框中创建其他行的平均值的行?
- vb.net - 如何根据关键字从 DataGridView 将数字添加到文本框中的值
- r - 循环遍历全局环境并将数据帧重命名为小写,没有特殊字符(在 R 中)
- java - 通过 UserInformationRecoveryStub 将新用户注册到 wso2 身份服务器时,邮件确认不会进行