linux+v2.6.24/arch/x86/boot/main.c
void main(void)
{
/* First, copy the boot header into the "zeropage" */
copy_boot_params();
/* End of heap check */
if (boot_params.hdr.loadflags & CAN_USE_HEAP) {
heap_end = (char *)(boot_params.hdr.heap_end_ptr
+0x200-STACK_SIZE);
} else {
/* Boot protocol 2.00 only, no heap available */
puts("WARNING: Ancient bootloader, some functionality "
"may be limited!\n");
}
/* Make sure we have all the proper CPU support */
if (validate_cpu()) {
puts("Unable to boot - please use a kernel appropriate "
"for your CPU.\n");
die();
}
/* Tell the BIOS what CPU mode we intend to run in. */
set_bios_mode();
/* Detect memory layout */
detect_memory();
/* Set keyboard repeat rate (why?) */
keyboard_set_repeat();
/* Set the video mode */
set_video();
/* Query MCA information */
query_mca();
/* Voyager */
#ifdef CONFIG_X86_VOYAGER
query_voyager();
#endif
/* Query Intel SpeedStep (IST) information */
query_ist();
/* Query APM information */
#if defined(CONFIG_APM) || defined(CONFIG_APM_MODULE)
query_apm_bios();
#endif
/* Query EDD information */
#if defined(CONFIG_EDD) || defined(CONFIG_EDD_MODULE)
query_edd();
#endif
/* Do the last things and invoke protected mode */
go_to_protected_mode();
}
main函数的主要作用对硬件进行设置、通过memcpy或者硬件探测为内核启动准备参数放入boot_params结构体(main.c中定义的全局变量),然后跳转到保护模式。
boot_params结构体需要注意的部分有hdr、e820_map[E820MAX]、hdr.cmd_line_ptr,hdr是main函数调用copy_boot_params从kernel setup处拷贝过来,e820_map是main函数调用detect_memory得到,hdr.cmd_line_ptr是bootloader传递给内核的参数,所以bootloader会设置kernel setup处的hdr,bootloader把参数放在适当的位置,然后把参数的指针存放到hdr.cmd_line_ptr,需要注意的这个指针是32位保护模式下的线性地址。