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

ARM SMP架构下其他核读取操作是否会清除ldrex独占状态?

ARMv7-A/AArch64 SMP内核中LDREX独占状态与跨核读操作的影响

核心疑问

编写运行于ARMv7-A或AArch64架构的SMP内核汇编程序时,已关闭本核IRQ(中断不会清除LDREX的独占状态)。已知其他核对目标地址的写操作会清除独占状态,但不确定其他核仅执行**读操作(如LDR/LDREX)**是否会清除该状态?

具体场景代码

int x = 0;

core0:
    local_irq_disable();
    int tmp = __ldrex(&x);
    if (tmp)
        return;
    if (__strex(&x, 1)) { // 写入失败
        assert(READ_ONCE(x));  // 该断言是否总能成功?
    }

core1/core2或其他核:
    这些核可能处于用户态或内核态,可能读取或写入变量x。若对x执行写操作,必须原子写入非零值。

ARM架构参考手册相关内容(ARMv7-A/R版本A3.4.2章节)

手册中缺少以下条目:

  • Load(Tagged_address,!n) in Exclusive Access state
  • LoadExcl(Tagged_address,!n) in Exclusive Access state

同时手册中的注释翻译如下:

架构不要求其他处理器执行的非Load-Exclusive类加载指令对全局监视器产生任何影响。
Load-Exclusive指令仅能更新执行该指令的处理器对应的可共享内存地址标签。

问题解答

  1. 其他核的普通读操作(LDR)不会清除本核LDREX的独占状态
    根据手册注释,非独占加载指令不对全局监视器产生影响,因此core1/core2执行普通LDR读取x时,core0的LDREX独占状态不会被清除。

  2. 其他核的LDREX操作也不会清除本核的独占状态
    手册明确说明,LDREX仅会更新自身处理器的地址标签,不会影响其他核的独占状态。所以其他核执行LDREX读取x时,core0的独占状态依然保留。

  3. 断言assert(READ_ONCE(x))总能成功
    core0的STREX失败的唯一触发条件是其他核对x执行了写操作(写操作会触发全局监视器清除独占状态)。而题目明确要求其他核写x时必须原子写入非零值,因此此时x必然是非零的,断言总能成立。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 20:38:12