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位保护模式下的线性地址。