树莓派4B使用__sync_add_and_fetch触发sError中断,如何启用独占内存事务?
问题
在树莓派4B上,使用gcc的__sync_add_and_fetch对整数做原子递增操作时,生成了如下汇编代码:
172e4: c85f7e60 ldxr x0, [x19] 172e8: 91000400 add x0, x0, #0x1 172ec: c801fe60 stlxr w1, x0, [x19] 172f0: 35ffffa1 cbnz w1, 172e4 <kernel_start+0xc4> 172f4: d5033bbf dmb ish
已启用MMU,内存配置为MAIR属性0xff的普通内存,页表映射设为内部和外部可共享。可以非独占方式读写该内存,但运行上述代码时,ldxr指令触发sError中断(类别0x2f),ISS为0x2,根据《Exception Syndrome Register, EL1》文档,这是外部访问时的SLVERR。
根据《Arm Cortex®-M7 Processor》文档,该情况的触发原因:
系统中无法处理独占事务的AXI从设备,在响应独占读时返回OKAY。这也会被视为外部错误,处理器会将其当作SLVERR响应处理。
请问是否需要执行特定操作来启用独占内存事务?
回答
- 无需额外启用独占事务,但要确认内存区域的支持性
树莓派4B的BCM2711内存控制器原生支持DDR区域的独占事务,但如果你的内存映射指向片上外设或非DDR区域,这类区域通常不支持独占访问,会触发SLVERR。先确认页表映射的物理地址属于DDR范围。 - 修正页表共享属性
你提到的"内部和外部可共享"可能对应了错误的SH字段值。独占事务需要页表描述符的SH位设为0b11(Outer Shareable),而非Inner Shareable。错误的共享属性会导致内存控制器无法正确处理独占读事务,返回SLVERR。 - 验证MAIR内存类型
MAIR 0xff对应Normal WB RA WA内存,这是支持独占事务的,但要确保内存类型不是Device Memory——Device类型内存完全不支持独占操作,若误配会直接触发错误。 - 检查系统寄存器配置
确认SCTLR_EL1的字节序设置与内存访问一致,同时ACTLR_EL1未禁用缓存或独占事务相关功能(树莓派4B默认初始化一般没问题,但自定义内核需核对)。 - 硬件排查(最后选项)
若软件配置全正确仍报错,再考虑硬件层面问题(如DDR故障),但此情况概率极低。
内容的提问来源于stack exchange,提问作者freewill
相关产品推荐
相关产品推荐

