linux引导过程

来源:互联网 发布:常见的大数据存储系统 编辑:程序博客网 时间:2024/06/05 14:52

1 CPU执行BIOS处的代码

BIOS是位于主板的闪存中某段特殊区域。这个过程主要是是执行BIOS中从地址0xFFFF0处开始的代码。主要是确定要使用哪个设备来引导系统, 这个过程的具体步骤为:

(1) 加电自检(POST),即对硬件进行检测

(2) 本地设备的枚举及初始化,BIOS会按照CMOS设定的顺序来搜索处于活动状态并且可以引导的设备。引导设备可以是USB,软盘,CD-ROM等,但通常是从硬盘上引导,而硬盘中的第一个扇区(0道0柱面1扇区)的512bytes是MBR,MBR中存在着主引导加载程序。当MBR被加载到RAM中后,BIOS就将控制权交给了MBR。

利用 dd if=/dev/sda of=mbr.bin bs=512, count=1 就可以提取mbr信息,再利用od -xa mbr.bin就可以以16进制,ascii码的形式打印出mbr的信息

2 第一阶段的引导加载程序——查找到活动的分区将其读入RAM中执行

MBR的主引导程序是一个512bytes的映像,它包含446bytes的bootloader程序及64bytes分区表(4个分区)及2bytes的magic number。MBR以0xAA55结束,可以利用这个数字检查mbr的有效性,mbr结构如下:


MBR中的主引导程序是查找并加载次引导加载程序,他是通过在分区表中查找一个活动分区实现的,将活动分区u的引导记录从这个设备中读入RAM中并执行

3 第二个阶段引导加载程序——加载linux内核和可选的初始RAM磁盘

在X86环境中,第一阶段和第二阶段的引导加载程序一起称为 Linux Loader(LILO)或 GRand Unified Bootloader(GRUB),关于GRUB,我们可以查看/boot/grub下面

[root@localhost grub]# lltotal 274-rw-rw-r--. 1 root root     63 Apr  3 17:32 device.map-rw-r--r--. 1 root root  13392 Apr  3 17:32 e2fs_stage1_5-rw-r--r--. 1 root root  12632 Apr  3 17:32 fat_stage1_5-rw-r--r--. 1 root root  11760 Apr  3 17:32 ffs_stage1_5-rw-------. 1 root root    809 Apr 28 19:52 grub.conf-rw-r--r--. 1 root root  11768 Apr  3 17:32 iso9660_stage1_5-rw-r--r--. 1 root root  13280 Apr  3 17:32 jfs_stage1_5lrwxrwxrwx. 1 root root     11 Apr  3 17:32 menu.lst -> ./grub.conf-rw-r--r--. 1 root root  11968 Apr  3 17:32 minix_stage1_5-rw-r--r--. 1 root root  14424 Apr  3 17:32 reiserfs_stage1_5-rw-r--r--. 1 root root   1341 Nov 15  2010 splash.xpm.gz-rw-r--r--. 1 root root    512 Apr  3 17:32 stage1-rw-r--r--. 1 root root 126108 Apr  3 17:32 stage2-rw-r--r--. 1 root root  12036 Apr  3 17:32 ufs2_stage1_5-rw-r--r--. 1 root root  11376 Apr  3 17:32 vstafs_stage1_5-rw-r--r--. 1 root root  13976 Apr  3 17:32 xfs_stage1_5
他包含了 stage1、stage1_5 和 stage2 引导加载程序,以及很多其他加载程序(例如,CR-ROM 使用的是 iso9660_stage_1_5)。

GRUB 不像 LILO 一样使用裸扇区,而是可以从 ext2 或 ext3 文件系统中加载 Linux 内核。它是通过将两阶段的引导加载程序转换成三阶段的引导加载程序来实现这项功能的。阶段 1 (MBR)引导了一个阶段 1.5 的引导加载程序,它可以理解包含 Linux 内核映像的特殊文件系统。当阶段 1.5 的引导加载程序被加载并运行时,阶段 2 的引导加载程序就可以进行加载,加载之后,GRUB 就可以在请求时显示可用内核列表(在 /etc/grub.conf 中进行定义)。将第二阶段的引导加载程序加载到内存中之后,就可以对文件系统进行查询了,并将默认的内核映像和 initrd 映像加载到内存中。当这些映像文件准备好之后,阶段 2 的引导加载程序就可以调用内核映像了。

4 内核开始:

当内核映像被加载到内存中,并且阶段 2 的引导加载程序释放控制权之后,内核阶段就开始了。内核映像并不是一个可执行的内核,而是一个压缩过的内核映像,我们一般是bzImage,接下来这个过程会经过Header.S ,startup等几个过程初始化一些硬件相关的,这里自己没太搞懂,就稍微略过,希望知道的相告。然后调用一个叫做decompress_kernel 的 C 函数,然后中间也有一个startup步骤,然后就到了init/start_kernel,这个可以参见我另一个对MD开机的回溯中对其的了解。http://blog.csdn.net/menogen/article/details/24665125

start_kernel,会调用一系列初始化函数来设置中断,执行进一步的内存配置,并加载初始 RAM 磁盘。最后,要调用 kernel_thread启动kernel_init 线程,里边很重要的一个是有do_basic_setup,主要是对直接编译进内核的一些模块的加载及初始化等。然后一个就是在init_post是内核初始化的尾声,在这里边开始调用用户程序的第一只程序init,关于这个程序的一些,可以参考一些网上的blog,所以要注意的是init有分内核的init跟用户层的init,而用户层的是在内核init后的尾声init_post中开始的。


0 0
原创粉丝点击