割り込みを中断する

割り込みを中断する

割り込み処理がどのように機能するかはわかっています (モードの切り替え、レジスタの保存、スタックの変更など)。ただし、ユーザー モードではなくカーネル モードのときに割り込みが発生した場合はどうなるのか疑問に思います。

答え1

まったく同じです。ただし、割り込みを処理している場合は何も起こらないか、完了するまで何も起こらない可能性があります。

あらゆるケースで私たちが行うこと:

  • 無条件にモードを保存し、モードをスーパーバイザ モードに設定します (ハードウェアによって実行されます。割り込みによってトリガーされます)
  • 無条件に状態を保存し、スタックを切り替える
  • 割り込みコードを実行する
  • 無条件にスタックを元に戻し、状態とモードを復元します。

「モードをスーパーバイザー モードに設定する」というフレーズは、次のいずれかとして解釈できます。

  • モードがスーパーバイザー モードであることを確認します。
  • ステータスレジスタのSビットに1を書き込む

割り込みを中断する

割り込み優先度レベルは複数(ただし有限)ある可能性があります。各レベルにスタックがあります。割り込みは、優先度の高い割り込みによってのみ中断されます。優先度の低い割り込みは、優先度の高い割り込みによってブロックされます。これにより、スタックが破損しないという問題だけでなく、ほとんどの問題が解決されます。

ただし、優先度の低い割り込みはブロックされる可能性があります (ユーザー プロセスを含む。これらは最も低い割り込み優先度です)。したがって、特に優先度の高い割り込みの場合は、割り込みが高速 (コードがあまり多くない) であることを確認することが重要です。ジョブを完了して終了し、優先度の低い割り込み (ユーザー プロセスなど) で時間のかかる部分を実行します。

スタック

プロセスがカーネルを呼び出すとき (同期呼び出し: プログラムのコード内で syscall を使用する)、カーネルはプロセスと同じスタックを使用できます。

カーネルには、割り込みの優先度レベルごとにスタックも存在します。割り込みの中断に関するセクションを参照してください。

関連情報