1引导过程:
oLinux的引导过程包括很多阶段。
o
o首先,必须有内核引导程序(通常是GRUB或LILO)来加载并运行内核。
o
o还需要有软件能够加载并运行内核引导程序,而这个软件本身又需要被其他软件来加载并运行,这样一个递归的引导程序最终必须在某个地方终止,这个地方就是系统硬件。
2 X86 PC引导过程:
o引导过程:CPU加载BIOS,BIOS加载内核引导程序,内核引导程序加载压缩内核,压缩内核加载解压内核。
(1)CPU自身初始化
o如果有多个CPU,即多处理器系统,则每个CPU都要进行自身初始化。
o
o主CPU执行引导过程的剩余工作,随后内核才会激活CPU。
o
oCPU从某个固定位置(一般是0Xfffffff0)取得指令并执行。该指令为跳转指令,跳转到BIOS代码首部。
(2)BIOS
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
o在PC环境中,常用LILO和GRUB;嵌入式环境中常用U-Boot和RedBoot。
(4)内核:
o内核映像以压缩的形式存储,并不是一个可执行的内核。因此,内核阶段的首要工作是自解压内核映像。
o如下图内核编译生成vmlinux后,通常会对其再进行压缩,成为zimage(小于512KB)或bzimage(大于512KB)。在它们的头部都内嵌有解压缩程序。
内核阶段的主要函数流程:
ostart():汇编例程,进行基本的硬件设置。
ostartup_32():设置基本的运行环境(堆栈等),并清除BSS。
oDecompress_kernel():调用gunzip函数将内核解压到内存的指定位置。
ostartup_32():初始化页表,启动内存分页功能,并为任何可选的浮点单元检测CPU的类型,将其存储起来供以后使用。
Start_kernel():进行内核的初始化
内核的初始化:
start_kernel函数被调用,进入体系结构无关的内核部分。自此,内核的引导过程告一段落,进入内核的初始化过程
o从start_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,就可以产生每一个需要的进程。