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

RISC-V架构中sc.w指令如何检测lr.w后目标内存被修改?

RISC-V中条件存储指令(sc.w)如何感知内存被修改?

核心原理:硬件维护的保留集机制

RISC-V的lr.w(加载保留)和sc.w(条件存储)是成对实现原子操作的指令,核心依赖硬件层面维护的保留集(Reservation Set):

  • 当lr.w执行时,硬件会为目标内存地址(这里是x20指向的单元)设置一个独占保留标记,同时完成数据加载到目标寄存器(x10)。这个标记属于当前执行核心,记录了该核心对这个地址的独占访问意图。
  • 只要有任何操作(同一核心的其他写指令、其他核心的写操作、外设的内存写入)修改了这个被标记的内存地址,硬件会立即清除该核心对应的保留标记。

针对给定代码场景的具体流程

看你提供的这段循环代码:

again:
lr.w x10, (x20)       // load-reserved
sc.w x11, x23, (x20)  // store-conditional
bne x11, x0, again    // branch if store fails (0)
addi x23, x10, 0      // put loaded value in x23

当lr.w执行完成后、sc.w执行前,x20寻址的内存被修改时,过程是这样的:

  1. lr.w执行后,硬件为x20指向的地址打上保留标记,x10加载到内存当前值。
  2. 外部修改操作命中这个地址,硬件检测到后,直接清除当前核心的该地址保留标记。
  3. 执行sc.w时,硬件会先检查两个关键条件:
    • 当前核心是否持有该地址的有效保留标记?
    • 目标地址是否和lr.w的地址完全匹配?
      因为保留标记已经被清除,sc.w会执行失败:它不会将x23的值写入内存,而是向x11写入0。
  4. 紧接着的bne x11, x0, again会检测到x11为0,触发跳转回到again标签,重新执行lr.w获取最新的内存值,再尝试sc.w,直到保留标记有效且存储成功(此时x11会被写入非0值,循环退出)。

补充说明

  • 保留标记的有效性只针对sc.w的地址匹配检查,只要地址被修改过,不管修改后的值和原来是否一致,保留标记都会被清除,sc.w都会失败。
  • 这种机制是硬件级别的,不需要软件额外干预,保证了LR/SC序列的原子性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 05:01:24