ハードウェア割り込みについて

今回は割り込みについて学ぼう。

割り込みとは

CPU はメモリ上の命令を逐次実行していくが,プログラマがあらかじめ全ての処理を予測し順序良く記述しておくことは困難である。(例えば,ユーザーがキーボードを押すタイミングを,プログラマが予め予測することは不可能である)
そこで,CPU は実行中の処理に割り込んで,プログラマが予め用意しておいた処理を実行する機能を供えている。
一般的に,このように CPU の処理の流れを変える現象を「割り込み」と呼ぶ。

それぞれの割り込みは,0 〜 255 までの番号で識別され,Intel は,この番号をベクタvector)と呼んでいる。*1
そして割り込みは,次のようないくつかの種類に分られる:

  • ハードウェア割り込み
  • ソフトウェア割り込み
  • 例外

ここでは,ハードウェア割り込みについて詳しくみていくことにしよう。

ハードウェア割り込みについて

I/Oポート操作が「CPU がハードウェアへ命令を送る操作」ならば,ハードウェア割り込みは「ハードウェアがCPUへ命令を送る操作」だと解釈できる。

PICについて

物理的に,CPU にはハードウェアが割り込みを通知するための線(INTR ピン)が一つ用意され,ハードウェアはそれに信号を送ることで変化があったことを CPU に知らせることが出来る。(例えば,キーボードはキーが押されたら CPU に信号を送る)
しかし,実際にはマザーボードに繋がれているハードウェアは複数あり,もっと多くの線が必要なはずである。そのため,どんなAT互換機にも,PIC(Programmable Interrupt Controller)と呼ばれる素子が二つ用意され,次のようにCPUに接続されている。

一本はPIC同士を繋いでいて,計15本ハードウェア用の線が用意され,それぞれ IRQ(Interrupt ReQuest)と呼ばれる番号が割り当てられている。
そして,ぞれぞれの線には,下表のようにハードウェアが繋がれている*2

PIC番号用途
マスターIRQ0クロック
IRQ1キーボード
IRQ2(スレーブとの接続)
IRQ3シリアルポート(COM2)
IRQ4シリアルポート(COM1)
IRQ5パラレルポート(LPT2)
IRQ6フロッピーディスクドライブ
IRQ7パラレルポート(LPT1)
スレーブIRQ8リアルタイムクロック
IRQ9未使用
IRQ10未使用
IRQ11未使用
IRQ12PS/2マウス
IRQ13浮動小数点演算装置(FPU)
IRQ14プライマリIDE
IRQ15セカンダリIDE

つまり,ハードウェアが割り込みを発生させると,その信号は直接 CPU に送られるのではなくて,PIC が先に信号を受ける。あらためて PIC が CPU にそのハードウェアの IRQ をベクタに変換し送る。ベクタはユニークなので,CPU はどのハードウェアが割り込みを行ったのかを識別可能である。
この PIC のおかげで CPU は複数のハードウェアからの割り込みを受け取ることができる。

IDTについて

CPU はベクタを受け取ると,たとえプログラムの実行中であったとしても,ベクタに対応する関数を割り込んで実行し,ここでようやく,目的が達成される。(例えば,キーボードのベクタを受け取れば画面に文字を表示する)
ベクタと目的の関数を対応付ける情報は,割り込みディスクリプタテーブル(IDT [Interrupt Descriptor Tbale])と呼ばれる配列に収納され,それぞれのベクタにIDTのエントリーが対応する。IDTのエントリーは目的の関数へのポインタを含み,ベクタの数と同様に最大で256個用意できる。


これでハードウェア割り込みについて大体の説明が完了した。
実際のプログラミング方法は,記事が長くなるので次回の記事に分けることにしよう。

参考文献・サイト

*1:ダニエル・P. ボベット,マルコ セサティ 『詳解Linuxカーネル』 高橋浩和,岡島順治郎,三浦広志,早川仁,田宮まや訳 p.144

*2:IRQ番号と用途 : IT用語辞典