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指令仅能更新执行该指令的处理器对应的可共享内存地址标签。
问题解答
其他核的普通读操作(LDR)不会清除本核LDREX的独占状态
根据手册注释,非独占加载指令不对全局监视器产生影响,因此core1/core2执行普通LDR读取x时,core0的LDREX独占状态不会被清除。其他核的LDREX操作也不会清除本核的独占状态
手册明确说明,LDREX仅会更新自身处理器的地址标签,不会影响其他核的独占状态。所以其他核执行LDREX读取x时,core0的独占状态依然保留。断言
assert(READ_ONCE(x))总能成功
core0的STREX失败的唯一触发条件是其他核对x执行了写操作(写操作会触发全局监视器清除独占状态)。而题目明确要求其他核写x时必须原子写入非零值,因此此时x必然是非零的,断言总能成立。
内容的提问来源于stack exchange,提问作者untitled
相关产品推荐
相关产品推荐

