2

最近、オンライン投稿で次のようなメモを見つけました。

最新のカーネルでは、高速割り込みと低速割り込みの違いのほとんどがなくなりました。残っているのは 1 つだけです。高速割り込み (SA_INTERRUPT フラグで要求されたもの) は、現在のプロセッサで無効になっている他のすべての割り込みで実行されます。2 つのプロセッサが同時に同じ IRQ を処理することはありませんが、他のプロセッサは引き続き割り込みを処理できることに注意してください。

他のオンライン ドキュメントでは、特定の割り込みを処理している間、少なくとも上半分のハンドラーで、他のすべての割り込みが無効になっていることを示唆するステートメントを見つけました。これは上記の引用と矛盾しているようです。私が最も興味を持っているのは、シングル CPU アーム システムのコンテキストです。これらの見解のどれが正しいかについて、誰かが私を啓発できますか? 関連するプロセッサで利用可能な最新バージョンである 2.6.10 カーネルに関して、これで質問していることを付け加えておきます。

同様に、Linux での割り込みの「マスキング」と「無効化」の違いを理解するのに役立ちます。私の調査によると、マスキングは割り込みコントローラー (PIC) で行われますが、無効化は CPU で行うことができます。私の混乱をさらに助長するのは、Linux が機能しdisable_irq()、ARM CPU レベルで「無効化」するのではなく、マスキング、つまり割り込みコントローラ ハードウェアに関連しているように見えるdisable_irq_nosync()という事実です。enable_irq()これは正しいです?

最後に、上半分の割り込みハンドラ内でマスキングを行うことはできないというコメントをオンラインで見つけました。しかし、これが事実である場合、上記の関数呼び出しは上位半分のハンドラーでの使用に適していないことを意味するのではないでしょうか? それでも、上位半分のハンドラーでこれらの関数を使用する例をオンラインで多数見ています。

4

1 に答える 1

2

まず最初に、この用語は具体的なものではないことを理解する必要があります。あるグループが「A」と呼んでいるものを、別のグループが「B」と呼んでいる可能性があります。

一般的に言えば(そしてARMなどについてほとんど知らない)、「マスキング」という用語は、一部の割り込みを(ビット単位で)無効にし、他の割り込みを有効にしたままにするマスクが設定されている場合に使用されます。このマスキングは、当然のことながら、ある種の優先順位で行われる傾向があり (優先度の高い割り込みが処理されている間、優先度の低い割り込みはブロックされます)、一部のハードウェア プラットフォームでは優先度の高いものの一部がハードウェアに実装されています。

そのコンテキストでの「無効化」は、多くの場合、マスキング命令とは異なる命令を使用して、 すべての割り込みをブロックすることを指す傾向があります。

多くのシステムでは、操作の順序は、割り込みが発生するとすぐに割り込みを無効にし (ハードウェアがこれを自動的に行う場合があります)、最小限の状態をすばやく保存し、次にマスクを再調整して再度有効にし、最新の割り込みを処理します。

于 2012-12-01T01:46:10.987 に答える