Linux学习笔记6 - 系统启动流程
1.概述
PC
上电后,CPU
将进入实模式
,并从地址0xFFFF0000
开始执行程序代码,此地址通常为ROM-BIOS
中的地址。
此时BIOS
进行开机自检,并按照BIOS
中设置的启动设备(通常是硬盘)进行启动,然后启动设备上安装的引导程序lilo
或者grub
开始引导Linux
(启动设备的第一个扇区),其时Linux
才真正获得启动权。Linux
获得启动权后,首先进行内核的引导
,主要完成磁盘引导
,读取机器系统数据
,实模式
和保护模式
的切换,
加载数据段寄存器
以及重置中断描述符表
等。- 然后执行
init
程序(即系统初始化的工作),init
程序调用了rc.sysinit
和rc
等程序,而rc.sysinit
和rc
在完成系统初始化和运行服务的任务后,返回init
. init
启动mingetty
,打开终端用户供用户登录系统,登录成功后就进入shell
,此即完成从开机到登陆的整个启动过程。
启动流程示意图:
2.内核引导阶段
-
在
grub
或lilo
等引导程序成功引导Linux
系统后,Linux
便从其手中接管了CPU
的控制权,在启动的过程中主要用到内核源码目录的几个文件:bootsect.S
、setup.S
、以及compressed
子目录下的head.S
等。 -
Linux
内核通常是经过压缩的,上面的几个重要的汇编程序,其皆在压缩内核vmlinuz
中。 -
Linux
提供的内核包含了众多驱动和功能,容量较大,压缩内核可以节省大量空间。 -
压缩内核在启动时可以对自身进行解包。
内核启动文件执行流:
3.init阶段
- 在内核加载之后,由内核执行引导的第一个进程是
init
进程,此进程号始终为1(PID=1
)。该进程根据其配置文件"/etc/inittab"
主要完成一系列的初始化任务,此配置文件是该进程执行的唯一依据。 inittab
文件除注释行外,每一行皆有其格式: id:runlevels:action:process- id:配置记录符
- 由
1~4
个字符组成,对于getty
或者mingetty
等其他login
程序项,要求id
与tty
的编号相同,否则getty
程序将不能正常工作。
- 由
- runlevels:运行级别记录符
- 一般使用
0~6
以及S
和s
,其中0,1,6
运行级别为系统保留,0:shutdown动作
1:重启至单用户模式,在此模式下,用户登录不需要密码,网卡默认是不加载的,一些服务也是不能用的
2:表示多用户,NFS服务不开启
*3:表示命令行模式
*4:保留未用
*5:图形用户模式
*6:重启系统
S/s:单用户模式,且无需inittab文件,因此也不在inittab中出现
7~9:可以使用,传统的UNIX没有定义此级别
runlevels
可以并列多个值,对多数action
来说,仅当runlevel
与当前运行级别匹配成功才会执行。
- 一般使用
- action:描述系统执行特定操作
- 常见设置有:
initdefault
,sysinit,boot,bootwait,respawn
等。initdefault
:系统默认的启动级别,即开机之后默认进入的运行级别*。sysinit
:系统初始化,只有系统开机或重新启动的时候,这个process
才会被执行一次boot
:只有在引导过程中,才执行该进程,但不等待该进程的结束;当该进程死亡时,也不重新启动该进程*。bootwait
:只有在引导过程中,才执行该进程,并等待进程的结束;当该进程死亡时,也不重新启动该进程*。respawn
:表示process
进程结束之后会重新启动运行*。
- 常见设置有:
- process:设置启动进程所执行的命令
- id:配置记录符
init进程
的作用是启动Linux
系统服务(也就是运行在后台的守护进程
)Linux
系统服务包括两种:- 第一种独立运行的系统服务,其常驻内存中,开机后一直运行。
- 第二种是有
xinet
设定的服务,能够同时监听多个指定端口,根据请求需求启动不同的网络服务进程,可以将其看作是一个启动服务的服务管理器。
参考文献:《Linux嵌入式应用程序开发标准教程(第2版)》
参考文献:《Linux下inittab文件详解》