一、系统引导过程总体介绍
启动流程图:
系统引导过程主要由以下几个步骤组成(以硬盘启动为例)
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
:
7c
00
处执行
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
、启动完成。