忍者ブログ
MASTER →  ADMIN / NEW ENTRY / COMMENT
現代魔法(nearly equal 情報技術)を勉強中な人のメモ(チラシの裏)
/ 2024/11/22 (Fri) / 編集
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

/ 2008/08/30 (Sat) / 編集

GDT(Global (segment) Descriptor Table):大域セグメント記述子表

セグメントの情報(下の三つ)を書いたテーブル
  1. セグメントの開始位置(base)
  2. セグメントの属性(access)
  3. セグメントの大きさ(limit)
メモリ上に書いとく、でもってGDTRという特殊なレジスタにテーブルの先頭番地と設定したセグメント数を書けばおけ(LGTRという命令でできる)(SEGMENT_DESCRIPTER、set_segmdesc()、load_gdtr())

ここでめんどくさいこと発生、構造体をみると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_のほうは
  1. レジスタの値をバックアップ
  2. 割り込みハンドラをCALL
  3. バックアップしたレジスタの値を戻す
  4. 割り込み終了(IRETD)

IDTに割り込みハンドラを記録しておくのも忘れずに(dsctbl.c内のinit_gdridt())
CPUの方の割り込み許可も忘れずに(STI命令)(bootpack.c内)

マウスは長いので次回は順番を変えてキーボードな予定、ちなみに6日目まで終了時点で以下のような感じ
割り込み1
割り込み2 カーソルは表示されているがまだ動きません、キーボードを押すとIRQ1から割り込みがあった旨表示されます
ちなみにカーソルの表示方法は省略したので過去記事見ても書いてないよw

拍手[0回]

PR
忍者ブログ [PR]