Linux入职基础-4.9_系统启动过程(2):内核的引导程序
Linux系统启动过程(2):内核的引导程序
上节回顾:详解见上一篇《Linux系统启动过程(1):BIOS加电自检 》
系统BIOS程序启动第一个程序是POST,该程序运行代码是控制主机硬件系统环境进行自检,即确保其中的每一个部分硬件都得到了电源支持与正常可用(如,内存储器、主板上的其它芯片、键盘、鼠标、磁盘控制器及一些I/O 端口等),此后,POST(自检程序)运行正常结束,将控制权还给系统BIOS程序。
本节开始:
目前最常用的Linux引导加载程序是GRUB,它Red Hat Enterprise Linux 5.2默认的引导加载程序。GRUB被分成两部分安装到MBR扇区(主引导加载程序)和硬盘活动分区的引导扇区(次引导加载程序,亦称“内核加载程序”)。
关于MBR部分详见《硬盘与MBR》。
接着BIOS阶段继续:
①现在系统启动的控制权又回到了系统BIOS程序;
②接下来系统BIOS程序继续运行,读取CMOS 设置,获取到每个引导驱动器的顺序参数;CMOS设置如下图:
③然后,系统BIOS程序将依次把磁盘的第一个扇区(512B)载入内存,放在内存绝对地址0x7C00处,系统BIOS继续开始运行,检查这个扇区的最后两个字节是否为“55 AA”:
如果是,那么这个扇区就是一个存放了主引导记录(MBR)的扇区(亦称MBR扇区),这个磁盘就是被你设置的一块可引导Linux系统的启动盘;
如果不是,那么系统BIOS 就检查下一个磁盘驱动器。如下图:
主引导程序阶段:
④找到主引导记录的扇区后,就把其内的主引导程序(大小466字节;GRUB第一部分)先向下移动到内存0x600 处,主引导加载程序开始运行(此时系统BIOS程序交出控制权)。
⑤主引导程序搜索主分区表(大小64B,被包含在MBR扇区内,故一块被先前的系统BIOS程序加载人内存了)信息,分区表有四项(记录),每项16B;如果发现没有活动分区或有不止一个活动分区, 则程序停止。
关于分区表项记录的补充,见下面例子:
例:80 01 01 000BFE BF FC3F 00 00 007E 86 BB 00
“80”是一个分区的**标志,表示系统可引导;
“01 01 00”表示分区开始的磁头号为01,开始的扇区号为01,开始的柱面号为00;
“0B”表示分区的系统类型是FAT32,其他比较常用的有 04(FAT16)、07(NTFS);
“FE BF FC”表示分区结束的磁头号为254,分区结束的扇区号为63、分区结束的柱面号为764;
“3F 00 00 00”表示首扇区的相对扇区号为63;
“7E 86 BB 00”表示总扇区数为12289622。
⑥主引导程序把所指明活动分区中的第1个扇区(分区引导扇区)加载到内存0x7C00,即把次引导加载程序加载人内存,检查(WORD) 0x7DFE是否等于0xAA55,若不等于则显示"Missing OperatingSystem"然后停止,或尝试软盘启动。
实际应用:
用如下命令读取其引导扇区的内容:
[[email protected] ~]#dd if=/dev/sda of=/root/bootsector bs=512 count=1
把读出来的二进制文件拿出来看:
[[email protected] ~]#hexdump /root/bootsector
这里关于分区引导扇区的知识补充:
分区引导扇区DBR(DOS BOOT RECORD)是由FORMAT高级格式化命令写到该扇区的内容;
DBR主要由下列几个部分组成:
1.跳转指令,占用3个字节的跳转指令将跳转至引导代码;
2.厂商标识和DOS版本号,该部分总共占用8个字节;
3.BPB(BIOS Parameter Block, BIOS 参数块);
4.操作系统引导程序;
5.结束标志字,结束标志占用2个字节,其值为AA55
DBR中的内容除了第5部分结束标志字固定不变之外,其余4个部分都是不确定的,其内容将随格式化所用的操作系统版本及硬盘的逻辑盘参数的变化而变化。
BPB参数块:记录着本分区的起始扇区、结束扇区、文件存储格式、硬盘介质描述符、根目录大小、FAT个数,分配单元的大小等重要参数。
次引导加载程序阶段:
⑦跳转到0x7C00处,次引导加载程序(GRUB第二部分)开始执行(主引导程序执行结束,交出控制权),次引导程序利用ROM BIOS中的中断调用将系统参数(包括内存、磁盘等,由BIOS返回)拷贝到特别内存中,以便以后这些参数被保护模式下的代码来读取;检测和设置显示器和显示模式;便会显示GRUB的图形界面,如下:
⑧在该界面中用户可以通过上下方向键选择需要加载的操作系统以及它们的内核,把Linux内核模块(如vmlinuz-2.6.18-92.el5)和initrd.img(inital ram disk的宿写)读入内存绝对地址0x10000开始位置。
GRUB会根据/boot/grub.conf配置文件中所设置的信息,从/boot/所在的分区(活动分区)上读取Linux内核映像(对Win98,定位并执行io.sys;对 WinXP,定位并执行 ntoskrnl.exe;对于Linux,定位并执行vmlinuz-xxx内核映像)。
⑨把内核模块整块下移到内存绝对地址0x00000处。
⑩加载中断描述符表寄存器、全局描述符表寄存器,开启A20地址线,重设硬件中断号为0x20~0x2f,最后进入32位保护模式运行。
⑾次引导程序执行最后的跳转指令“jump 0,8”,跳到物理地址0x00000处,
内核模块开始运行(此时次引导程序执行结束,交出控制权),内核模块在获取控制权后开始工作。内核映像以压缩文件形式存储,并可以直接执行,因此内核最开始的工作就是解压自己,同时将压缩的initrd.img解压成正常的ram disk并且释放initrd所占的内存空间。
以上步骤顺序中:
1,2,3 步:是由 系统BIOS 的引导程序完成;
4,5,6步:由MBR扇区中的主引导程序完成;
7,8,9,10步:由活动分区中的引导扇区的次引导程序完成。
11步:内核映像的初始化请见下一回分解。
引导加载程序GRUB配置
GRUB的配置主要通过修改/boot/grub/目录下的grub.conf文件来完成,用户可以通过VI或者在图形界面中使用文件编辑工具打开该文件进行编辑。
1.default选项
2.timeout选项
3.splashimage选项
4.hiddenmenu选项
5.title选项
6.root (hdx,y)
7.kernel选项