(004)Linux的开机启动

十年运维系列之基础篇 - Linux

作者:曾林 

联系:1494445739@qq.com

网站:www.jplatformx.com

版权:文章未经同意请勿转载


 

一、引言

  这里虽然介绍的是Linux的开机启动,但是有些操作或者流程是不局限于linux操作系统的,而是针对几乎所有的操作系统。

 

二、 BIOS

  当我们按下开机键的时候,电流会经过电源线流经整个主板。此时,一个加电的特殊电路会“敲打”一下CPU的被称作reset的引脚。此时cpu内的某些寄存器,比如cs、eip就会出现一些固定的内容。cs的值是0xFFFF、eip的值为0x0000。这就是告诉cpu从物理内存地址0xFFFF0处开始执行代码。哪里有什么代码呢?其实就一条,那就是让cpu跳转。跳到哪里去呢,就是这小节的主角——BIOS。

  BIOS本质上是一个程序,而且它是电脑最开始执行的程序。它会读取CMOS(在计算机领域,CMOS常指保存计算机的基本启动信息的芯片。有时,人们会把BIOS和CMOS混淆,其实CMOS是主板上的一块可读写的并行或串行FLASH芯片,是用来保存BIOS的硬件设置和用户对某些参数的设置)中的信息来了解硬件情况,比如CPU的总线时钟、启动设备的搜素顺序、硬盘大小与型号、系统时间、即插即用设备、各设备的I/O地址、中断请求等。之后BIOS开始做开机自检,比如确定可用的内存(有时还要自己测试一下)、确定时钟速度等。如果测试成功则开始对硬件进行初始化、设定即插即用设备、确定启动设备……最后从启动设备中读取MBR,并将控制权交给MBR中的程序;如果测试不成功则会发出声响来提示(最常见的就是内存错误发出声响)。

   无论什么操作系统,都要要从MBR做入口的。以下就介绍MBR。

 

三、MBR

  MBR(全称master boot record),也就是主引导记录。很多人容易将MBR与Boot Sector(引导扇区)搞混淆。严格说应该是Boot Sector是由MBR、DPT(disk partition table)、和BRID(boot record ID,引导记录标识)三部分组成的,用公式表示如下:

Boot Sector = MBR + DPT + BRID

  Boot Sector的大小为512字节。其中MBR是446字节、DPT是64字节、BRID是2字节。

  BIOS并不是单独读取MBR的,它会将整个Boot Sector的全部内容读到内存中。因为从上面可知整个启动扇区的大小是512字节,于是BIOS会将整个512字节的Boot Sector内容读取到内存中0x7c00地址,然后BIOS会跳转到那里,将控制权交给MBR。因为这样的流程,这也就决定了MBR一定是在Boot Sector最前面,否则BIOS就将控制权交给DPT了。Boot Sector结构如下图:

  Boot Sector就是硬盘(准确得说是所有的可引导的存储介质)上的第一个扇区。BIOS读取CMOS中被设为启动设备的第一个扇区,并将控制权交给它。但是BIOS在交权的时候并不是在“第一扇区”的它都认,必须要验明正身才行。BIOS要检查是否有BRID这个东西,也就是Boot Sector的最后两个字节。看它是不是“0x55AA”这样的内容。如果不是就死机,是就交权。

 

四、DPT

  DPT(Disk Partiion Table,磁盘分区表),大小上面已经介绍过了,一共64字节。此外,一个分区需要占用16位。这样来看,一个硬盘分区就只能描述“四个分区”。下面就来具体看看分区表中的分区表项是个什么数据结构(DPT包含4个分区表项,每个分区表项的数据结构都是一样的)。

偏移量 长度(字节) 定 义
0x00 1 分区状态:0x00非活动分区;0x80活动分区; 其他数值没啥意义
0x01 1 分区起始磁头号
0x02 2

分区起始扇区号,0x02的0~5位

分区起始柱面号,0x02的6~7位和0x03的全部8位

0x04 1 文件系统标识位,0x83就是linux分区
0x05 1 分区结束磁头号
0x06 2

分区结束扇区号,0x06的0~5位

分区结束柱面号,0x06的6~7位和0x07的全部8位

0x08 4 分区起始相对扇区号
0x0C 4 分区总的扇区数

  注意上表的最后一行,分区的总扇区数是4个字节,也就是32位。也就是说,最多能表示2^32*512=2T这么大。因为分区表只能描述4个分区,那么顶天了就只能支持8T大小的硬盘。再大就没辙了吗?有办法,使用GPT,叫GUID分区表,单个分区就可以达到18EB。

  根据分区表可知,我们“只能”描述4个分区,那么多于4个分区就没法了吗?肯定是有办法的。注意DPT表项的0x04偏移量的位置,这个表示文件系统标识位。表上说明0x83是linux分区。还有一个标志0x05,表上没说,这里说明一下。这代表扩展分区。扩展分区也有类似DPT的东西,来描述逻辑分区(logic),而且没什么大小限制,可以分出任意多个逻辑分区。但是需要注意的是,不管逻辑分区有多少,其总和是不能超出2T的大小限制的。

  既然引入了扩展分区(Extended),又引出了逻辑分区(Logical),那么在DPT中剩下的三项(0x06, 0x08, 0x0C)代表什么?其实这三个代表的是主分区(Primary)。其实扩展分区也是主分区的一种,只是因为可以包含逻辑分区才这么命名的。而且扩展分区不能直接用,必须至少包含一个逻辑分区。Linux在对待主分区和逻辑分区还是有差别的。所以sda1~sda4都分配给主分区,不管你有没有分配;逻辑分区的分区号都是从5开始的。因此在linux上看一下分区所对应设备文件名,就能知道是主分区(Primary)还是逻辑分区(Logic)了。

 

posted @ 2015-04-01 17:28  jplatformx  阅读(219)  评论(0编辑  收藏  举报