OS自作入門 / 2008/08/30 (Sat) / 編集 |
GDT(Global (segment) Descriptor Table):大域セグメント記述子表
セグメントの情報(下の三つ)を書いたテーブル- セグメントの開始位置(base)
- セグメントの属性(access)
- セグメントの大きさ(limit)
ここでめんどくさいこと発生、構造体をみるとlimitが20bitしか用意されてない、これだとセグメントの大きさが最大1MBしか指定できない、、、
というわけで「Gビット」というフラグが使われる、これが1だとlimitをbyte単位ではなくpage単位(4KB)だと判断してくれる
アクセス権(全部で16bitある)の上位4bitは拡張アクセス権、「GD00」という構造になっている、ちなみにDはセグメントのモードで1だと32bit、0だと16bit
アクセス権の9~12bitは0、アクセス権の下位8bitは以下、
- 0x00:未使用のDescripter Table
- 0x92:システム専用、読み書き可能だが実行不可
- 0x9a:システム専用、実行と読み込みが可能、書き込み不可
- 0xf2:アプリケーション用、読み書き可能だが実行不可
- 0x9a:アプリケーション用、実行と読み込みが可能、書き込み不可
IDT(Interrupt Descripter Table):割り込み記述子表
「割り込み番号(0~156まである)がx番なら関数Xを実行」みたいな設定、 (GATE_DESCRIPTER、set_gatedesc()、load_idtr())PIC(Programmable Interrupt Controller):設定可能割り込みコントローラ
IRQ(Interrupt ReQuest:割り込み信号)を監視するもの、IRQ0~7を監視するマスタとIRQ8~15を監視するスレイブがある、ちなみにスレイブはIRQ2に繋がっているIMR(Interrupt Mask Register)は1になっているIRQのみを監視するようにする
ICW(Initial Control Word)1と4はPICの配線情報(ハードウェア依存)
ICW2はIRQをどの割り込み番号としてCPUに教えるかの設定(OS依存)、0x00~0x1fは使えない(ソフトウェア割り込みに使っているから)
ICW3はマスタとスレイブの接続設定、マスタ側は「何番にスレイブがついているか」、スレイブ側は「何番のマスタに繋がっているか」を入れる(ハードウェア依存)
PICから割り込みを教えてもらったら、「確認したので見張りを再開してください」とお願いしないといけない、詳細は[OS-Wiki]PIC 8259A
割り込みハンドラ
割り込み受付用のプログラムキーボード用はinthandler21()と_asm_inthandler21()(キーボードはIRQ1だから)、マウス用はinthandler2c()と_asm_inthandler2c()(マウスはIRQ12(0xc)だから)
_asm_のほうは
- レジスタの値をバックアップ
- 割り込みハンドラをCALL
- バックアップしたレジスタの値を戻す
- 割り込み終了(IRETD)
IDTに割り込みハンドラを記録しておくのも忘れずに(dsctbl.c内のinit_gdridt())
CPUの方の割り込み許可も忘れずに(STI命令)(bootpack.c内)
マウスは長いので次回は順番を変えてキーボードな予定、ちなみに6日目まで終了時点で以下のような感じ
カーソルは表示されているがまだ動きません、キーボードを押すとIRQ1から割り込みがあった旨表示されます
ちなみにカーソルの表示方法は省略したので過去記事見ても書いてないよw
PR
トラックバック
URL :
コメント