6

以下是 ARM 手册中的示例自旋锁实现。请在此处查看:http: //infocenter.arm.com/help/topic/com.arm.doc.genc007826/Barrier_Litmus_Tests_and_Cookbook_A08.pdf 。关于“使用带有锁的等待事件 (WFE) 和发送事件 (SEV)”的部分。

锁码:

Loop:
     LDREX R5, [R1]       ; read lock
     CMP R5, #0           ; check if 0
     WFENE                ; sleep if the lock is held
     STREXEQ R5, R0, [R1] ; attempt to store new value
     CMPEQ R5, #0         ; test if store suceeded
     BNE Loop             ; retry if not
     DMB ; ensures that all subsequent accesses are observed after the
         ; gaining of the lock is observed
         ; loads and stores in the critical region can now be performed

解锁代码:

     MOV R0, #0
     DMB          ; ensure all previous accesses are observed before the lock is cleared
     STR R0, [R1] ; clear the lock.
     DSB ; ensure completion of the store that cleared the lock before sending the event
     SEV

问题:为什么使用 STREXEQ?如果使用 STREX 会怎样?据我了解,strexeq 只有在设置了 EQ 标志时才会执行。但是不管怎样,如果没有设置 EQ,那么 WFENE 会确保我们在等待事件吗?那么 STREX EQ是不是不必要的呢?

提前致谢!

4

2 回答 2

6

不,WFE 没有您认为的保证。ARM 手册描述了一大组事件,这些事件必须使您从 WFE 中退出,但允许内核因其他原因唤醒。例如,允许内核在其 WFE 实现上实现超时。这些事件与 WFI 的事件相同,只是添加了一些执行 SEV 指令的处理器。然而,它没有任何保持睡眠的要求。事实上,NOP 是一种架构上有效的 WFE 实现,尽管它耗电。假设您因为看到 SEV 而醒来,这绝不是安全的。例如,可能发生了中断,处理器处理了中断并将控制权返回给线程。然后线程执行系列中的下一条指令,STREX。

于 2013-05-02T03:49:21.823 回答
1

SEV、WFI 和 WFE 是 CPU 的省电提示,它们与内存同步无关。此外,WFE / SEV 也不会以某种方式相互耦合。

ARM ARM

A8.8.168: 发送事件是一个提示指令。它导致一个事件被通知给多处理器系统中的所有处理器。

A8.8.425: WFI指令提示在处理器发生中断或类似异常之前无需执行任何操作。

A8.8.424: WFE指令提供了一个提示,即在任一 SEV 指令生成事件之前无需执行任何操作。

于 2013-05-02T06:49:36.597 回答