#definenop() __asm__ __volatile__("nop")#defineRISCV_FENCE(p, s)\__asm__ __volatile__("fence "#p","#s:::"memory")/* These barriers need to enforce ordering on both devices or memory. */#definemb()RISCV_FENCE(iorw,iorw)#definermb()RISCV_FENCE(ir,ir)#definewmb()RISCV_FENCE(ow,ow)/* These barriers do not need to enforce ordering on devices, just memory. */#define__smp_mb()RISCV_FENCE(rw,rw)#define__smp_rmb()RISCV_FENCE(r,r)#define__smp_wmb()RISCV_FENCE(w,w)
riscv
fence sync thread
fence.i sync instr & data
sfence.vma virtual memory fence
armv8
dmb data memory barrier
dsb data sync barrier
isb instruction sync barrier
armv7
dmb data memory barrier
在DMB之后的显示的内存访问执行前,保证所有在DMB指令之前的内存访问完成。
dsb data sync barrier
等待所有在DSB指令之前的指令完成(之后再执行后续的指令,译注)。
isb instruction sync barrier
清除(flush)流水线,使得所有ISB之后执行的指令都是从cache或内存中获得的(而不是流水线中的)
armv6
dmb
dsb
PrefetchFlush
The PrefetchFlush instruction flushes the pipeline in the processor,
so that all instructions following the pipeline flush are fetched
from cache or memory after the instruction has been completed.