一、系统引导过程总体介绍
启动流程图:
系统引导过程主要由以下几个步骤组成(以硬盘启动为例)
1、开机;
2、 BIOS加电自检(POST——Power On Self Test),包括检查RAM,keyboard,显示器,软硬磁盘等等。Intel系列的CPU首先进入的是实模式,并开始执行位于地址0xFFFF0处的代码,也就是ROM-BIOS起始位置的代码;
3、搜索启动的操作系统,根据BIOS设置,可能会依次访问每个软盘的第一个扇区、硬盘、CD-ROW等;一旦找到有效的启动设备,将第一个扇区(0头0道1扇区,也就是Boot Sector)的内容读入内存地址0x7c00处;
4、检查(WORD)0000:7dfe是否等于0xaa55.若不等于则转去尝试其他介质;如果没有其他启动介质,则显示 “No ROM BASIC” ,然后死机;
5、跳转到0000:7c00处执行MBR中的程序bootsect.S;
6、 MBR先将自己复制到0x90000处,然后将紧接其后的setup部分(第二扇区)拷贝到0x90200,将真正的内核代码拷贝到0x100000。以上这些拷贝动作都是以bootsect.S、setup.S以及vmlinux在磁盘上连续存放为前提的;
7、bootsect.S完成加载动作后,就直接跳转到0x90200,这里正是setup.S的程序入口。 setup.S的主要功能就是将系统参数(包括内存、磁盘等,由BIOS返回)拷贝到 0x90000-0x901FF内存中,这个地方正是bootsect.S存放的地方,这时它将被系统参数覆盖。以后这些参数将由保护模式下的代码来读取。
8、 setup.S还将video.S中的代码包含进来,检测和设置显示器和显示模式。最后,setup.S将系统转换到保护模式,并跳转到0x100000(对于bzImage格式的大内核是 0x100000,对于zImage格式的是0x1000)的内核引导代码,Bootloader过程结束;
9、Bootloader跳转到0x100000, 此处为"arch/I386/init/head.S"中的startup_32, startup_32的代码只需要设置一下全局变量,然后就跳转到start_kernel去了;start_kernel()是"init/main.c"中的asmlinkage函数,至此,启动过程转入体系结构无关的通用C代码中;
10、start_kernel()中设置与体系结构相关的环境、页表结构初始化、Trap/IRQ初始化、核心进程调度器初始化、时间/定时器初始化、控制台初始化、核心Cache初始化、内存初始化、内部及通用等各种Cache初始化、信号量初始化、其他部分初始化(Init()及smp_init());
11、启动Init()过程,创建第一个进程;Init()中,取得 run-level 信息, 执行 /etc/rc.d/rc.sysinit 脚本, 激活核心的外挂式模块 (/etc/modules.conf), 然后init 执行 run-level 的各个脚本, 接着执行 /etc/rc.d/rc.local脚本, 最后执行 /bin/login 程序, 登入之后开始以 Shell 控管主机;
12、启动完成。 发表于 @ 2007年05月26日 10:13:00|评论(loading...)|编辑