X86内核启动分析五 保护模式小荷尖尖角

第一次进入保护模式,解压缩内核

startup_32: //head.S (c:\linux\linux-2.6.23\arch\i386\boot\compressed)
    =>//Do the decompression, and jump to the new kernel..
    => Jump to the decompressed kernel.

跳转到解压缩内核之后,使能页模式

里面有一个重要的宏定义:
[linux-2.6.23]$ cat .config | grep CONFIG_PAGE_OFFSET
CONFIG_PAGE_OFFSET=0xC0000000
[linux-2.6.23]$ 

ENTRY(startup_32)  //head.S (c:\linux\linux-2.6.23\arch\i386\kernel)
    =>Copy bootup parameters out of the way. //主要是boot_params
    =>// Initialize page tables
    =>//Enable paging
    =>call setup_idt
    =>je is386
        =>jmp start_kernel
            =>setup_arch(&command_line);
            =>bootloader_type = LOADER_TYPE;
            =>init_mm.start_code = (unsigned long) _text;
            init_mm.end_code = (unsigned long) _etext;
            init_mm.end_data = (unsigned long) _edata;
            init_mm.brk = init_pg_tables_end + PAGE_OFFSET;

            code_resource.start = virt_to_phys(_text);
            code_resource.end = virt_to_phys(_etext)-1;
            data_resource.start = virt_to_phys(_etext);
            data_resource.end = virt_to_phys(_edata)-1;     
            =>parse_early_param();
            =>max_low_pfn = setup_memory();
            =>paging_init();
            =>console_init(); //8250.c (c:\linux\linux-2.6.23\drivers\serial)
                =>(void) tty_register_ldisc(N_TTY, &tty_ldisc_N_TTY);
                =>call = __con_initcall_start;
                while (call < __con_initcall_end) {
                    (*call)();
                        =>console_initcall(serial8250_console_init);
                            =>serial8250_isa_init_ports();
                            =>register_console(&serial8250_console);
                    call++;
                }
            =>rest_init();
                =>kernel_thread(kernel_init, NULL, CLONE_FS | CLONE_SIGHAND);
                    =>init_post();
                        =>run_init_process("/sbin/init");
                        run_init_process("/etc/init");
                        run_init_process("/bin/init");
                        run_init_process("/bin/sh");
                =>pid = kernel_thread(kthreadd, NULL, CLONE_FS | CLONE_FILES);
                kthreadd_task = find_task_by_pid(pid);
                =>cpu_idle();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值