_set_gate マクロの動作
纏めたナニについてマニュアルを元に検証。
先日のマクロ解析なエントリによると _set_gate マクロの動作は以下の順。
- ((char *) (addr)) が edx に設定される
- ((seg) << 16) が eax に設定される
- dx の値を ax にコピィ
- ((short) (0x8000+(dpl<<13)+(type<<8))) が dx に格納
- edx を gate_addr に格納
- eax を (gate_addr+1) に格納
で、例えば apic_intr_init()#arch/i386/kernel/apic.c の以下のコードは
set_intr_gate(LOCAL_TIMER_VECTOR, apic_timer_interrupt);
set_intr_gate()#arch/i386/kernel/traps.c ん中でこんなカンジ??
_set_gate(idt_table+LOCAL_TIMER_VECTOR,14,0,apic_timer_interrupt,__KERNEL_CS);
で呼び出され、マクロの引数は以下の感じなので
#define _set_gate(gate_addr,type,dpl,addr,seg)
- ((char *)(apic_timer_interrupt)) が edx に設定される
- ((__KERNEL_CS) << 16) が eax に設定される
- dx の値を ax にコピィ
- ((short)(0x8000+(0<<13)+(14<<8))) が dx に格納され (左記の値は 0x8e00)
- edx が (long *)idt_table+LOCAL_TIMER_VECTOR に格納
- eax が (long *)idt_table+LOCAL_TIMER_VECTOR+1 に格納
となる訳か。ちなみに dx の値について上記の例ではビットにすると
1000 1110 0000 0000
になりますが、マニュアルによると
- セグメント存在フラグは 1
- ディスクリプタ特権レベルは 00 (これ、意味不明だなぁ
- ゲートのサイズは 32 bits な割り込みゲート
とゆー意味になるかな。5 〜 7 bit の 000 は意味不明。予約されたフィールドでない、という意味では、ここは 0 でないとイケマセン、という事かと。
DPL(ディスクリプタ特権レベル) については、レベル 0 からレベル 3 まであり、値が小さい方がよりレベルが高い、という定義になっている模様。上記の例では DPL は 00 であり、一番高い特権レベル、という事か。
マニュアル 3 巻の第 5 章は再度熟読の必要あり、だなぁ。