ARM同步指令之LDREX和STREX

时间:2021-01-16 01:20:49

LDREX和STREX和ldr、str指令很像,就像是派生出来的。。。。

功能很强大。。。

用来做同步。。。比如linux atomic原子操作就是用该指令完成的。。

它就是独占机制。。。。。。

用法

LDREX Rx ,[Ry]
将Ry寄存器指向的内存单元处的值读取出来放到Rx寄存器中,并标记[Ry]单元处的内存单元为Exclusive Access state…….

STREX Rx ,Ry,[Rz]
将Ry寄存器中的值读出来放到Rz指向的内存单元处,如果Rz内存单元的状态为Exclusive Access state,则Rx的值将会被赋值为0,而如果Rz内存单元的状态为Open Access state的话,Rx的值将会被赋值为1。。。。。。并且Ry的值也不会被加载到Rz指向的内存单元中。也就是指令失败

看到这里,大概懂了吧,怎么实现独占。

也就是先用LDREX指令然后对内存单元进行标记,完成动作之后,在用STREX清除内存标记。这里先不讲它是怎么实现同步的,如果想知道请看另外一篇内核同步原子操作的文章。

这里主要讲机制。

arm的内部对内存的属性有 共享 和 非共享
共享:在多核处理器中,可以被多个CPU访问。
非共享:只能由一个CPU访问。

所以怎么对内存进行标记呢?

arm 用了两个东东来实现。分别是Local monitor 和 Global monitor。
他们

Local monitor : 对非共享内存和共享内存都会使用到,是对该CPU本地的内存进行标记。

Global monitor : 对共享内存使用,也就是多个CPU都依赖于Global monitor。

这里举个例来理解,这里 CPU1 有两个线程,CPU2有一个线程,他们都要对同一块共享内存进行访问。但时间不一样
ARM同步指令之LDREX和STREX

首先CPU3 thread3 使用ldrex ,此时Global monitor内存标识为Exclusive Access state,CPU3 的Local monitor 为Exclusive Access state,然后CPU1 使用LDREX,此时CPU1的Local monitor 也为Exclusive Access state ,然后CPU1 的thread2 也是同样。
之后。。。。。。。。CPU1 的 thread1 执行strex ,此时Local monitor的状态变为 Open Access state,Global monitor 也被变为Open Access state。 然后Cpu2 的thread3 的local monitor 为Exclusive Access state 但是 Global 为Open Access state.所以指令执行失败。。。。。最后是CPU1的thread2 。global monitor 为Open Access state。。。所以指令执行失败。

Thats all thanks!