1. 关中断
可以通过下面两个函数中的其中任何一个
关闭当前处理器上的所有中断处理,
这两个函数定义在 <asm/system.h>中:
void local_irq_save(unsigned long flags);
void local_irq_disable(void);
local_irq_save的调用把当前的中断状态(开或关)保存到flags中,然后禁用当前处理器上的中断。注意, flags 被直接传递, 而不是通过指针来传递,这是由于
local_irq_save被实现为宏
。
local_irq_disable不保存状态而关闭本地处理器上的中断发送; 只有我们知道中断并未在其他地方被禁用的情况下,才能使用这个版本。
2. 开中断
可通过如下函数打开中断:
void local_irq_restore(unsigned long flags);
void local_irq_enable(void);
local_irq_restore将
保存的flags状态值恢复(即
local_irq_save的入参flag
), 恢复之前的状态(开或关)。
local_irq_enable则无条件打开中断。
在一个关闭中断的环境中调用
local_irq_disable和
local_irq_enable后会破坏之前的中断响应状态。尽管调用
local_irq_disable前是关中断的环境,但是在调用
local_irq_enable后却变成开中断,这显然不是我们希望的
。
调用
local_irq_restore后不一定会开启中断,只会恢复调用
local_irq_save之前的中断状态,如果调用
local_irq_save之前是开中断,那么就打开中断;
如果调用
local_irq_save之前是关中断,那么就关闭中断。
所以
local_irq_save和
local_irq_restore会更安全。
没有方法全局禁用整个系统的所有中断。 内核开发者认为关闭所有中断的代价太高,因此没有必要提供这个能力。