■
今回はグローバルディスクリプタテーブル(GDT)の再登録(といってもbootmiddle.Sでやった事をもういちどやるだけ)と割り込み処理用のインタラプトディスクリプタテーブル(IDT)の登録を行う。
GDTは前回見たとおりなのでIDTの中身を見てみる。
IA-32 Intel manual下巻によると
/ | 0-15 | 16-31 | ||||
---|---|---|---|---|---|---|
0-3バイト目 | オフセット 0..15 | セグメント・セレクタ | ||||
/ | 0-4 | 5-7 | 8-12 | 13-14 | 15 | 16-31 |
4-7バイト目 | reserved | 000 | 011D0 | DPL | P | オフセット 16..31 |
となっている。
まず、この8バイトのテーブルを255個用意しそれをIDTとしてCPUに登録する。そこで割り込み番号n番が呼ばれた場合、このテーブル中のn番目に登録されている処理が呼ばれるのだがその際に参照されるのが
・セグメント・セレクタ
・オフセット
例えばコードセグメントの0x08とそのオフセット0x1000などを登録しておく。その登録先のアドレスには割り込み番号nの処理内容をセットしておく事になる。
では5バイト目の「111D0 DPL P」とはそれぞれ以下のような意味になる。
・011D0 最初の「011」は割り込みゲートを表していて次の「D」 ビットは32bitか16bitを表している。今回は32bitなので1となる。 最後の0はシステムオブジェクトを設定する時の値となり、 例えばGDTのようなセグメントディスクリプタを設定する場合は 1となる。 ・DPL Descriptor Privilege Level kernelなので0となる。 ・P セグメント存在フラグ 存在するので1となる
また4バイト目の|reserved|000|はコピーカウンタと呼ばれる物に使われるが割り込み処理には関係無いので全部0にする。
とりあえずGDT,IDTを実装。
タイマー割り込みをさせてみるが動かず。