编译器有时会对代码做一些优化,例如尝试在保证程序执行正确的前提下修改指令顺序或优化ldr/str指令,让程序执行地更快。但是编译器毕竟不能完全猜透人的心思,有时候它做的优化会导致程序运行不符我们的预期。
因此,内核中提供了一些额外的函数,可以插在某段代码里,告诉编译器不要在这里做指令优化。这些函数分为两种:
内存屏障:rmb(), wmb(), mb(),可以防止硬件上的指令重排。除了编译器,有的CPU也支持对指令进行重排来优化程序执行效率,这几个函数就是去防止CPU去做这些事情。rmb()是读访问内存屏障,它保证在屏障(调用rmb()的位置处)之后的任何读操作在执行之前,屏障之前的所有读操作都已经完成。wmb()对应写操作,意思同上。mb()就同时包含读和写操作,意思同上。
优化屏障:barrier(),防止编译器对内存访问的优化,类似volatile关键字对于访问变量的作用。它告诉编译器,在插入barrier()的位置处,内存中的内容都被更新了,你想读变量、映射到内存的寄存器等内容都需要真正到内存里去读,这样就能保证barrier之后的读指令不会被优化掉。
上面第1种屏障是和硬件即CPU特性相关的,那么,如果你的CPU没有指令重排的能力,也就没有必要防止指令重排了。例如,一款CPU不支持写指令重排,那么系统中的wmb()就直接被定义成了barrier()。
还有SMP