2009年6月20日土曜日

main.c

今回はmain関数を読み始めてみます。

arch/x86/boot/main.c

======
void main(void)
{
/* ブートヘッダをゼロページにコピー */
copy_boot_params();

/* ヒープの末尾チェック */
init_heap();

/* サポートしているCPUかチェック */
if (validate_cpu()) {
puts("Unable to boot - please use a kernel appropriate "
"for your CPU.\n");
die();
}

/* BIOSにCPUモードをセット */
set_bios_mode();

/* メモリ配置の検出 */
detect_memory();

/* キーボードのリピート設定(なぜ?) ※原文まま */
keyboard_set_repeat();

/*NUMA用なので気にしない*/
query_mca();

/* NUMA用なので気にしない */
#ifdef CONFIG_X86_VOYAGER
query_voyager();
#endif

/* Intel SpeedStep(省電力技術)の問い合わせ */
query_ist();

/* APM情報(電源管理)の問い合わせ */
#if defined(CONFIG_APM) || defined(CONFIG_APM_MODULE)
query_apm_bios();
#endif

/*拡張BIOS(?)、Enhanced Disk Drive情報の問い合わせ、だと思う*/
#if defined(CONFIG_EDD) || defined(CONFIG_EDD_MODULE)
query_edd();
#endif

/* ビデオモードの設定 */
set_video();

/* コマンド引数に"quiet"とあればビットを立てておく*/
if (cmdline_find_option_bool("quiet"))
boot_params.hdr.loadflags |= QUIET_FLAG;

/*プロテクトモードへ!! */
go_to_protected_mode();
}

======

ここの最後でプロテクトモードへ移行しているので、GDTやIDTの設定もおそらくそれ以前にしているハズ。main関数内で呼び出している各関数について、次回から見ていきます。

0 件のコメント:

コメントを投稿