第4章 系统初始化

引导过程


(1)CPU自身初始化

CPU自身的初始化是引导过程的第一步,如果有多个CPU,即多处理器系统,则每个CPU都要进行自身初始化。

比如,对于双处理器的Pentium系统,一个CPU总是为主,另外一个CPU总是为辅,主CPU执行引导过程的剩余工作,随后内核才会激活辅CPU。

在辅CPU被激活之前,我们可以认为该体统中只有一个CPU可用,而不必考虑另外一个CPU。

接下来,CPU从某个固定位置(一般是0Xfffffff0)取得指令并执行。该指令为跳转指令,跳转到BIOS代码的首部。注意,CPU并不真正关心BIOS是否存在,

它只是执行该地址中保存的任何指令。


(2)BIOS

BIOS被固化于主板上一个容量相对较小的只读存储器(Read-Only Memory,ROM)中,它的工作主要有两个:加电自检,即进行所谓的POST(Power On

Self  Test);加载内核引导程序。


POST阶段完成系统硬件的检测,包括内存检测、系统总线检测等。BIOS在POST阶段依据内置的规则,或者用户的手工选择确定启动设备。

POST完成之后,BIOS读取启动设备第一个扇区,即首512字节的信息,该扇区又被称之为主引导记录。MBR中保存了内核引导程序的开始部分,BIOS将

其加载到内存并执行。

加载内存引导程序之后,POST部分的代码会被从内存中清理出来,但仍然会有部分的运行时服务保留在内存之中,供目标操作系统使用。


(3)内核引导程序

内核引导程序分为两个阶段:MBR中的主引导程序;活动分区引导记录中的次引导程序。


(4)内核

内核映像被加载到内存并获得控制器之后,内核阶段开始工作。通常,内核映像以压缩形式存储,并不是一个可执行的内核。因此,内核阶段的首要工作

是自解压内核映像。


内核初始化


start_kernel函数

reset_init函数

kernel_init函数

init_post函数



init进程


当内核被引导并进行初始化之后,内核启动了自己的第一个用户空间应用程序,即init。这是调用的第一个使用标准C库编译的程序,其进程编号始终为1.

init负责触发其他必须的进程,以使系统进入整体可用的状态。init的这些工作根据/etc/inittab文件来完成,包括设置getty进程接受用户登录,设置键盘、

字图,设置网络等。如果没有init触发这些进程,内核即使成功启动,也没有多大意义。

基于这种设计模式,init进程是系统中所有进程的起源,init进程产生getty进程,getty进程产生login进程,login进程又进而产生shell进程,然后我们使用

shell。就可以产生每一个需要执行的进程。


内核选项解析


内核选项;注册内核选项


子系统的初始化


do_initcalls()函数

do_initcall函数通过for循环,由_initcall_start开始,直到_initcall_end结束,依次调用识别到的初始化函数。而位于_install_start和_initcall_end之间

的区域组成了.initcall.init节,其中保存了由xxx_initcall形式的宏标记的函数地址,do_initcall函数可以很轻松地取得函数地址并执行其指向的函数。

.initcall.init节所保存的函数地址有一定的优先级,越前面的函数优先级越高,也会比位于后面的函数先被调用。

由do_initcalls函数调用的函数不应该改变其优先级状态和禁止中断。因此,每个函数执行后,do_initcalls会检查该函数是否做了任何变化,如果有必要,

它会校正优先级和中断状态。

另外,这些被执行的函数又可以完成一些需要异步执行的任务,flush_schedule_work函数则用于确保do_initcalls函数在返回前等待这些异步任务结束。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值