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寻址的内存被修改时,过程是这样的:
lr.w执行后,硬件为x20指向的地址打上保留标记,x10加载到内存当前值。- 外部修改操作命中这个地址,硬件检测到后,直接清除当前核心的该地址保留标记。
- 执行
sc.w时,硬件会先检查两个关键条件:- 当前核心是否持有该地址的有效保留标记?
- 目标地址是否和
lr.w的地址完全匹配?
因为保留标记已经被清除,sc.w会执行失败:它不会将x23的值写入内存,而是向x11写入0。
- 紧接着的
bne x11, x0, again会检测到x11为0,触发跳转回到again标签,重新执行lr.w获取最新的内存值,再尝试sc.w,直到保留标记有效且存储成功(此时x11会被写入非0值,循环退出)。
补充说明
- 保留标记的有效性只针对
sc.w的地址匹配检查,只要地址被修改过,不管修改后的值和原来是否一致,保留标记都会被清除,sc.w都会失败。 - 这种机制是硬件级别的,不需要软件额外干预,保证了LR/SC序列的原子性。
内容的提问来源于stack exchange,提问作者user153245
相关产品推荐
相关产品推荐

