調べてみるとプロテクトモードでは割込みベクタテーブルの代わりに「割込みディスクリプタテーブル」
を用意しなければならないとあります。
これはゲートディスクリプタを並べたもので「割込みゲート」「トラップゲート」「タスクゲート」の
3種類があり・・・・
を用意しなければならないとあります。
これはゲートディスクリプタを並べたもので「割込みゲート」「トラップゲート」「タスクゲート」の
3種類があり・・・・
などとなにやら複雑。
とりあえず割込み番号0~3に対応する割込みディスクリプタテーブルを用意します
1つ分のゲートにはこんな情報が要ります
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のフォーマットに整形
アドレスをロードしますが、その前にIDTRのフォーマットに整形
idtdat: .word 0x07ff /* Limit = 2k */ .word idt /* offset 0-15 */ .word 0x0000 /* offset 16-31 */