【问题标题】:Linux Interrupt HandlingLinux 中断处理
【发布时间】:2016-02-18 01:49:59
【问题描述】:

我正在尝试了解 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; 
}

【问题讨论】:

  • 有相关的代码可以发一下吗?你一直在看什么?没有任何上下文,我们无法为您提供帮助。
  • Antiduh,我指的是在handle_IRQ_event函数的末尾使用local_irq_disable调用。?
  • 我知道。在您的问题中发布一些代码。 stackoverflow.com/help/mcve
  • 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();做{状态|=动作->标志; retval |= action->handler(irq, action->dev_id, regs);行动=行动->下一步; } 而(动作); if (status & SA_SAMPLE_RANDOM) add_interrupt_randomness(irq); local_irq_disable();返回 retval; }
  • 以上是LLD3中handle_IRQ_event函数的实现。请让我知道这是否足够?

标签: linux-kernel linux-device-driver embedded-linux


【解决方案1】:

来自 LDD3 的 handle_IRQ_event 版本似乎来自 2.6.8 内核,或者可能更早。假设我们正在处理 x86,处理器在调用中断处理程序之前清除 EFLAGS 寄存器中的中断标志 (IF)。 iret 指令将恢复旧的 EFLAGS 寄存器。

Linux 的SA_INTERRUPT IRQ 处理程序标志(现已过时)确定中断处理程序中是否允许更高优先级的中断。 SA_INTERRUPT 标志设置为禁用中断的“快速”中断处理程序。 SA_INTERRUPT 标志没有为重新启用中断的“慢”中断处理程序设置。

不管SA_INTERRUPT 标志如何,do_IRQ 本身在禁用中断的情况下运行,并且在调用handle_IRQ_event 时它们仍然被禁用。由于handle_IRQ_event 可以启用中断,最后对local_irq_disable 的调用确保它们在返回do_IRQ 时再次被禁用。

2.6.8内核中i386架构的相关源码文件为arch/i386/kernel/entry.Sarch/i386/kernel/irq.c

【讨论】:

  • 伊恩,谢谢你的解释。
猜你喜欢
  • 2012-06-07
  • 1970-01-01
  • 2015-05-09
  • 1970-01-01
  • 2018-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-19
相关资源
最近更新 更多