「Linuxデバイスドライバ第3版」を読んでいたのですが、割り込みハンドラの説明の部分がよくわかりません。明確にしておきたいのは:
上半分と下半分のモデルをよく理解していると思います。それによると、TopHalfが実行されている間は割り込みが無効になり、ハンドラーに再入力できません。
しかし、優先度の高い割り込みについてはどうでしょうか?それらはVanillaLinuxまたは特定のリアルタイム拡張機能でのみサポートされていますか?優先度の低い割り込みが優先度の高い割り込みによって中断された場合はどうなりますか?
Linuxカーネルは(すべてのUNIXカーネルと同様に)再入可能です。つまり、CPUによって複数のプロセスを実行できるということです。彼は、ディスクアクセスの読み取りが致命的な低速のHDDコントローラーによって処理されるまで待つ必要はありません。CPUは、ディスクアクセスが終了するまで他の処理を実行できます(その場合、CPU自体が割り込みをトリガーします)。
一般に、割り込みは、「ネストされた実行」と呼ばれる他の割り込み(プリエンプション)によって中断される可能性があります。アーキテクチャによっては、割り込みを完全に無効にすることで、割り込みなしで(プリエンプティブではなく)実行する必要のある重要な機能がいくつかあります。 x86では、これらは時間に関連する関数です(time.c
、hpet.c
)といくつかのxen
のもの。
割り込みに関する優先度は「すべての割り込みを有効にする」または「すべての割り込みを無効にする」の2つしかないので、「優先度の高い割り込み」は2番目だと思います。これは、Linuxカーネルが割り込みの優先順位に関して知っている唯一の動作であり、リアルタイムの拡張とは関係ありません。
割り込み可能な割り込み(「優先度の低い割り込み」)が他の割り込み(「高」または「低」)によって割り込まれた場合、カーネルは割り込みされた割り込みの古い実行コードを保存し、新しい割り込みの処理を開始します。この「ネスト」は複数回発生する可能性があるため、複数レベルの割り込み割り込みが発生する可能性があります。その後、カーネルは古い割り込みから保存されたコードをリロードし、古い割り込みを終了しようとします。
プリエンプティブではないということは、それらのハンドラーが別の割り込みによって割り込まれないことを意味します。
予測できないハンドラーの場合、最初から中断できないため、再入可能性は問題になりません。
カーネルが何をするかについては、wagの答えを確認してください。彼がこのトピックについて行っているように、コメントすることはできません。