ldaxr 为何在真实硬件上失效?

When Ldaxr Doesn't Work: Exclusive Accesses and Cacheability on AArch64

在开发 AArch64 操作系统 floss 时,我遇到了一个棘手问题:在 QEMU 模拟器中运行完美的自旋锁,一旦部署到真实的 Raspberry Pi 5 硬件上,执行 ldaxr 指令就会触发 Data Abort 异常。经过深入排查,我发现问题的根源在于系统控制寄存器 SCTLR 中的 C 位未被置位,导致数据缓存被全局禁用。即便内存属性配置为 Normal 类型,只要缓存未开启,独占访问指令就会因无法保证原子性而失败。这一经历揭示了模拟器与真实硬件在内存一致性模型上的微妙差异,也提醒我们在底层开发中必须严格遵循 Arm 架构对缓存和内存属性的要求。

当数据缓存被禁用时,所有对可缓存内存的加载和存储指令都会被当作非缓存处理,并且与集群中其他核心的缓存不一致。

同日更多故事

2026-10-11