禁止本地CPU中断是确保一组内核语句被当作一个临界区处理的主要机制。这个机制的意义是:即使当硬件设备产生了一个IRQ信号时,中断禁止也让内核控制路径继续执行,因此,这就提供了一种有效的方式,确保内核控制路径中的一些中断处理程序能访问的数据结构也受到保护。
1 禁止本地中断
然而,禁止本地中断并不保护运行在另一个CPU上的中断处理程序对该数据结构的并发访问,因此,在多处理器系统上,禁止本地中断经常与自旋锁结合使用。
宏local_irq_disable()使用cli汇编语言指令关闭本地CPU上的中断(x86体系的禁止本地中断位于include/linux/Irqflags.h):
#define local_irq_disable() /
do { raw_local_irq_disable(); trace_hardirqs_off(); } while (0)
//include/asm-i386/Irqflags.h
static inline void raw_local_irq_disable(void)
{
__asm__ __volatile__("cli" : : : "memory");
}
宏local_irq_enable()使用sti汇编语言指令打开被关闭的中断(同样在include/linux/Irqflags.h):
#define local_irq_enable() /
do { trace_hardirqs_on(); raw_local_irq_enable(); } while (0)
//include/asm-i386/Irqflags.h
static inline void raw_l