【问题标题】:AArch64, multi level cache flush, order of level flushingAArch64,多级缓存刷新,级别刷新的顺序
【发布时间】:2021-02-05 14:24:17
【问题描述】:

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

  • 冲洗 L1,冲洗 L2
  • 或冲洗 L2,冲洗 L1。

详情:
有问题的 SoC 是具有 4 个 CPU 的 AArch64 芯片。每个 CPU 都有单独的 L1 缓存和共享的 L2 缓存,主 DDR 内存在 L2 缓存之后。
在系统 CPU0 启动和
  • 初始化自己
  • 初始化操作系统
  • init 环境(实际上是一堆全局变量)
  • 为其他 CPU 做准备
  • 释放其他 CPU 的重置,以便它们可以启动、初始化自己并开始执行作业。

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

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

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

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

那么刷新缓存的正确顺序是什么? 谢谢。

PS:

  • 我很确定每个缓存的刷新例程都很好,这只是 2 for 在集合和方式上循环。首先刷新整个缓存,然后刷新另一个。
  • 缓存没有什么是确定的,L1-L2 顺序通常更有效。但我经常遇到问题。因此,在这种情况下,“工作”只是获得运气数据驱逐。
  • 我们不是在谈论任何特定的操作系统

【问题讨论】:

  • 内存顺序+缓存一致性对于您描述的问题应该是不必要的。所以你可能只需要冲洗不连贯的东西?
  • 辅助 CPU 从缓存关闭开始,在那个阶段缓存一致性不适用
  • The manual 在 D4.4.7 下说:“可以定义缓存维护指令的点取决于指令是通过 VA 操作还是通过 set/way 操作。对于通过 set/ 操作的指令方式,重点被定义为下一级缓存。”所以看起来清洁 L1 后跟 L2 确实是预期/正确的顺序。
  • @Siguza,这就是我想要的。你能把它作为答案吗

标签: hardware cpu-architecture arm64 cpu-cache armv8


【解决方案1】:

ARMv8 Reference Manual 在 D4.4.7 下说:

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

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

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

【讨论】:

    猜你喜欢
    • 2011-11-06
    • 1970-01-01
    • 1970-01-01
    • 2014-12-29
    • 2011-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多