Unreliable Guide To Hacking The Linux Kernel指出
You can tell you are in a hardware interrupt, because in_irq() returns true.
Caution. Beware that this will return a false positive if interrupts are disabled (see below).
in_irq()
真的是这样吗?在 x86 上的 Linux 内核 2.6.32 或更新版本中,是否可以在非硬中断上下文中返回非零值?在我对内核 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()
自旋锁 API 以及 local_irq_save()
/local_irq_restore()
,结果都是一样的,即in_irq()
当中断被禁用时返回 0。通过 cli
显式禁用中断x86 上的机器指令也没有强制 in_irq() 返回非零值。
最佳答案
in_irq()
是 looks at some bits in preempt_count
的包装器,这是 thread_info
中的 int struct 并且值为 0 意味着它没有被抢占,所以它不在 irq 中。local_irq_disable()
本身不影响该计数,但 spin_lock_irqsave()
does ,因此可能会导致误报。你说你用过自旋锁功能,你用过这个吗?如果是,请查看 preempt_count 的值是否正在更改。
编辑:只是为了涵盖所有基础,请检查以确保启用内核抢占。
关于linux-kernel - in_irq() 可靠吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14682183/