当我们使用irq_set_chained_handler时,当我们为关联的处理程序提供服务时,irq行不会被禁用,就像request_irq一样.
中断如何设置无关紧要.发生任何中断时,在中断处理程序期间将禁用所有中断(对于此CPU).例如,在ARM体系结构中,首先在C代码中找到中断处理asm_do_IRQ()
函数(在中定义arch/arm/kernel/irq.c
).它是从汇编代码调用的.对于任何中断(它是否被请求request_irq()
或通过irq_set_chained_handler()
)相同的asm_do_IRQ()
函数被调用,并中断被禁止自动ARM CPU.有关详情,请参阅此答案.
此外,值得一提的是,前一段时间Linux内核提供了两种类型的中断:"快速"和"慢速"中断.快速中断(使用IRQF_DISABLED
或SA_INTERRUPT
标记时)运行时禁用中断,这些处理程序应该非常简短快速.另一方面,缓慢的中断正在运行重新启用的中断,因为缓慢中断的处理程序可能需要花费大量时间来处理.
在Linux内核的现代版本中,所有中断都被视为"快速",并且在禁用中断的情况下运行.具有大型处理程序的中断必须实现为线程化(或在ISR中手动启用中断local_irq_enable_in_hardirq()
).
通过此提交在Linux内核v2.6.35中更改了该行为.你可以在这里找到更多相关细节.