カテゴリ:作りモノ
だいぶ間があいて忘れそうなのでOS自作本第6日目の残りを読んだ。
残ってる部分は割込コントローラの設定(第5節)と割込ハンドラの作成(第6節)です。 割込コントローラ(PIC:Programable Interrupt Controllerについてのメモ書きをしておきます。 #PICではないのね。:-) ・マスタPICのIRQ2はスレーブPICにつながっている→マスタ/スレーブ併せて15個の割込(IRQ2以外のIRQ0~IRQ15)が扱える。 ・PIC内には下記の8ビットレジスタがある。 - IMR(Interrupt Mask Register):割込をマスクするためのレジスタ(1の立ってるビットに対応する割込は禁止される) - ICW(Initial Control Word):初期化ワード(ICW1~ICW4) ・マスタPICのICW3中、スレーブPICの接続されているビット位置に1を立てる(2進数で00000100 = 1 << 2 )。 ・スレーブPICのICW3にはマスタPICのIRQ番号(2)を入れる。 と、ここまでは決めごとで、自由度があるのは ICW2 の設定だけだそうな。ICW2 には割込番号のマッピング(IRQ0~IRQ15をINT??~INT??で受けるか?)を設定します。hariboteOS ではIRQ0~IRQ15をINT 0x20~INT 0x2fで受けるようにマッピングしています。 #マウスはIRQ12(INT 0x2c)、キーボードはIRQ1(INT 0x21)。 で、設定が終わると割込ハンドラの作成をしています。割込からの復帰には IRETD命令を使う必要があるそうな。割込ハンドラのアセンブラ部分では全レジスタをPUSHしてからCのハンドラを呼んで、その後、全レジスタをPOPしてからIRETD、っちゅう流れです。この部分で仕入れた新ネタに、 ・Cで書いた関数を呼ぶ(CALL)ときにはDSとESとSSは同じセグメントを指示しなければならない(p.134) っちゅうことがあります。また、pp.132-133でFIFOとスタックの説明が分かりやすくされてます。 あと、GDTとIDTの初期化(init_gdtidt())に割込ハンドラを割込テーブル(IDT)に登録する部分(set_gatedesc())を追加してます。 っちゅうことで、ソースをちょこちょこ修正して make run してみると確かにキーボード割込ハンドラは動作したけど、マウス割込は受け付けてない(ハンドラが動作してない?)わん。何でかは第7日目で明らかになるようやけど、今日はここまで。(^^; --- 26;00 --- お気に入りの記事を「いいね!」で応援しよう
Last updated
December 10, 2011 12:26:49 AM
コメント(0) | コメントを書く
[作りモノ] カテゴリの最新記事
|
|