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 件のコメント:
コメントを投稿