最近我一直在浏览Go的源代码,特别是runtime/internal/atomic/asm_386.s。 下面是一个internal.atomic.Store64
函数的实现。
// void runtime∕internal∕atomic·Store64(uint64 volatile* addr, uint64 v);
TEXT runtime∕internal∕atomic·Store64(SB), NOSPLIT, $0-12
MOVL ptr+0(FP), AX
TESTL $7, AX
JZ 2(PC)
MOVL 0, AX // crash with nil ptr deref
// MOVQ and EMMS were introduced on the Pentium MMX.
MOVQ val+4(FP), M0
MOVQ M0, (AX)
EMMS
// This is essentially a no-op, but it provides required memory fencing.
// It can be replaced with MFENCE, but MFENCE was introduced only on the Pentium4 (SSE2).
XORL AX, AX
LOCK
XADDL AX, (SP)
RET
该问题与函数中的第二个注释有关。有人可以解释一下XORL AX, AX
如何作为记忆围栏工作吗?
我想这与紧随其后的LOCK
有关,但它是如何工作的呢?
谢谢。
它不是充当内存围栏的XOR
。这是锁定的XADD
指令来做到这一点。XOR
指令清除EAX
,以便XADD
指令实际上不会更改内存的内容。
锁定指令的内存排序行为在此问题的答案中描述:x86 CPU 有多少个内存屏障指令?