在armv8汇编中,为什么它对一个地址做ldr,然后同步屏障,然后又对同一个地址做ldaxr?

问题描述

我看过这段代码(来自 arm),它基本上是在内存中增加一个变量,其他 PE(处理元素或线程)也在做同样的事情。因此,多个PE访问内存上的相同数据是一个临界区问题。

not_exec_core:
                // Increment the sync variable to indicate this core is waiting
                ldr     x0,=core_sync
core_waiting:
                ldr     w1,[x0]                // pull line into cache
                dsb     sy
                isb
                ldaxr   w1,[x0]
                add     w1,w1,#1
                stlxr   w2,[x0]
                cbnz    w2,core_waiting
                sev

核心首先将数据加载到 w1 寄存器中,注释说“将行拉入缓存”,我可以理解。然后给出数据和指令同步命令。所以缓存行已为这个 PE 填充(对于其他 PE 可能也这样做)。但是为什么它使用 ldaxr 指令(这是独占的原子方法)再次加载变量?为什么它不首先使用 ldaxr?
增加值并以原子方式将其写回,如果不成功,则返回 core_waiting: 尝试增加值。
如果有人对此做出解释,我将不胜感激。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)