标签:linux启动流程 bios grub linux 启动流程
Linux系统的启动流程大致可以分为以下几个步骤:
POST(加电自检)--> 系统引导(grub,efi)--> 启动内核 --> 初始化系统 --> 打印登录提示符
下面详细介绍下每个步骤的情况:
1、BIOS启动
BIOS(Basic Input / Output System),又叫基本输入输出系统,这是一段程序,永久性的记录在主板上的ROM中,ROM中的内容一担写入则无法更改,所以上的内容是只读的。现在高级了一点,用闪存代替了ROM,可以对BIOS程序进行升级。BIOS包括这几个内容:
● 自诊断程序 #通过读取CMOS RAM中的内容识别硬件配置,并对其进行自检和初始化
● CMOS设置程序 #引导过程中,通过特殊热键启动,进行设置后,存入CMOS RAM中
● 系统自动装载程序 #在系统自检成功后,将磁盘相对0道0扇区上的引导程序装入内存使其运行
● 主要I/O驱动程序 #BIOS和硬件直接打交道,需要加载I/O驱动程序
● 中断服务 #主要用来在程序软件与微机硬件之间实现衔接
这些程序的具体执行过程如下:
1) 按下电源开关,电源就开始向主板和其它设备供电;当芯片组检测到电源已经开始稳定供电了,它便撤去RESET信号,CPU马上就从地址FFFF:0000H 处开始执行指令,放在这里的只是一条跳转指令,跳到系统BIOS中真正的启动代码处。
2)系统BIOS的启动代码首先进行POST(Power-On Self Test,加电后自检)。POST的主要检测系统中一些关键设备是否存在和能否正常工作,例如内存和显卡等设备;由于POST是最早进行的检测过程,此时显卡还没有初始化,如果系统BIOS在进行POST的过程中发现了一些致命错误,例如没有找到内存或者内存有问题(此时只会检查640K常规内存),那么系统BIOS就会直接控制喇叭发声来报告错误,声音的长短和次数代表了错误的类型;在正常情况下,POST过程进行得非常快,几乎无法感觉到它的存在。POST结束之后就会调用其它代码来进行更完整的硬件检测。
3)接下来系统BIOS将查找显卡的BIOS。前面说过,存放显卡BIOS的ROM芯片的起始地址通常设在C0000H处,系统BIOS在这个地方找到显卡BIOS之后就调用它的初始化代码,由显卡BIOS来初始化显卡。此时多数显卡都会在屏幕上显示出一些初始化信息,介绍生产厂商、图形芯片类型等内容,不过这个画面几乎是一闪而过。系统BIOS接着会查找其它设备的BIOS程序,找到之后同样要调用这些BIOS内部的初始化代码来初始化相关的设备。
4)查找完所有其它设备的BIOS之后,系统BIOS将显示出它自己的启动画面,其中包括有系统BIOS的类型、序列号和版本号等内容。
5)接着系统BIOS将检测和显示CPU的类型和工作频率,测试所有的RAM,并同时在屏幕上显示内存测试的进度。可以在CMOS设置中自行决定使用简单耗时少或者详细耗时多的测试方式。
6)内存测试通过之后,系统BIOS将开始检测系统中安装的一些标准硬件设备,包括硬盘、CD-ROM、串口、并口和软驱等设备,另外绝大多数较新版本的系统BIOS在这一过程中还要自动检测和设置内存的定时参数、硬盘参数和访问模式等。
7) 标准设备检测完毕后,系统BIOS内部支持即插即用的代码将开始检测和配置系统中安装的即插即用设备。每找到一个设备之后,系统BIOS都会在屏幕上显示出设备的名称和型号等信息,同时为该设备分配中断、DMA通道和I/O端口等资源。
8)到这一步为止,所有硬件都已经检测配置完毕了,多数系统BIOS会重新清屏并在屏幕上方显示出一个表格,其中概略地列出了系统中安装的各种标准硬件设备,以及它们使用的资源和一些相关工作参数。
9)接下来系统BIOS将更新ESCD(Extended System Configuration Data,扩展系统配置数据)。ESCD是系统BIOS用来与操作系统交换硬件配置信息的一种手段,这些数据被存放在CMOS(一小块特殊的RAM,由主板上的电池来供电)之中。
10) ESCD更新完毕后,系统BIOS的启动代码将进行它的最后一项工作:即根据用户指定的启动顺序从软盘、硬盘或光驱启动MBR。在这个过程中会按照启动顺序比较其放置MBR的位置的结尾两位是否为0xAA55,通过这种方式判断从哪个引导设备进行引导。在确定之后,将该引导设备的MBR内容读入到0x7C00的位置,并再次判断其最后两位,当检测正确之后,进行阶段1(stage1)的引导。
加载了MBR后,就开始了系统的引导过程,系统的引导过程分2个阶段:stage1,stage2。主要的引导工作有stage2完成。其实在stage1和stage2之间还有一个stage1_5,stage1_5,是进入stage2的一个桥梁。先介绍一下MBR,MBR是Master Boot Record的缩写,位于硬盘的0柱面0磁道1扇区上,总大小512字节,一共由3部分组成:
● 1~446(字节): bootloader # 引导加载器,是一段程序
● 之后的64(字节):partation table #分区表
● 最后2(字节):5A #表示bootloader和分区表是否有效的标记位(MBR 以两个特殊数字的字节(0xAA55)结束。这个数字会用来进行 MBR 的有效性检查。)
2、grub的stage1阶段
stage1部分占用了446字节,其代码文件是源码目录下stage1/stage1.S文件,汇编后生成一个512字节的boot.img,被写在硬盘的0面0道1扇区中,作为硬盘的MBR。stage1的工作很简单,就是加载0面0道2扇区上的512字节到0×8000,然后跳转到0×8000执行。 在0面0道2扇区上的512字节内容为stage1/start.S文件汇编后生成。该扇区上的内容的作用是加载stage1.5。
3、加载stage1.5阶段
Stage1.5作用很单一,但是非常关键。它的主要功用就是构造一个boot分区系统对应的文件系统,这样可以通过文件系统的路径(/boot/grub/)寻找stage2过程需要的core.img,进而加载到内存中开始执行。
Stage1.5存在于0面0道3扇区开始的地方,并一直延续十几k字节的区域,具体的大小与相应的文件系统的大小有关(文中涉及到了0面0道1-3+x扇区,这部分扇区为保留扇区,BIOS不会放置任何数据。Stage1.5过程被构建成多种不同类型,但是功能类似。e2fs_stage1_5(针对ext2fs,可引导ext2和ext3文件系统)、fat_stage1_5(针对fat文件系统,可引导fat32和fat16)、ffs_stage1_5、jfs_stage1_5、minix_stage1_5、reiserfs_stage1_5、vstafs_stage1_5和xfs_stage1_5,这些文件被称为stage1.5过程,这些文件每个至少都在11k以上(stage1.5支持的文件系统位于/boot/grub目录下,以stage1_5结尾的文件)。
[root@baby-CentOS grub]# pwd /boot/grub [root@baby-CentOS grub]# ll total 280 -rw-r--r--. 1 root root 63 May 29 16:23 device.map -rw-r--r--. 1 root root 13380 May 29 16:23 e2fs_stage1_5 -rw-r--r--. 1 root root 12620 May 29 16:23 fat_stage1_5 -rw-r--r--. 1 root root 11748 May 29 16:23 ffs_stage1_5 -rw-------. 1 root root 769 May 29 16:43 grub.conf -rw-r--r--. 1 root root 11756 May 29 16:23 iso9660_stage1_5 -rw-r--r--. 1 root root 13268 May 29 16:23 jfs_stage1_5 lrwxrwxrwx. 1 root root 11 May 29 16:23 menu.lst -> ./grub.conf -rw-r--r--. 1 root root 11956 May 29 16:23 minix_stage1_5 -rw-r--r--. 1 root root 14412 May 29 16:23 reiserfs_stage1_5 -rw-r--r--. 1 root root 1341 Nov 15 2010 splash.xpm.gz -rw-r--r--. 1 root root 512 May 29 16:23 stage1 -rw-r--r--. 1 root root 126100 May 29 16:23 stage2 -rw-r--r--. 1 root root 12024 May 29 16:23 ufs2_stage1_5 -rw-r--r--. 1 root root 11364 May 29 16:23 vstafs_stage1_5 -rw-r--r--. 1 root root 13964 May 29 16:23 xfs_stage1_5
除此之外还有两个比较特殊的文件,分别为nbgrub和pxegrub,这两个文件主要是在网络引导时使用,只是格式不同而已,他们很类似与stage2,只是需要建立网络来获取配置文件。 Stage1.5(0面0道3扇区开始,一直延续十几k字节)这中的内容是在安装grub时,安装程序通过判断/boot的文件系统类型,然后将这个文件系统安装至Stage1.5中。加载了stage1.5之后,引导程序就有了识别文件系统的能力,此后grub才有能力去访问/boot分区/boot/grub目录下的 stage2文件,将stage2载入内存并执行,将控制权移交给stage2。
4、加载stage2阶段
stage2被载入内存之后,就会去解析grub的配置文件/boot/grub/grub.conf,然后根据配置文件中的指定,装载内核和initramfs。来看下grub.conf文件内容:
default=0 timeout=5 splashimage=(hd0,0)/grub/splash.xpm.gz hiddenmenu title CentOS (2.6.32-431.el6.x86_64) root (hd0,0) kernel /vmlinuz-2.6.32-431.el6.x86_64 ro root=UUID=9d0bc805-83e7-4721-a22e-d78719566d51 rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=128M KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet initrd /initramfs-2.6.32-431.el6.x86_64.img
default #默认选择哪一个title
timeout #菜单显示的超时时长
splashimage=/path/to/some_image_file #grub背景图片;此图片只能为14bits色,xpm格式,gzip压缩;
hiddenmenu #是否隐藏菜单
title TILTE STRING #菜单中的标题(每一个title为一个内核与其相应的配置数据)
root #指定根目录,(hd0,0)以第一块硬盘,第一个分区(/boot)为根目录
kernel #指定内核位置,后面为启动内核的参数
initrd #指定initrd位置
再来介绍一下initramfs,由于内核加载之后需要驱动所有的硬件,而这些驱动程序的模块就存放在initramfs中,它就是一个虚拟的根文件系统。由于linux内核需要支持不同类型的硬件架构,但是不可能把每一种硬件的驱动都集成到内核中,所以在安装操作系统时,安装程序会去判断当前机器的硬件类型,然后将对应的驱动模块放到initramfs中(安装程序集成了当前市场上绝大部分硬件的驱动模块),然后在加载内核时,随内核一起被加载至内存中。下面是initramfs中的内容(通过cpio解压得到),和根目录下的文件内容差不多:
[root@baby-CentOS abc]# ls bin emergency initqueue-finished lib pre-trigger sys var cmdline etc initqueue-settled lib64 pre-udev sysroot dev init initqueue-timeout mount proc tmp dracut-004-335.el6 initqueue initramfs-2.6.32-431.el6.x86_64.img pre-pivot sbin usr
在initramfs中也有init程序,所以内核的启动被分成两个阶段:先执行initramfs中的init脚本,这是内核的控制权交给了init文件,这个脚本完成的主要是加载各种存储介质相关的设备驱动程序。
未完
标签:linux启动流程 bios grub linux 启动流程
原文地址:http://ljbaby.blog.51cto.com/10002758/1662851