您可以知道您处于硬件中断中,因为 in_irq() 返回 true。
小心。请注意,如果禁用中断,这将返回误报(见下文)。
在 Linux 内核 2.6.32 或 x86 上的更新版本中,是否真的in_irq()可能返回非零而不是在 hardirq 上下文中?
在我对内核 2.6.32 (Debian 6) 和 3.4 (OpenSUSE 12.1) 的实验中,in_irq()从进程上下文调用时总是返回 0,即使它是在 和 之间调用local_irq_disable()的local_irq_enable()。当我使用禁用中断而不是local_irq*.
从内核的源代码中,我目前看不到如何in_irq()返回误报。有人可以澄清一下吗?
编辑:我也尝试了*_irqsave()和*_irq()spinlock API 以及local_irq_save()/ local_irq_restore(),结果是一样的,也就是说,in_irq()当中断被禁用时返回 0 。通过 x86 上的机器指令显式禁用中断cli也不会强制 in_irq() 返回非零值。