最近、オンライン投稿で次のようなメモを見つけました。
最新のカーネルでは、高速割り込みと低速割り込みの違いのほとんどがなくなりました。残っているのは 1 つだけです。高速割り込み (SA_INTERRUPT フラグで要求されたもの) は、現在のプロセッサで無効になっている他のすべての割り込みで実行されます。2 つのプロセッサが同時に同じ IRQ を処理することはありませんが、他のプロセッサは引き続き割り込みを処理できることに注意してください。
他のオンライン ドキュメントでは、特定の割り込みを処理している間、少なくとも上半分のハンドラーで、他のすべての割り込みが無効になっていることを示唆するステートメントを見つけました。これは上記の引用と矛盾しているようです。私が最も興味を持っているのは、シングル CPU アーム システムのコンテキストです。これらの見解のどれが正しいかについて、誰かが私を啓発できますか? 関連するプロセッサで利用可能な最新バージョンである 2.6.10 カーネルに関して、これで質問していることを付け加えておきます。
同様に、Linux での割り込みの「マスキング」と「無効化」の違いを理解するのに役立ちます。私の調査によると、マスキングは割り込みコントローラー (PIC) で行われますが、無効化は CPU で行うことができます。私の混乱をさらに助長するのは、Linux が機能しdisable_irq()
、ARM CPU レベルで「無効化」するのではなく、マスキング、つまり割り込みコントローラ ハードウェアに関連しているように見えるdisable_irq_nosync()
という事実です。enable_irq()
これは正しいです?
最後に、上半分の割り込みハンドラ内でマスキングを行うことはできないというコメントをオンラインで見つけました。しかし、これが事実である場合、上記の関数呼び出しは上位半分のハンドラーでの使用に適していないことを意味するのではないでしょうか? それでも、上位半分のハンドラーでこれらの関数を使用する例をオンラインで多数見ています。