mfence是一个指令。
在 Linux 上获取它:
1/ 写一个文件 mfence.c
#include <stdio.h>
int main(){
printf("Disass me\n");
asm volatile ("mfence" ::: "memory");
return 0;
}
2/ 编译
gcc mfence.c mfence
3/ 拆卸
objdump -d mfence | grep -A 10 "<main>:"
000000000000063a <main>:
63a: 55 push %rbp
63b: 48 89 e5 mov %rsp,%rbp
63e: 48 8d 3d 9f 00 00 00 lea 0x9f(%rip),%rdi # 6e4 <_IO_stdin_used+0x4>
645: e8 c6 fe ff ff callq 510 <puts@plt>
64a: 0f ae f0 mfence
64d: b8 00 00 00 00 mov $0x0,%eax
652: 5d pop %rbp
653: c3 retq
654: 66 2e 0f 1f 84 00 00 nopw %cs:0x0(%rax,%rax,1)
65b: 00 00 00
4/ 观察到第 64a 行mfence
是(3 位)指令(0f ae f0)
所以这是一条 cpu 指令(如mov
):处理器需要在获取之前解码先前的指令,否则它无法猜测它是对齐的。
例如0f ae f0
,可能出现在地址中,因此 cpu 无法将其用作制造商。
最后,它只是一条老派指令,在其流水线中的执行点,它将在执行下一条指令之前进一步同步流水线中的内存访问。
注意:在 Windows 上使用宏_ReadWriteBarrier
in 来生成 mfence