您的位置:首页 > 运维架构 > Linux

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

2017-08-06 18:02 706 查看
第一次进入保护模式,解压缩内核

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();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  内核 kernel linux