CPU実験室

誰も見向きもしない古いCPUをいじって動かしてみようというプロジェクトです

割込み処理(2)

調べてみるとプロテクトモードでは割込みベクタテーブルの代わりに「割込みディスクリプタテーブル」
を用意しなければならないとあります。
これはゲートディスクリプタを並べたもので「割込みゲート」「トラップゲート」「タスクゲート」の
3種類があり・・・・

などとなにやら複雑。

とりあえず割込み番号0~3に対応する割込みディスクリプタテーブルを用意します
1つ分のゲートにはこんな情報が要ります
 オフセットアドレス:ハンドラ関数のベースアドレス
 セレクタ     :0x08(コードセグメント)
 コピーカウント  :0x00(何か良くわからない)
 特権レベル    :0x00(最高レベル)
 ゲート種類    :0x0e(32ビット割込みゲート)

これを4つ分用意します。NMIは割込み番号2なのでハンドラは_int2()ということになります

idt:
  .word	_int0
  .byte	0x08,0x00, 0x00,0x8e,0x00,0x00	/* int0	*/
  .word	_int1
  .byte	0x08,0x00, 0x00,0x8e,0x00,0x00	/* int1	*/
  .word	_int2
  .byte	0x08,0x00, 0x00,0x8e,0x00,0x00	/* int2	*/
  .word	_int3
  .byte	0x08,0x00, 0x00,0x8e,0x00,0x00	/* int3	*/

次に割込みディスクリプタテーブルの位置をCPUに教えるためにIDTRに
アドレスをロードしますが、その前にIDTRのフォーマットに整形
idtdat:
  .word	0x07ff	/* Limit = 2k 			*/
  .word	idt	/* offset 0-15			*/
  .word	0x0000	/* offset 16-31			*/

これでようやくIDTレジスタにセットできました
  movl	$idtdat,%ebx
  lidt	(%ebx)	/* IDTのセット			*/