6. 入力デバイスや割り込みはどのように動作しているのか?

キーボードというのは、非常にシンプルな入力デバイスです。というのも、 キーボードは、(コンピュータの基準から見ると)ごく少ない量のデータを 非常にゆっくり生成するものだからです。キーを押したり離したりする際、 そのイベント信号は、キーボードケーブルを伝わって、 ハードウェア割り込み (hardware interrupt) を 発生させます。

こうした割り込みを監視するのは、オペレーティングシステムの仕事です。 あらゆる種類の割り込みに対処するために、割り込みハンドラ (interrupt handler) というのが必要になります。これは、 オペレーティングシステムの一部であり、(キーストロークやキーリリース といった) 割り込みに関係するデータのすべてを、それが処理されるまで 保持しておくものです。

キーボード用の割り込みハンドラの実際の仕事というのは、キーの値をメモリの 底のほうにあるシステムエリアに格納することです。オペレーティングシステムが、 現在キーボードからの入力待ちと思われるプログラムに対して制御を渡した 際、そのプログラムがそこから値を読み出せるようにするわけです。

ディスクやネットワークカードのようなもっと複雑な入力デバイスの場合でも 動作方法は同じです。以前の章では、ディスクコントローラはバスを使ってディスク リクエストが完了したことを伝えるという話をしました。その場合の実際の動作と いうのは、ディスクが割り込みを発生されるということです。そのとき、ディスクの 割り込みコントローラは、発生した割り込みデータをメモリ内に一旦コピーして、 後からそのリクエストを発したプログラムが使えるようにするのです。

割り込みには、どういう種類のものであれ、必ず関連する 優先レベル (priority level) が付いています。低い優先レベルの割り込み(たとえば、 キーボードイベント)は、高い優先レベルの割り込み(たとえば、クロックチック (clock tick) やディスクイベント) が処理されるのを待たなければなりません。 Unix では、マシンの反応をスムーズにするために、迅速な処理を必要とする イベントに対しては、高い優先順位が与えられるように設計されています。

オペレーティングシステムの起動時のメッセージのなかに、IRQ の数字に関する 表示があるのをご覧になったことがあると思います。また、よくあるハード ウェアの設定ミスのひとつとして、二つのデバイスが同じ IRQ を使うように 設定してしまっていたという事例があることを御存知だと思います。ただ、 これが何故設定ミスなのか、正確な理由は案外知られていません。

それは、つまりこういうことです。IRQ とは、"割り込みリクエスト (Interrupt Request)" の略です。オペレーティングシステムは、起動時に、どのハードウェア がどの割り込み番号を使うのか知る必要があり、それによって、適切な割り込み ハンドラを個々のハードウェアに関連付けています。もし二つの異なるデバイスが 同一の IRQ を使おうとすると、割り込みが不適切なハンドラに送られてしまう 事態が生じます。その場合、通常は少なくともデバイスが反応しなくなってしまう か、あるいは、OS を混乱させてしまって、OS が固まってしまうか、クラッシュ してしまうからです。