- 论坛徽章:
- 0
|
回复 17# asuka2001
你们怎么不认真看一下源码呢?关键点在这:
#ifdef CONFIG_X86_32
358 /*
359 * Some non-Intel clones support out of order store. wmb() ceases to be a
360 * nop for these.
361 */
362 #define mb() alternative("lock; addl $0,0(%%esp)", "mfence", X86_FEATURE_XMM2)
363 #define rmb() alternative("lock; addl $0,0(%%esp)", "lfence", X86_FEATURE_XMM2)
364 #define wmb() alternative("lock; addl $0,0(%%esp)", "sfence", X86_FEATURE_XMM)
365 #else
366 #define mb() asm volatile("mfence":::"memory")
367 #define rmb() asm volatile("lfence":::"memory")
368 #define wmb() asm volatile("sfence" ::: "memory")
369 #endif
volatile只是用来告诉编译器不要把本条指令优化,重点是后面的("mfence":::"memory")。
memory强制编译器假设RAM所有内存单元均被汇编指令修改。
mfence:串行化发生在mfence指令之前的读写操作
lfence:串行化发生在mfence指令之前的读操作、但不影响写操作
sfence:串行化发生在mfence指令之前的写操作、但不影响读操作
整条指令的意思就是:每条指令都不能优化,CPU必须且只能在内存中进行数据的读写(间接禁用了cache)。
|
|