Linux kernel Linux中断处理
我试图理解Linux中断处理机制。我试着用谷歌搜索一下,但找不到这个问题的答案。有人能给我解释一下为什么handle_IRQ_事件需要在最后调用local_IRQ_disable吗?在此之后,控件返回do_irq,最终返回入口点。那么谁将使中断恢复。?这是中断处理程序的责任吗?如果是,为什么是这样 编辑 参考代码Linux kernel Linux中断处理,linux-kernel,linux-device-driver,embedded-linux,Linux Kernel,Linux Device Driver,Embedded Linux,我试图理解Linux中断处理机制。我试着用谷歌搜索一下,但找不到这个问题的答案。有人能给我解释一下为什么handle_IRQ_事件需要在最后调用local_IRQ_disable吗?在此之后,控件返回do_irq,最终返回入口点。那么谁将使中断恢复。?这是中断处理程序的责任吗?如果是,为什么是这样 编辑 参考代码 asmlinkage int handle_IRQ_event(unsigned int irq, struct pt_regs *regs, struct irqaction *ac
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;
}
LDD3中的
handle\u IRQ\u event
版本似乎来自2.6.8内核,或者可能更早。假设我们处理的是x86,处理器在调用中断处理程序之前会清除EFLAGS寄存器中的中断标志(IF)。旧的EFLAGS寄存器将通过iret
指令恢复
Linux的SA_INTERRUPT
IRQ处理程序标志(现已过时)确定中断处理程序中是否允许更高优先级的中断。SA_中断
标志是为使中断处于禁用状态的“快速”中断处理程序设置的。未为重新启用中断的“慢速”中断处理程序设置SA_中断
标志
不管SA_INTERRUPT
标志如何,do_IRQ
本身在中断被禁用的情况下运行,并且在调用handle_IRQ_event
时,中断仍然被禁用。由于handle\u IRQ\u event
可以启用中断,因此在最后调用local\u IRQ\u disable
可确保在返回do\u IRQ
时再次禁用中断
i386体系结构的2.6.8内核中的相关源代码文件是
arch/i386/kernel/entry.S
,以及arch/i386/kernel/irq.c
是否可以发布相关代码?你一直在看什么?没有任何上下文,我们无法帮助您。Antiduh,我指的是在handle_irq_事件函数的末尾使用local_irq_disable调用。?我知道。在你的问题中发布一些代码。ASMLINKING int handle_IRQ_事件(无符号int IRQ、结构pt_regs*regs、结构irqaction*action){int status=1;int retval=0;如果(!(操作->标志和SA_中断))本地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_interru_randomanness(irq);local_irq_disable();return retval;}以上是LLD3中handle_IRQ_事件函数的实现。请告诉我这是否足够?Ian,感谢您的解释。