_set_gate マクロの動作

纏めたナニについてマニュアルを元に検証。
先日のマクロ解析なエントリによると _set_gate マクロの動作は以下の順。

  1. ((char *) (addr)) が edx に設定される
  2. ((seg) << 16) が eax に設定される
  3. dx の値を ax にコピィ
  4. ((short) (0x8000+(dpl<<13)+(type<<8))) が dx に格納
  5. edx を gate_addr に格納
  6. 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)
  1. ((char *)(apic_timer_interrupt)) が edx に設定される
  2. ((__KERNEL_CS) << 16) が eax に設定される
  3. dx の値を ax にコピィ
  4. ((short)(0x8000+(0<<13)+(14<<8))) が dx に格納され (左記の値は 0x8e00)
  5. edx が (long *)idt_table+LOCAL_TIMER_VECTOR に格納
  6. 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 章は再度熟読の必要あり、だなぁ。

追記

特権レベルについてはマニュアル 3 巻の 4.5 に記述がある。CPL だの DPL だのという言葉の意味が微妙だなぁ、と思っていたのですが、ここできちんと定義というか解説されている。

  • 現行特権レベル (CPL:Current Privilege Level)
  • ディスクリプタ特権レベル (DPL:Description Privilege Level)
  • 要求される特権レベル (RPL:Requested Privilege Level)

意味については別途、とゆー事で(を