IRON MAIDEN

割り込みディスクリプタテーブルを初期化する方法ですが、こんなところやっている人っているんだろうか?まあそれは調べてないんですが、ちゃっちゃといきます。

割り込みをカーネルが許可する前に、 idtr レジスタに IDT の先頭アドレスをロードします。 IDT 内の全エントリを初期化する必要が出て来るんですが、
これはシステムの起動時に行ってやります。但し、不正な割り込みが行われる可能性もゼロではないので、慎重にやってやる必要があります。

例えば、ユーザモードプロセスは int 命令を使用して 0 〜 255 までの範囲で任意のベクタを伴う割り込み信号を発行することが出来ます。

多分このために、割り込みやトラップのゲートディスクリプタの DPL フィールドはゼロに設定されているはずです。
プロセスが不正な割り込み信号を発行しようとすると制御回路が二つの値(あ、この二つです CPL と DPL )を比較し、一般保護例外を発生させます。

ユーザモードプロセスが例外を直接発生できることも必要になると思います。
対応する割り込みやトラップのゲートディスクリプタの DPL フィールドを最大値に設定してやると出来ます。

3-1 割り込みゲート

以下は Linux での分類方法ですが、 Intel と微妙に違うところが面倒です。
Intel が言っている割り込みゲート。ユーザモードプロセスではアクセス出来ない。 DPL フィールドは 0 。
Linux の割り込みハンドラは、すべてこれで実装されています。

3-2 システムゲート

Intel の言っているトラップゲート。ユーザモードプロセスでもアクセス出来る。 DPL フィールドは 3 。
ベクタ 3 、 4 、 5 、 128 に対応する例外ハンドラはこれにより実装。
なので、 int3 、 into 、 bound 、 int 0x80 このアセンブリ命令はユーザモードでも使用可。

3-3 トラップゲート

Intel の言っているトラップゲート。ユーザモードプロセスではアクセス出来ない。 DPL フィールドは 0 。
Linux では上記 4 つ以外のすべての例外ハンドラは、トラップゲートにより実装。