关于preempt_enable和 preempt_disable

允许抢占和禁止抢占。

例如:内核态程序和 中断处理程序的互斥

因为中断是异步的(不只要何时发生中断,也即随时可能发生中断),因此如果内核态的程序使用了和中断处理程序中相同的数据结构,那么必须进行互斥访问。


load %r0, counter

add %r0,1//发生中断

store %r0,conter


如果在第二条指令执行时发生中断,而中断处理程序也需要将counter加1等操作,那么counter变量的值就会变得紊乱。

因此,只要非中断处理代码要更新一个与中断处理程序共享的数据结构,那么它就首先禁止中断,执行临界段,然后再重新允许中断。在linux中,如下


preempt_disable();

load %r0, counter

add %r0,1//发生中断

store %r0,conter

preempt_enable();