我正在尝试理解Linux的中断处理机制。我试着用谷歌搜索了一下,但没有找到这个问题的答案。有没有人能给我解释一下为什么handle_IRQ_event最后要调用local_irq_disable?在此之后,控制返回到do_irq,它最终将返回到入口点。那么谁将重新启用中断呢?这是中断处理程序的责任吗?如果是这样,为什么会这样呢?
编辑
供参考的代码
asmlinkage int handle_IRQ_event(unsigned int irq, struct pt_regs *regs, struct irqaction *action)
{
int status = 1;
int retval = 0;
if (!(action->flags & SA_INTERRUPT))
local_irq_enable();
do
{
status |= action->flags;
retval |= action->handler(irq, action->dev_id, regs);
action = action->next;
}
while (action);
if (status & SA_SAMPLE_RANDOM)
add_interrupt_randomness(irq);
local_irq_disable();
return retval;
}发布于 2016-02-18 01:50:00
来自LDD3的handle_IRQ_event版本似乎来自2.6.8内核或更早的版本。假设我们正在处理x86,处理器在调用中断处理程序之前清除了EFLAGS寄存器中的中断标志(IF)。旧的标志寄存器将通过iret指令恢复。
Linux处理程序标志(现在已过时)确定在中断处理程序中是否允许更高优先级的中断。SA_INTERRUPT标志是为使中断处于禁用状态的“快速”中断处理程序设置的。对于重新启用中断的“慢”中断处理程序,不设置SA_INTERRUPT标志。
无论SA_INTERRUPT标志如何,do_IRQ本身都会在禁用中断的情况下运行,并且在调用handle_IRQ_event时中断仍处于禁用状态。由于handle_IRQ_event可以启用中断,因此在结束时调用local_irq_disable可确保在返回do_IRQ时再次禁用中断。
用于i386架构的2.6.8内核中的相关源代码文件为arch/i386/kernel/entry.S和arch/i386/kernel/irq.c。
https://stackoverflow.com/questions/35423063
复制相似问题