5

Unreliable Guide To Hacking The Linux Kernelは次のように述べています。

in_irq() が true を返すため、ハードウェア割り込み中であることがわかります。
注意。割り込みが無効になっている場合、これは誤検知を返すことに注意してください (以下を参照)。

in_irq()x86 の Linux カーネル 2.6.32 以降では、hardirq コンテキストでゼロ以外を返す可能性があるのは本当ですか?

カーネル 2.6.32 (Debian 6) および 3.4 (OpenSUSE 12.1) での私の実験では、プロセス コンテキストから呼び出された場合、 と の間でin_irq()呼び出された場合でも常に 0 を返しました。の代わりに割り込みを無効にするスピンロック関数を使用した場合、結果は同じでした。local_irq_disable()local_irq_enable()local_irq*

in_irq()カーネルのソース コードから、どのように偽陽性を返すことができるのか、現在のところわかりません。誰でもこれを明確にできますか?

編集:私はまた、スピンロック API と / の両方を試しまし*_irqsave()*_irq()local_irq_save()local_irq_restore()結果は同じでした。つまりin_irq()、割り込みが無効になっているときに 0 が返されました。x86 でマシン命令を介して明示的に割り込みを無効にしてcliも、in_irq() がゼロ以外を返すことはありませんでした。

4

1 に答える 1

3

in_irq()これは構造体の int であり、値 0 はプリエンプトpreempt_countthread_infoれていないことを意味するため、irq にはありません。

local_irq_disable()自体はそのカウントに影響しませんが、影響するため、誤検出につながる可能性があります。スピンロック関数を使用したとのことですが、これを使用しましたか? その場合は、preempt_count の値が変化しているかどうかを確認してください。spin_lock_irqsave()

編集:すべてのベースをカバーするために、カーネルプリエンプションが有効になっていることを確認してください。

于 2013-02-12T16:00:52.350 に答える