排他性加载和存储手臂指令会引发死锁吗?

时间:2019-01-09 05:04:01

标签: c linux arm kernel 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步的死锁。

如果我误会了,请解释一下

1 个答案:

答案 0 :(得分:0)

是的,很抱歉我得到纠正。...

独占负载将检查零,然后重试直到其为零。

.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
  

在“独占读取”和“独占写入”之间可以存在其他   非排他性转移。

...

  

自排他以来没有其他主机写入该位置   读取传输,排他写入传输成功并更新   记忆。

...

  

如果自排他以来另一个母版已写入该位置   读取传输,排他写入传输失败,并且内存   位置未更新。

来自主机a的存储将成功,来自主机b的存储将失败,因此主机a将退出循环。主站b将继续循环,直到负载返回非零为止。

所以即使有一点点也无法死锁。

我必须阅读更多内容(好吧,因为这是您回答的ARM文档中的内容,所以stackoverflow并不是在这里为您阅读此问题根源的文档),以确认loadx a,loadx b,storex a将具有有效的商店。从上面的引用中可以看出来。如果不是这样,那么您将处于一种情况,直到一个人被打断或由于其他任何原因改变其拍子频率,都无法获得锁定,这可能会使另一个主乐器获得干净的负载存储独占。例如,逻辑可以简单地记住上一个ldrex的ID并将其与下一个strex进行比较

  

独占访问监视器必须能够同时运行   监视每个互斥访问的至少一个地址位置   系统中能干的人。

...

  

不支持独占访问的从站可以忽略AxLOCK   信号。它必须提供正常和正常的OKAY响应   独占访问。支持独占访问的从站必须具有   显示器硬件。该规范建议这样的从机具有   每个可以访问的具有排他功能的主ID的监视单元   它。 《 ARM体系结构参考手册》,ARMv7-A和ARMv7-R版   定义一个独占访问监视器,一个单端口从属可以   在从属设备外部具有这样的专用访问监视器。一种   多端口从站可能需要内部监视。

这意味着,如果从属服务器支持独占访问,则它必须具有监视器(必须存储先前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核心的一部分,但您可以从arm购买L2(或自行制造),希望ARM逻辑支持文档所述的独占访问。除了进入芯片供应商领域,他们可以实现他们想要破坏的东西,真正共享一个东西时,希望这些访问位于各个内核共享的公共内存空间中,并且不具有L1或L2缓存答案和有连贯性的问题。芯片供应商可能选择不支持独占访问,并会返回OKAY。看起来像这样的代码将永远旋转,如果因为设计不支持互斥访问而从不返回,则strex的“返回值”仅传递给EXOKAY,则循环是无限的。到过那里,看到了,这就是我所知道的。一份较早的文档说,单处理器设计不需要独占访问支持,当前版本的规范并未说它们只是说了有关从站是否支持独占访问的事情。

如果ldrex / strex锁将起作用,那么您必须与支持独占访问的从属服务器一起工作,在这种情况下,您只有一个监视器或每个主机有一个监视器,我相信我已经展示了以上最坏的情况,如果您获得两个大师a和b的ldrex a,ldrex b,strex a,strex b真的很幸运,一个人应该在第一次通过时获胜。另一个则按需要/设计陷入困境。添加更多的母带,并混合它们的负载和存储,您最终会遇到相同的情况,一个将获胜,另一个将丢失,并进入ldrex非零循环。现在有趣的是,如果您在那个循环中有两个或多个,那么当一个拥有锁的主控器释放它时,您不必为其他争夺该锁的其他存储设备而感到幸运。