您可以知道您处于硬件中断中,因为 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() 返回非零值。