系统启动-以Linux为例

这篇说一下计算机的启动过程,主要是PC系统上Linux的启动过程,嵌入式的稍微提到一下,这上面的东西不一定非常正确,大多从网上相关的技术文章中获取的信息,以及查阅了部分Linux的代码。

总的来说这个文章定位于学习交流的性质,如果您觉得有不对的地方请一定指出来。

正文开始:

系统复位完成后,CPU从一个确定的地址开始执行代码,PC就是从BIOS中开始执行。嵌入式CPU则是在复位后从一个位于闪存或者ROM的已知地址处开始执行,具体这个地址在哪儿应该去查阅所使用CPU的datasheet,一般上面都有说明。

下面接着说PC,在PC中,是从地址0xFFFF0处开始执行的,这个地址正好在BIOS的地址范围之内,这里是一条跳转指令,跳转到BIOS真正的启动代码处(此处更具体的过程应该查阅PC相关的架构设计文档,Intel那几大本应该有用)。BIOS一开始是加电自检,即所谓POST过程,POST过程完成后,其代码就被清除出内存了,然后是BIOS的第二阶段,这个阶段进行本地设备的枚举和初始化,这部分代码在BIOS结束后仍然驻留内存,目标操作系统可以使用这些服务。BIOS最后会根据用户的配置来查找活动分区,这里以硬盘为例。系统BIOS将读取并执行硬盘上MBR处的代码,这里就进入了引导加载程序的部分,我们以当前大多数Linux发行版中使用的grub为例来进行说明。由于BIOS访问的存储空间有限,所以大多把引导加载程序分成两个阶段来进行引导。

GRUB(GNU GRand Unified Bootloader)
MBR(Master Boot Record),一共512字节,位于磁盘的0道0柱面1扇区,即第一扇区。当MBR被加载到RAM后,BIOS将控制权交给了MBR,MBR中的主引导加载程序是一个512字节的映像,其中包含程序代码和一个分区表。其中前446个字节是第一阶段引导加载程序,其中包含了可执行代码和错误消息文本,接下来64字节是分区表,其中包含4个分区的记录(每个记录大小为16字节)。MBR以两个特殊字节(0xAA55)结尾,用作MBR的有效性检查。

第一阶段引导加载程序的工作是查找并加载第二阶段的引导程序,它通过在分区表中查找一个活动分区来实现这种功能,当找到一个活动分区的时候,它会扫描分区表中的其他分区,以确保它们是不活动的,当这个过程验证完成后,就将活动分区的引导记录从这个设备中读入RAM并执行。

在这里要提到一下,grub存在一个1.5阶段,之所以存在这个阶段是因为在这里grub可以识别文件系统,能够访问/boot/grub目录下的配置文件,而不是访问磁盘块的方式,这个在启动以后可以看一下/boot/grub目录下面有许多文件系统格式+1.5这样命名的文件,比如在我的机器上就有:
fat_stage1_5
jfs_stage1_5
minix_stage1_5
e2fs_stage1_5
reiserfs_stage1_5
xfs_stage1_5
可以看到这里包含了Linux常用的多种文件系统。在grub1.5阶段加载grub.conf之后,就可以看到启动选项的界面了,这里有许多可以配置的选项,鉴于本文的目的就不介绍了,可以参看grub的文档说明。

当1.5引导加载程序加载运行以后,第二阶段加载引导程序被加载到内存,并接管接下来的工作。它负责对文件系统进行查询定位内核和initrd映像的位置,并将它们加载到内存中,当这些映像准备完毕,阶段2引导加载程序调用内核入口函数,引导加载程序释放控制权,内核阶段开始。

一般内核是一个压缩过的内核映像,在解压缩之前,先有少量代码进行一些硬件配置,然后解压内核并将其放入到高端内存中,如果有initrd的话,会将它移到内存中,并表明以后可用,然后调用内核,开始启动内核引导过程。具体过程一般是从arch/i386/boot/head.S的start汇编函数开始执行,这个函数执行一些基本硬件配置,然后调用arch/i386/boot/compressed/head.S中的startup_32函数,该函数然后调用decompress_kernel解压内核,然后调用位于arch/i386/kernel/head.S中的startup_32函数,由它进一步初始化硬件,包括内存等,然后调用start_kernel,启动内核,最后由start_kernel函数在最后调用init启动第一个用户空间进程,然后开始用户空间的启动过程,直到整个系统启动完毕。

就先如此吧,下次可以将代码更好的结合一下。

参考资料:
[1] http://en.wikipedia.org/wiki/BIOS
[2] http://www.ibm.com/developerworks/cn/linux/l-linuxboot/
[3] http://www.ibm.com/developerworks/cn/linux/l-bootload.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章