独占加载和存储臂指令是否会引发死锁?

Do Exclusive load and store arm instruction raise a deadlock?

简单自旋锁是否会引发由独占内存访问指令引起的死锁?

我有一个想法 LDXR/STXR 发生死锁。 这种情况可能吗?

两个核心访问全局变量在几个指令时钟上的差异。 并重复。两个核心都是 运行 相同的代码。

我独家的简单自旋锁组件(图片):

.spin_lock:
    NOP
.stxr_fail:
    LDXR  R0, .data+0
    CMP   R0, #0
    BNE    .spin_lock
    MOV  R0, #1
    STXR  W0, R0, .data+0
    CMP   W0, #0
    BNE   .stxr_fail
    BL       critical_section()
    MOV  R0, #0
    STR     R0, .data+0
    RET 

.data:
    .word lock

image1

多核运行是否发生死锁? (图片):

image2

相同颜色的每一行都是原子步骤。 它以数字步长顺序运行。 这是6~11步发生的死锁。

如果理解有误,请多多指教

是的,抱歉我纠正了....

独占加载将检查是否为零,然后重试直到为零。

.spin_lock:
    NOP
.stxr_fail:
    LDXR  R0, .data+0
    CMP   R0, #0
    BNE    .spin_lock

如果不为零,那么你会得到

load exclusive
store exclusive
check if the store worked.
repeat the whole thing if not.

如果两个高手A和B完美排成一行

loadx a
loadx b
storex a
storex b

Between the Exclusive Read and the Exclusive Write there can be other Non-exclusive transfers.

...

If no other master has written to that location since the Exclusive Read transfer, the Exclusive Write transfer is successful and updates memory.

...

If another master has written to that location since the Exclusive Read transfer, the Exclusive Write transfer is failed and the memory location is not updated.

master a 的 storex 会成功,master b 的 storex 会失败所以 master a 会退出循环。 master b 将继续循环,直到负载 returns 非零。

所以它不能死锁哪怕是一点点。

我必须阅读更多内容(嗯,你应该阅读,因为这是在你的答案所在的 ARM 文档中,Whosebug 不在这里为你阅读文档,这是这个问题的根源)以确认 loadx a , loadx b, storex a 会有一个有效的存储。从上面的引述来看,情况就是这样。如果不是,那么您将处于这样一种情况,即直到一个被中断或出于任何其他原因改变其拍频可能允许另一个主控获得干净的加载存储独占时,它们都不会获得锁定。例如,逻辑是否可以简单地记住最后一个 ldrex 的 id 并将其与下一个 strex

进行比较

The Exclusive Access Monitor must be capable of concurrently monitoring at least one address location for each Exclusive access capable master in the system.

...

A slave that does not support exclusive accesses can ignore the AxLOCK signals. It must provide an OKAY response for both normal and exclusive accesses. A slave that supports exclusive access must have monitor hardware. This specification recommends that such a slave has a monitor unit for each exclusive-capable master ID that can access it. The ARM Architecture Reference Manual, ARMv7-A and ARMv7-R edition defines an exclusive access monitor, and a single-ported slave can have such an exclusive access monitor external to the slave. A multiported slave might require internal monitoring.

这意味着如果从站支持独占访问,那么它必须有一个监视器(必须存储来自先前 ldrex 的 id 并将其与当前 strex 进行比较)。但只建议它每个主控都有一个监视器,所以如果每个主控没有一个监视器,那么你可能会遇到这样的情况

ldrex a, ldrex b, strex a, strex b。 ldrex b 和 strex a 不匹配所以存储不会发生,现在在那种情况下 ldrex b 和 strex b 确实匹配所以我们假设主 b 获得锁离开循环主 a 必须等待主 b 将内存位置(clrex 或者可能是一个简单的 str)。

Arm 有 axi 和 ahb 总线规范以及这些规范的不同修订版,哪个核心与哪个核心相关,可能在该核心的技术参考手册中。为了获得完整的答案,您至少应该尝试将它们匹配起来并阅读您正在使用的核心的正确修订规范,而不是假设它们都完全相同。还要了解 L1 缓存是 arm 核心的一部分,l2 缓存在核心之外,但您可以从 arm 购买 l2(或自己制作),希望 ARM 逻辑支持独占访问,如文档所述。除此之外,你进入了芯片供应商的领域,他们可以实现他们想要破坏或不破坏的东西,真正共享一个人会希望这些访问位于一个公共内存 space 中,由各种内核共享并且没有 L1 或L2 缓存应答并存在一致性问题。芯片供应商可能会选择不支持独占访问,return OKAY。像这样的代码看起来会永远旋转,来自 strex 的 "return value" 只会传递一个 EXOKAY,如果永远不会 returned 因为设计不支持独占访问,那么循环是无限的。去过那里,看到这个,这就是我知道的。一份较旧的文档说单处理器设计不需要独占访问支持,当前版本的规范并没有说他们只是简单地说明了与从设备支持或不支持独占访问相关的内容。

如果 ldrex/strex 锁要工作,你必须对一个支持独占访问的奴隶工作,在这种情况下你有一个监视器或每个主人一个监视器,我相信我已经展示了最坏的情况上面的例子,如果你真的真的真的很幸运 ldrex a, ldrex b, strex a, strex b 两个大师 a 和 b 并且一个应该在第一次通过时获胜。另一个卡住等待 desired/designed。添加更多 masters 并混合它们的加载和存储,你最终会遇到同样的情况,一个会赢,其他人会输,并进入 ldrex 非零循环。现在有趣的是,如果你在那个循环中有两个或更多,那么当一个拥有锁的主人释放它时,你不需要那么幸运,因为其他人争夺锁以获得加载加载存储存储情况。