微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决在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 举报,一经查实,本站将立刻删除。