Folia
← 返回头版

AArch64架构中ldaxr指令异常:缓存配置问题根源探明

在为自研操作系统floss实现自旋锁时,开发者遭遇了一个硬件兼容性问题。1ldaxr(负载独占读取)指令在QEMU模拟器中运行正常,但在树莓派5硬件上触发数据异常。1具体表现为Data Abort exception,其异常代码(EC值)为37(0x25)。1

经过深入调查Arm文档和Cortex-A76 CPU的实现细节,问题根源得以确认:全局缓存控制寄存器SCTLR.C默认为禁用(值为0),且内存属性未配置为Write-Back模式。1根据Arm规范,原子操作需要内存属性为Inner Shareable、Inner Write-Back、Outer Write-Back Normal memory。1当这些条件不满足时,Cortex-A76 CPU无法通过全局独占监视器执行独占访问操作。1

Cortex-A76 CPU文档指出:"页面仅当Inner和Outer内存属性都为Write-Back时才可缓存,其他情况下降级为Non-cacheable Normal memory"。1开发者通过将SCTLR.C位设置为1来启用缓存后,树莓派5上的异常消失。1此外,QEMU在v8.2.2升级到v11.1.50版本后加入了设备内存对齐检查,这解释了模拟器之前未能发现该问题的原因。1


评论