禁止本地中断

本文详细介绍了Linux内核中如何通过禁止本地中断来创建临界区,确保内核控制路径的数据结构安全。禁止中断的机制包括使用cli和sti汇编指令,以及local_irq_disable和local_irq_enable宏。同时,文章提到了禁止下半部(可延迟函数)执行的方法,如local_bh_disable和local_bh_enable,以及它们在软中断计数器管理中的作用,以防止并发访问数据结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

禁止本地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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值