ARM64架构下LDAXRB与STXRB指令相关技术问题咨询
ARM64原子指令相关技术问题解答
代码示例
C代码(VS C++ 2022编译)
long v = 0; _interlockedbittestandset_acq(&v, 0);
编译生成的ARM64汇编代码
str wzr, [sp] ; store 0 in the variable mov x10, sp lbl: ldaxrb w9, [x10] ; load byte from [x10] into w9, set exclusive access orr w8, w9, #1 ; w8 = w9 | 1 stxrb wip1, w8, [x10] ; store byte from w8 in [x10], only if exclusive access cbnz wip1, lbl ; jump back to 'lbl' if wip1 != 0 (or, if we didn't have "exclusive access") dmb ish ; "acquire" memory barrier, or _acq part of the intrinsic
技术问题解答
独占访问信息的存储位置
ldaxrb标记的独占访问信息存储在CPU核心内部的**独占监视器(Exclusive Monitor)**中,这是CPU硬件层面的专用存储结构,不属于内存地址空间,每个CPU核心通常有自己的独占监视器,用来跟踪当前核心发起的独占访问地址范围。改变独占访问状态的操作
- 执行
stxrb/stxr这类独占存储指令:无论存储成功或失败,独占监视器的独占状态都会被清除。 - 其他核心对同一内存地址执行写操作:会触发独占监视器状态失效,当前核心的独占访问状态被清除。
- 调试暂停、中断、异常等操作:这类操作会让CPU退出独占访问上下文,自动重置独占监视器状态。
- 非独占加载/存储指令访问同一地址范围:也会破坏当前的独占访问状态。
dmb ish指令的作用
这条指令是获取语义(Acquire)的内存屏障,属于ARM的DMB(数据内存屏障)指令,ish表示作用于内部共享域(同一芯片内CPU核心共享的内存域)。它的作用是:
- 确保
dmb ish之前的所有内存访问(包括本次原子操作的存储)完成后,才允许执行后续的内存访问操作,避免指令重排。 - 保证多线程环境下,本次原子操作的结果对其他核心的后续内存访问可见性符合获取语义,即后续加载操作不会看到早于本次原子操作的存储结果,维持内存访问顺序一致性。
- 调试单步时循环跳转的现象解释
调试器的单步执行会触发CPU的调试暂停,当CPU进入调试暂停状态时,会自动重置当前核心的独占监视器状态。也就是说,执行ldaxrb后触发单步中断,CPU的独占访问标记已被清除,此时执行stxrb会因无有效独占状态而失败,wip1被设为非0值,导致cbnz指令跳转回循环起点,出现持续跳转的现象。
内容的提问来源于stack exchange,提问作者c00000fd
相关产品推荐
相关产品推荐

