我在网上找到了几个地方,它们声明只要输入中断例程,就“必须”调用 CLREX,我不明白。CLREX状态的文档(添加编号以便于参考):
(1) 清除地址已请求独占访问的执行处理器的本地记录。
(2) 使用该
CLREX
指令将紧密耦合的独占访问监视器返回到其开放访问状态。这消除了对内存的虚拟存储的要求。(3) 是否
CLREX
还清除执行处理器的全局记录,即某个地址已请求独占访问,这是实现定义的。
我在这里几乎什么都不懂。
我的印象是,按照文档中的示例编写一些内容足以保证原子性:
MOV r1, #0x1 ; load the ‘lock taken’ value
try: <---\
LDREX r0, [LockAddr] ; load the lock value |
CMP r0, #0 ; is the lock free? |
STREXEQ r0, r1, [LockAddr] ; try and claim the lock |
CMPEQ r0, #0 ; did this succeed? |
BNE try ; no - try again ------------/
.... ; yes - we have the lock
为什么要清除“本地记录”?我认为
LDREX
/STREX
足以保证从几个中断对地址的原子访问?即 ARM 的 GCC 使用LDREX
/编译所有 C11 原子函数STREX
,我看不到CLREX
在任何地方被调用。第二段指的是什么“虚拟商店的要求”?
全局记录和本地记录有什么区别?多核场景需要全局记录吗?