linux系统下开机启动流程
在了解开机启动流程之前,还是得先了解一些磁盘的基本知识。磁盘主要由盘片,机械手臂,磁头,主轴马达构成。盘片就是存储数据的物理单位了。然后盘片上我们可以分成扇区(sector)和柱面(cylinder),每个扇区sector为512Bytes。如下图所示:
磁盘在分区完成之后,每个分区(文件系统)都有一个启动扇区(boot sector),而开机时用到的则是整个磁盘的第一个扇区,这个扇区非常主要,构成如下:
(1)主引导分区(MBR)master boot record;446Bytes;系统安装时在在此区域安装引导加载程序即BootLoader
(2)分区表(partion table);64Bytes;记录整块磁盘的分区状态;
要了解启动流程,还有两个不得不说的概念,那就是BIOS和CMOS。CMOS是记录各项硬件参数并且嵌入在主板上的存储器,BIOS是开机执行的第一个程序,用它来确认硬件设备的启动顺序,然后在对应的硬件设备中找到引导程序。
好了,下面分阶段介绍开机的启动流程。
第一阶段:BIOS
上电之后,BIOS是计算机执行的第一个程序,计算机首先进行硬件自检,如果出现错误,则发出不同的蜂鸣声。自检完毕后,BIOS要把控制权交给下一阶段的引导程序,但如何转交呢。由于下一阶段的引导程序是放在磁盘分区的boot sector(引导扇区)里面,所以BIOS会根据预先设定好的次序的优先去找到某个硬件设备分区(就是平常我们说的从U盘,硬盘,光盘cd等)的引导扇区。
第二阶段:主引导记录
它可以告诉计算机去哪里找到系统。除此之外,MBR还包含有其他信息。分布如下:
(1)0-445 ,共446Bytes, 调用操作系统的机器码;
(2)446-509,共64Bytes,分区表信息;
(3)510-511,共2Bytes,主引导记录签名(0x55,0xAA);
这里面的第1点和第3点都比较清晰了,唯独第2点还需在深究一下,分区表信息里面包含了什么内容呢?具体如下6部分
(1)0, 0x80,代表该分区是激活分区,4个分区里面只能有一个激活分区;
(2)1-3, 主分区第一个扇区的物理位置(柱面,磁头,扇区号等);
(3)4,主分区类型;
(4)5-7,主分区最后一个扇区的物理位置;
(5)8-11,主分区第一个扇区的逻辑地址;
(6)12-15,主分区的总扇区数;
扇区总数为32bits,也就是说如果每个扇区的大小为512Bytes,那么每个分区的大小最大为2的32次方字节,即2TB。
到此为止,计算机已经找到引导程序了。
第三阶段:硬盘启动
这里又分为以下3种情况。
(1)卷引导记录
这一种方式启动最为简单,在四个分区里面只有一个是被激活的,找到激活分区的第一个扇区(Volume Boot Record:VBR),然后通过引导程序加载系统内核启动系统即可;
(2)扩展分区记录
由于现在硬盘越来越大,4个分区还已经不够支持,因此规定有且仅有一个主分区可以定义为扩展分区,在扩展分区中再进行逻辑扩展,即逻辑分区。而引导记录则位于该扩展扇区的第一个扇区,称为扩展引导记录(extend Boot Record:EBR)。在这个扇区中,也有一个分区表,不过这个分区表只有两项分区信息。这样计算机根据第二项分区信息找到下一个逻辑分区,然后在下一个逻辑分区的第一个扇区里面做同样的事情找到第三个逻辑分区,循环下去直至找到自己的逻辑分区就是最后一个逻辑分区了。
(3)启动管理器
这个的作用主要是安装多个操作系统,找到主引导记录不是把控制权交给某一个分区而是交给已经安装好的“启动管理器”BootLoader,由用户选择某个操作系统。Grub则是Linux环境最流行的启动管理器了。