【问题标题】:what is clean state in L2 cache?L2 缓存中的干净状态是什么?
【发布时间】:2015-02-21 21:58:01
【问题描述】:
在 ARM 架构中阅读 CPU 关闭序列时,我发现了以下步骤:
- 节省每个 CPU 外设(IC、VFP、PMU)
- 保存 CPU 寄存器
- 清理 L1 D 缓存
- 来自 L2 的干净状态
- 禁用 L1 D-cache 分配
- 清理 L1 D 缓存
- 退出一致性
- 调用
WFI(等待中断)
干净的 L1 是什么意思?是否意味着删除L1的所有内容?
L2 的干净状态是什么意思?
【问题讨论】:
标签:
linux-kernel
arm
power-management
cpu-cache
【解决方案1】:
什么是干净的?
Clean,在 ARM Cortex-A 文档中,通常表示 flush(将脏缓存行写入下一级)。它仅对Dcache 或统一缓存 有效。有时我们需要 clean 和 invalidate(清除缓存)。如果某些其他实体(总线主设备/外围设备)可能会更改内存,这一点很重要。通常,总线 (AXI) 具有避免这种情况的机制。另外,如果你更新主存中的代码并且有以前的 I-cache 数据,你需要invalidate它。
为什么要多次清理?
您需要清理 L1 以确保数据在 L2 中(已刷新),以便您随后可以清理 L2。当我们禁用 L1 DCache 时,您可能会从 L1 中的 L2 刷新操作中获得一些陈旧数据。我不完全确定他们为什么在第 6 步中说干净而不是无效。您没有给出确切的 ARM CPU,这些详细信息因类型而异。看起来这可能是带有外部 L2C-310 的 Cortex-A5/A8/A9。
第 2 次 L1 清理是由于两级缓存之间的竞争。它在 Cortex-A 技术参考手册 (TRM) 之一中进行了描述。我会听从他们的建议,因为它可能会避免一些罕见的极端情况,而且这种类型的代码很难调试。必要时关机/挂起/休眠会禁用所有调试设备,并且很难像启动代码一样进行故障排除。