You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

技术问题解答

  1. 独占访问信息的存储位置
    ldaxrb标记的独占访问信息存储在CPU核心内部的**独占监视器(Exclusive Monitor)**中,这是CPU硬件层面的专用存储结构,不属于内存地址空间,每个CPU核心通常有自己的独占监视器,用来跟踪当前核心发起的独占访问地址范围。

  2. 改变独占访问状态的操作

  • 执行stxrb/stxr这类独占存储指令:无论存储成功或失败,独占监视器的独占状态都会被清除。
  • 其他核心对同一内存地址执行写操作:会触发独占监视器状态失效,当前核心的独占访问状态被清除。
  • 调试暂停、中断、异常等操作:这类操作会让CPU退出独占访问上下文,自动重置独占监视器状态。
  • 非独占加载/存储指令访问同一地址范围:也会破坏当前的独占访问状态。
  1. dmb ish指令的作用
    这条指令是获取语义(Acquire)的内存屏障,属于ARM的DMB(数据内存屏障)指令,ish表示作用于内部共享域(同一芯片内CPU核心共享的内存域)。它的作用是:
  • 确保dmb ish之前的所有内存访问(包括本次原子操作的存储)完成后,才允许执行后续的内存访问操作,避免指令重排。
  • 保证多线程环境下,本次原子操作的结果对其他核心的后续内存访问可见性符合获取语义,即后续加载操作不会看到早于本次原子操作的存储结果,维持内存访问顺序一致性。
  1. 调试单步时循环跳转的现象解释
    调试器的单步执行会触发CPU的调试暂停,当CPU进入调试暂停状态时,会自动重置当前核心的独占监视器状态。也就是说,执行ldaxrb后触发单步中断,CPU的独占访问标记已被清除,此时执行stxrb会因无有效独占状态而失败,wip1被设为非0值,导致cbnz指令跳转回循环起点,出现持续跳转的现象。

内容的提问来源于stack exchange,提问作者c00000fd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 04:42:05