首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Linux中断处理

Linux中断处理
EN

Stack Overflow用户
提问于 2016-02-16 11:19:35
回答 1查看 805关注 0票数 3

我正在尝试理解Linux的中断处理机制。我试着用谷歌搜索了一下,但没有找到这个问题的答案。有没有人能给我解释一下为什么handle_IRQ_event最后要调用local_irq_disable?在此之后,控制返回到do_irq,它最终将返回到入口点。那么谁将重新启用中断呢?这是中断处理程序的责任吗?如果是这样,为什么会这样呢?

编辑

供参考的代码

代码语言:javascript
复制
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; 
}
EN

回答 1

Stack Overflow用户

发布于 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.Sarch/i386/kernel/irq.c

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35423063

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档