对常规内存优化 ,优化过程是透明的,而且效果良好,但是对I/O操作来说这些优化可能造成致命错误,因为它们受边界效应影响。
side effect(译为边际效应或副作用):是指读取某个地址时可能导致该地址内容发生变化,比如,有些设备的中断状态寄存器只要一读取,便自动清零。I/O 寄存器的操作具有side effect,因此,不能对其操作不能使用cpu缓存。
由编译器优化和硬件重新排序引起的问题的解决方法,对硬件必须以特定顺序执行的操作之间设置内存屏障。
void rmb(void);
void smp_wmb(void);//针对SMP系统
在某些架构上,允许把赋值语句和内存屏障进行合并以提升效率
#define set_mb(var, value) do {var = value; mb();} while 0
int a, b;
a = 2;
b = 2;
内存屏障就是禁止屏障两边的指令互相穿越,上述可能先执行b=2再执行a=2。当我们在a=2和b=2指令中间插入一个内存屏障的时候,b操作不会越过a操作。把a变成volatile关键字修饰,它就会插入一个内存屏障,volatile关键字有两个内存语义1.可视性,2.禁止指令重排序。
使用IO端口
内核为我们提供了一个IO注册接口,它告诉内核需要使用firs