割り込みとは
計算機では、割り込みとは実行中の計算処理を一時中断し、新たに
発生した事象を優先して、その事象のための処理を行なわせるための
メカニズムです。
なぜ割り込みが必要なのでしょう?計算機では割り込みを次のように利用しています。
- 同時に走っている複数のユーザプログラムの切り替えのため
- 外部事象の発生による緊急/優先処理のため
- 低速デバイスへの入出力においてその完了を待つ時、CPUを放棄するため
私達が利用しているノイマン型計算機はCPUの数が限られています。処理の数だけ
自由に動的に増やせるものではありません。ですから処理の数が増えると
どうしてもCPUの切り替えが必要になってきます。割り込み処理は随次処理という
概念からは異質の処理です。随次処理だけを考えればいいとすると何とものごとを
シンプルにすることができるでしょう。割り込み処理のおかげで、計算機の上で
並行処理を可能にしました。2つ程度の並行処理はまだ同時に追って行けますが
数個以上になると人間の頭では追って行けなくなります。それほど並行処理は
難しいものです。データ収集や制御の世界はこの並行処理を前提とする複雑な
処理を扱います。
さて、割り込みに関連したいくつかの言葉があります。
- CPU内部で発生させる割り込みを特に、例外という。例外の中にも
下記のように2つに分類されます。
- プロセッサにより検知されるもの
- ソフトウエアから発行されるもの
- CPU外部で発生させる割り込みをハードウエア割り込みという。
割り込みには割り込みベクタと呼ばれる番号が割り当てられます。
割り込みベクタ、割り込み番号、IRQ番号などハードウエアやソフトウエアに
特有に使われる名前がどのように対応しているのかを知る必要があります。
x86CPU自体は2本の割り込み線があります。NMI と INT です。
NMIは割り込み禁止にすることができないもので、主に致命的なエラー(メモリの
異常や、電源が落ちた等)の時に使用します。
INT は 割り込み禁止にできることと、割り込み発生時 8bit の割り込みベクタを
読み込むことで、256 個の割り込みに対応できます。
PC/AT では 割り込みコントローラ 8259A を 2 個使用し、15 個の割り込みが
使用できます。8259A は 8本 の IRQ 端子を持っていて、IRQ 端子毎に別々の
割り込みベクタを設定(プログラム)できます。8259A を 2 個使うためには、
一方の IRQ 端子を他方の 8259Aの端子のために使うため、16 個ではなく 1 つ足り
ない、15 個の割り込みになります。
これらの割り込みをハードウェア割り込みといいます。
また、x86 系 CPU にはソフトウェア割り込み機械語命令(ニーモニックは INT です)が
ありますが、ハードウェア割り込みと同じように動作します。
8259A が 割り込みベクタ 8 を出力し、CPU の INT 端子を有効にしたことと、
ソフトウェア割り込み機械語命令 INT 8 の動作は全く同じで、CPU には区別が
付きません。8259A のレジスタを調べたり、IRQ 端子を有効にした、ハードウェア
に問い合わせて、ハードウェアかソフトウェアの割り込みを区別します。
これは、欠点とも利点とも考えられます。 欠点として、ハードウェアかソフトウェ
アか区別するプログラムが必要になることです。利点としては、ハードウェアが
動作していない(bugっていたり、まだ完成していない)ときに、ソフトウェアで
試験ができることです。
x86 系 CPU はベクタ番号から計算した、メモリ内容(勿論あらかじめ、値を設定
しておきます)をもとにしたアドレスへサブルーチンコールします。
PCIの割り込みラインは4本です。PCIの装置はコンフィグレーション空間に
256バイトのレジスタを持たなければ
なりません。16進で3C番地にInterrupt Lineと呼ばれる場所があり、割り込み
番号が入っています。PCIからの割り込みがCPUに入ると、この割り込み番号が
CPUに渡されます。x86PC/ATにおいては、この値は2つカスケードに
並べた8259Aから構成される、IRQの番号1ー15に相当します。
x86プロセッサは割り込み優先順位をサポートしていません。ですから
割り込み優先度をハードウエアで扱えるプロセッサと違い、ソフトウエアで
割り込み優先順位を処理しなければ成りません。割り込み管理に
関する2つの命令、全ての割り込みを使えない用にするcliとすべての
割り込みを使えるようにするstiを用意しています。