2009年7月13日月曜日

go_to_protected_mode

main関数最後の「go_to_protected_mode」関数を見ていきましょう。

arch/x86/boot/pm.c
======
void go_to_protected_mode(void)
{
/* プロテクトモードに移行する前にフック関数を呼んでおく */
realmode_switch_hook();

/* セグメントを設定 */
move_kernel_around();

/* A20ゲートを有効にする */
if (enable_a20()) {
puts("A20 gate not responding, unable to boot...\n");
die();
}

/* コプロセッサをリセット */
reset_coprocessor();

/* PICの割り込み設定をすべてマスクする */
mask_all_interrupts();

/* プロテクトモードへの移行*/
setup_idt();
setup_gdt();
protected_mode_jump(boot_params.hdr.code32_start,
    (u32)&boot_params + (ds() << 4));
}

======

今回からはこの中の関数を順に見ていきます。
まずプロテクトモード移行前にフック関数をコールしておく「realmode_switch_hook」です。
======
static void realmode_switch_hook(void)
{
/* ブートパラメータのヘッダ情報にフック指定あれば、それを呼び出す */
if (boot_params.hdr.realmode_swtch) {
asm volatile("lcallw *%0"
     : : "m" (boot_params.hdr.realmode_swtch)
     : "eax", "ebx", "ecx", "edx");
} else {
/* フック指定なければ割り込みを禁止する */
asm volatile("cli");
outb(0x80, 0x70); /* Disable NMI */
io_delay();
}
}

======
ちなみにブートパラメータのヘッダ情報(header.S)のrealmode_swtchの項は
realmode_swtch: .word 0, 0 # default_switch, SETUPSEG
と何も指定していないので、変更しなければelse句に入って割り込み禁止します。

0 件のコメント:

コメントを投稿