今回はstart_kernelから「trap_init」を見てみます。
実体は「arch/x86/kernel/trap.c」にあります。
=========
void __init trap_init(void)
{
int i;
~(省略)~
/* トラップゲートを登録 */
set_intr_gate(0, ÷_error);
/* 割り込みゲートを登録 */
set_intr_gate_ist(1, &debug, DEBUG_STACK);
set_intr_gate_ist(2, &nmi, NMI_STACK);
/* ユーザープログラムから直接呼び出せる割り込みゲートを登録 */
set_system_intr_gate_ist(3, &int3, DEBUG_STACK);
~(省略)~
#ifdef CONFIG_X86_32
/* タスクゲートの登録 */
set_task_gate(8, GDT_ENTRY_DOUBLEFAULT_TSS);
#else
set_intr_gate_ist(8, &double_fault, DOUBLEFAULT_STACK);
#endif
~(省略)~
/* Reserve all the builtin and the syscall vector: */
for (i = 0; i < FIRST_EXTERNAL_VECTOR; i++)
set_bit(i, used_vectors);
#ifdef CONFIG_X86_64
set_bit(IA32_SYSCALL_VECTOR, used_vectors);
#else
set_bit(SYSCALL_VECTOR, used_vectors);
#endif
/*CPUの初期化。詳しくは次回 */
cpu_init();
#ifdef CONFIG_X86_32
/* 特になにもしない */
trap_init_hook();
#endif
}
=========
主に使っている関数を整理すると以下のようになります。
set_intr_gate:トラップゲートの登録
set_intr_gate_ist:割り込みゲートの登録
set_system_intr_gate_ist:ユーザープログラムから直接呼び出せる割り込みゲートの登録
set_task_gate:タスクゲートの登録
トラップゲートと割り込みゲートは何が違うの?というと割り込みゲートが呼び出された場合は「割り込み禁止」状態になっているという違いです。
0 件のコメント:
コメントを投稿