当前位置: 首页 > 知识库问答 >
问题:

了解CMPXCHG8B/CMPXCHG16B的工作原理

曹浩
2023-03-14

此指令可与锁前缀一起使用,以允许指令原子执行。为了简化与处理器总线的接口,目的操作数接收一个写周期,而不考虑比较的结果。如果比较失败,则写回目标操作数;否则,将源操作数写入目标。

我很难理解最后一句(但可能也很难理解整个图表)

  • 目标操作数被写回。..写回什么?
  • ...;否则,将源操作数写入目标源操作数是什么?是ecx:ebx吗?据我所知,这个CAS指令只接受一个操作数(内存目标)。

如果有人能重新措辞和/或解释关于无条件写入的这一点,我将不胜感激。

共有1个答案

穆宾白
2023-03-14

与常规CMPXCHG r/m32、r32的措辞相比,应该更有意义,尤其是比较手动条目顶部表单中的简短描述。我已经用dst、src和隐式进行了注释。注意,Intel语法通常是OP dst,src

>

  • CMPXCHG r/m64,r64:比较RAX(隐式)与r/m64(dst)。如果相等,则设置ZF,并将r64(src)加载到R/M64(dst)中。否则,清除ZF并将R/M64(dst)加载到RAX中(隐式)。

    CMPXCHG16B m128比较RDX:RAX和m128(dst)。如果相等,则设置ZF并将RCX:RBX加载到m128(dst)中。否则,清除ZF并将m128加载到RDX:RAX中。

    是的,没错,英特尔的手册用“加载”来描述存储到内存。(对于目标可以是寄存器的CMPXCHG来说,这是稍微合理的,而对于CMPXCHG16b来说则完全不合理。)

    但无论如何,记住这些实现:

    (就C++而言std::atomic。要真正做到原子化,它们需要lock前缀,否则它是一个非原子RMW。C++只能编译为锁CMPXCHG/锁CMPXCHG16b,而不是主流编译器的未锁定的CMPXCHG。)

    目标操作数被写回...写回什么?

    目标的旧值(刚刚加载)被写回。这意味着cmpxchg16b始终是一个写,并且将始终将页面的脏标志标记为脏。(cmpxchg是否在失败时写入目标缓存行?如果不是,它是否比xchg更适合Spinlock?询问它是否真的在CAS失败时在微架构上弄脏了缓存行。我假设是这样,但没有检查过。)

    这在历史上对旧CPU上的lock前缀非常重要,在旧CPU上有一个外部lock#引脚,lock CMPXCHG实际上为整个加载+存储对断言了这个引脚。现代CPU只是在受影响的高速缓存线上保持一个高速缓存锁的持续时间,用于可缓存内存上的对齐锁CAS。这就是为什么手册上说“为了简化与处理器总线的接口,目标操作数接收一个写周期,而不考虑比较的结果。”

    如果比较失败,则写回目标操作数;否则,将源操作数写入目标。(处理器不会在不产生锁定写的情况下产生锁定读。)

    这整段是Intel在编写CMPXCHG16b条目时从CMPXCHG手动条目复制粘贴的;在CX16上下文中不太清楚,因为它有2个隐式操作数,而不是显式源和读写RAX。它没有定义术语“源操作数”。

    在前面的描述中,它确实为该指令定义了“目标操作数”术语

    将edx:eax中的64位值(如果操作数大小为128位,则将rdx:rax中的128位值)与操作数(目标操作数)进行比较

    “the operand”表示显式操作数。这显然是这个意思,因为它是唯一可以是记忆的东西,所以它一定是被比较的东西之一。还有其他线索/原因,从英语如何运作等等。

  •  类似资料:
    • 本文向大家介绍深入了解Java GC的工作原理,包括了深入了解Java GC的工作原理的使用技巧和注意事项,需要的朋友参考一下 JVM学习笔记之JVM内存管理和JVM垃圾回收的概念,JVM内存结构由堆、栈、本地方法栈、方法区等部分组成,另外JVM分别对新生代下载地址  和旧生代采用不同的垃圾回收机制。 首先来看一下JVM内存结构,它是由堆、栈、本地方法栈、方法区等部分组成,结构图如下所示。 JVM

    • 正如标题所解释的,我有一个非常基本的编程问题,但我还没有找到。过滤掉所有(非常聪明的)“为了理解递归,你必须首先理解递归。”各种在线线程的回复我仍然不太明白。 当我们面对不知道自己不知道的事情时,我们可能会提出错误的问题或错误地提出正确的问题。我将分享我的“想法”。我的问题是希望有类似观点的人能够分享一些知识,帮助我打开递归灯泡! 以下是函数(语法用Swift编写): 我们将使用2和5作为参数:

    • 我不明白嵌套for循环是如何工作的。正在执行升序程序,请逐步解释它的工作原理 输出: 之后:

    • 我写了下面的函数(当我读里奇关于C的书时),从命令行获取一行。它做了它应该做的事情,我理解它是如何工作的,但我想深入一点。 我的问题是关于循环的,假设我们有一个空白命令行,它正在等待用户输入内容,因为第一个getchar()在循环中被调用,假设用户输入了以下内容: 我猜接下来会发生什么,是getchar()在arr[]中存储“h”,而用户实际上没有按回车键。 因此如果用户继续键入: 'h''e''

    • 本文向大家介绍SELINUX工作原理详解,包括了SELINUX工作原理详解的使用技巧和注意事项,需要的朋友参考一下 1. 简介 SELinux带给Linux的主要价值是:提供了一个灵活的,可配置的MAC机制。     Security-Enhanced Linux (SELinux)由以下两部分组成:     1) Kernel SELinux模块(/kernel/security/selinux

    • 本文向大家介绍AngularJS 工作原理详解,包括了AngularJS 工作原理详解的使用技巧和注意事项,需要的朋友参考一下  个人觉得,要很好的理解AngularJS的运行机制,才能尽可能避免掉到坑里面去。在这篇文章中,我将根据网上的资料和自己的理解对AngularJS的在启动后,每一步都做了些什么,做一个比较清楚详细的解析。      首先上一小段代码(index.html),结合代码我们来