(二)系统初始化&start_kernel

1引导过程:

oLinux的引导过程包括很多阶段。

o

o首先,必须有内核引导程序(通常是GRUBLILO)来加载并运行内核。

o

o还需要有软件能够加载并运行内核引导程序,而这个软件本身又需要被其他软件来加载并运行,这样一个递归的引导程序最终必须在某个地方终止,这个地方就是系统硬件。

X86 PC引导过程:

o引导过程:CPU加载BIOSBIOS加载内核引导程序,内核引导程序加载压缩内核,压缩内核加载解压内核。

(1CPU自身初始化

o如果有多个CPU,即多处理器系统,则每个CPU都要进行自身初始化。

o

oCPU执行引导过程的剩余工作,随后内核才会激活CPU

o

oCPU从某个固定位置(一般是0Xfffffff0)取得指令并执行。该指令为跳转指令,跳转到BIOS代码首部。

 2BIOS

oBIOS被固化在主板上一个容量相对较小的只读存储器ROM中,它有两个主要工作:加电自检即进行所谓的POST;加载内核引导程序。

o

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

oPOST完成之后,BIOS读取启动设备第一个扇区(主引导记录MBR),MBR中保存了内核引导程序的开始部分,BIOS将其加载到内存并执行。

o

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

 3)内核引导程序

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

oMBR结构如右图,是512字节的映像。最后两个字节是固定的,用于检查MBR是否有效

o主引导程序扫描分区表,寻找活动分区,将位于活动分区引导记录中的次引导程序加载到内存中并执行。

o

o次引导程序负责加载Linux内核映像,并将控制权转交给内核。

o

oPC环境中,常用LILOGRUB;嵌入式环境中常用U-BootRedBoot

 

 4)内核:

o内核映像以压缩的形式存储,并不是一个可执行的内核。因此,内核阶段的首要工作是自解压内核映像。

o如下图内核编译生vmlinux后,通常会对其再进行压缩,成为zimage(小于512KB)或bzimage(大于512KB)。在它们的头部都内嵌有解压缩程序。

 内核阶段的主要函数流程:

ostart():汇编例程,进行基本的硬件设置。

ostartup_32():设置基本的运行环境(堆栈等),并清除BSS

oDecompress_kernel():调用gunzip函数将内核解压到内存的指定位置。

ostartup_32():初始化页表,启动内存分页功能,并为任何可选的浮点单元检测CPU的类型,将其存储起来供以后使用。

Start_kernel():进行内核的初始化

 

 

 

内核的初始化:

start_kernel函数被调用,进入体系结构无关的内核部分。自此,内核的引导过程告一段落,进入内核的初始化过程

 

ostart_kernel函数开始,内核即进入了C语言部分,它完成了内核的大部分初始化工作。实际上,可以将start_kernel函数看做内核的main函数。

ostart_kernel相当大,里面每一个调用的函数都足够复杂,这里只简单的描述一下函数的功能,从而对kernel启动的过程有一个比较直观的了解。

 start_kernel:

 

 

 

 

rest_init :

 kernel_init:

 init_post:

 

init进程 :

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

o基于这种设计模式,init进程是系统中所有进程的起源,init进程产生getty进程,getty进程产生login进程,login进程又产生shell进程,然后我们使用shell,就可以产生每一个需要的进程。

猜你喜欢

转载自blog.csdn.net/qq_34863439/article/details/88361583