web-dev-qa-db-ja.com

ソフトウェアおよびハードウェアの割り込みとは何ですか?どのように処理されますか?

ハードウェアとソフトウェアの割り込みの概念を理解しているかどうかはわかりません。

私が正しく理解していれば、ハードウェア割り込みの目的は、CPUマルチタスクの実装の一部であるCPUに注意を向けることです。

  1. 次に、ハードウェア割り込みを発行するものは何ですか?ハードウェアドライバープロセスですか?
  2. はいの場合、ハードウェアドライバープロセスはどこで実行されていますか? CPUで実行されている場合は、ハードウェア割り込みによってCPUの注意を引く必要はありませんよね?それは他の場所で実行されていますか?
  3. ハードウェア割り込みはCPUに直接割り込みますか、それとも最初にカーネルプロセスに連絡し、次にカーネルプロセスがCPUに連絡/割り込みしますか?

一方、ソフトウェア割り込みの目的は、現在CPUで実行されているプロセスがいくつかのリソースを要求することであると思います。

  1. リソースは何ですか?それらはすべて実行中のプロセスの形式ですか?たとえば、CPUドライバープロセスとメモリドライバープロセスは、CPUおよびメモリリソースを表しますか? I/OデバイスのドライバープロセスはI/Oリソースを表しますか?プロセスがリソースと通信したい他の実行中のプロセスはありますか?
  2. はいの場合、ソフトウェア割り込みはカーネルプロセスを介して間接的にプロセス(リソースを表す)に接続しますか?ハードウェア割り込みとは異なり、ソフトウェア割り込みは直接CPUを中断するのではなく、カーネルプロセスを中断/接続するのは正しいことですか?
45
Tim

ハードウェア割り込みは、実際にはCPUマルチタスクの一部ではありませんが、それを駆動する可能性があります。

  1. ハードウェア割り込みは、ディスク、ネットワークカード、キーボード、クロックなどのハードウェアデバイスによって発行されます。各デバイスまたはデバイスのセットには、独自のIRQ(Interrupt ReQuest)行があります。 IRQに基づいて、CPUは要求を適切なハードウェアドライバーにディスパッチします。 (ハードウェアドライバーは通常、個別のプロセスではなく、カーネル内のサブルーチンです。)

  2. 割り込みを処理するドライバはCPUで実行されます。 CPUは、割り込みを処理するために行っていた処理を中断するため、CPUの注意を引くために追加の処理は必要ありません。マルチプロセッサシステムでは、割り込みは通常、CPUの1つだけに割り込みます。 (特殊なケースとして、メインフレームにはハードウェアチャネルがあり、メインCPUからのサポートなしで複数の割り込みを処理できます。)

  3. ハードウェア割り込みは、CPUに直接割り込みます。これにより、カーネルプロセス内の関連コードがトリガーされます。処理に時間がかかるプロセスの場合、割り込みコードにより、他のハードウェア割り込みによって割り込みが許可される場合があります。

    タイマー割り込みの場合、カーネルスケジューラコードは実行中のプロセスを一時停止し、別のプロセスの実行を許可する場合があります。マルチタスクを可能にするのは、スケジューラコードの存在です。

ソフトウェア割り込みは、ハードウェア割り込みと同様に処理されます。ただし、現在実行中のプロセスによってのみ生成できます。

  1. 通常、ソフトウェア割り込みはI/O(入力または出力)の要求です。これらは、I/Oの発生をスケジュールするカーネルルーチンを呼び出します。一部のデバイスでは、I/Oはすぐに実行されますが、通常、ディスクI/Oはキューに入れられ、後で実行されます。実行中のI/Oによっては、I/Oが完了するまでプロセスが中断され、カーネルスケジューラが実行する別のプロセスを選択する場合があります。 I/Oはプロセス間で発生する可能性があり、処理は通常、ディスクI/Oと同じ方法でスケジュールされます。

  2. ソフトウェア割り込みはカーネルとのみ通信します。実行する必要がある他のプロセスをスケジュールするのはカーネルの責任です。これは、パイプの最後の別のプロセスである可能性があります。一部のカーネルでは、デバイスドライバーの一部をユーザー空間に配置できます。カーネルは、このプロセスを必要に応じて実行するようにスケジュールします。

    ソフトウェア割り込みが直接CPUに割り込まないのは正しいことです。現在コードを実行しているコードのみがソフトウェア割り込みを生成できます。割り込みは、実行中のプロセスに対してカーネルが何か(通常はI/O)を実行するための要求です。特別なソフトウェア割り込みはYield呼び出しで、カーネルスケジューラに他のプロセスが実行できるかどうかを確認するように要求します。

コメントへの応答:

  1. I/O要求の場合、カーネルは適切なカーネルドライバーに作業を委任します。ルーチンは、I/Oを後で処理するためにキューに入れるか(ディスクI/Oに共通)、可能であればすぐに実行します。多くの場合、ハードウェア割り込みに応答するときに、キューはドライバーによって処理されます。 1つのI/Oが完了すると、キュー内の次のアイテムがデバイスに送信されます。

  2. はい、ソフトウェア割り込みはハードウェア信号ステップを回避します。ソフトウェア要求を生成するプロセスは、現在実行中のプロセスでなければならないため、CPUに割り込むことはありません。ただし、呼び出しコードのフローを中断します。

    ハードウェアがCPUに何かをさせる必要がある場合、CPUは実行中のコードへの注意を中断します。 CPUは現在の状態をスタックにプッシュして、後で元の状態に戻ることができるようにします。割り込みは停止する可能性があります。実行中のプログラム。別の割り込みを処理するカーネルコード。またはアイドルプロセス。

57
BillThor