Linux系统引导过程及硬盘分区结构论述

一、系统引导过程简介

  系统引导过程主要由以下几个步骤组成(以硬盘启动为例)

  1、 开机;

  2、 BIOS加电自检(POST——Power On Self Test),内存地址为0fff:0000;

  3、 将硬盘第一个扇区(0头0道1扇区,也就是Boot Sector)读入内存地址0000:7c00处;

  4、 检查(WORD)0000:7dfe是否等于0xaa55.若不等于则转去尝试其他介质;如果没有其他启动介质,则显示 “No ROM BASIC” ,然后死机;

  5、 跳转到0000:7c00处执行MBR中的程序;

  6、 MBR先将自己复制到0000:0600处,然后继续执行;

  7、 在主分区表中搜索标志为活动的分区。如果发现没有活动分区或者不止一个活动分区,则停止;

  8、 将活动分区的第一个扇区读入内存地址0000:7c00处;

  9、 检查(WORD)0000:7dfe是否等于0xaa55,若不等于则显示 “Missing Operating System”,然后停止,或尝试软盘启动;

  10、 跳转到0000:7c00处继续执行特定系统的启动程序;

  11、 启动系统。

  以上步骤中(2),(3),(4),(5)步由BIOS的引导程序完成;(6),(7),(8),(9),(10)步由MBR中的引导程序完成。

  一般多系统引导程序(如Smart Boot Manager, BootStar, PQBoot等)都是将标准主引导记录替换成自己的引导程序,在运行系统启动程序之前让用户选择想要启动的分区。而某些系统自带的多系统引导程序(如 LILO,NT Loader等)则可以将自己的引导程序放在系统所处分区的第一个扇区中,在Linux中即为两个扇区的SuperBlock.

  注:以上步骤中使用的是标准的MBR,多系统引导程序的引导过程与此不同。

二、硬盘结构及参数

  3D参数(Disk Geometry):CHS(Cylinder/Head/Sector) C-Cylinder柱面数表示硬盘每面盘片上有几条磁道,最大为1024(用10个二进制位存储);H-Head磁头数表示硬盘总共有几个磁头,也就是几面盘片,最大为256(用8个二进制位存储);S-Sector扇区数表示每条磁道上有几个扇区,最大为63(用6个二进制位存储)。

  1、引导扇区

  Boot Sector组成

  Boot Sector也就是硬盘的第一个扇区,它由MBR(Master Boot Record), DPT(Disk Partition Table) 和 Boot Record ID三部分组成。 MBR又称为主引导记录,占用Boot Sector的前446个字节(0~0x1BD),存放系统主引导程序(它负责从活动分区中装载并且运行系统引导程序)。 DPT即主分区表占用64个字节(0x1BE~0x1FD),记录磁盘的基本分区信息。主分区表分为四个分区项,每项16个字节,分别记录每个主分区的信息(因此最多可以有四个主分区)。 Boot Record ID即引导区标记占用两个字节(0x1FE~0x1FF),对于合法引导区,它等于0xaa55,这是判别引导区是否合法的标志)。

  Boot Secor具体结构如图:



  2、分区表结构简介

  分区表由四个分区项构成,每一项结构如下:

  BYTE State:分区状态,0=未激活,0x80=激活(注意此项);

  BYTE StartHead:分区起始磁头号;

  WORD StartSC:分区起始扇区和柱面号,底字节的底6位为扇区号,高2位为柱面号的第9,10位,高字节为柱面号的低8位;

  BYTE Type:分区类型,如0x0B=FAT32,0x83=Linux等,00表示此项未用;

  BYTE EndHead:分区结束磁头号;

  WORD EndSC:分区结束扇区和柱面号,定义同前;

  DWORD Relative:在线性寻址方式下的分区相对扇区地址(对于基本分区即为绝对地址);

  DWORD Sectors:分区大小(总扇区数)。

  在DOS或Windows系统下,基本分区必须以柱面为单位划分(Sectors*Heads个扇区),如对于CHS为764/256/63的硬盘,分区的最小尺寸为256*63*512/1048576=7.875MB.

  由于硬盘的第一个扇区已经被引导扇区占用,所以一般来说,硬盘的第一个磁道(0头0道)的其余62个扇区是不会被分区占用的。某些分区软件甚至将第一个柱面全部空出来。

  扩展分区结构如图:

三. 系统启动过程简介

系统启动过程主要由一下几步组成(以硬盘启动为例):

    1. 开机 :-)
    2. BIOS 加电自检 ( Power On Self Test -- POST )内存地址为 0ffff:0000
    3. 将硬盘第一个扇区 (0头0道1扇区, 也就是Boot Sector)读入内存地址 0000:7c00 处.
    4. 检查 (WORD) 0000:7dfe 是否等于 0xaa55, 若不等于则转去尝试其他启动介质, 如果没有其他启动介质则显示"No ROM BASIC" 然后死机.
    5. 跳转到 0000:7c00 处执行 MBR 中的程序.
    6. MBR 首先将自己复制到 0000:0600 处, 然后继续执行.
    7. 在主分区表中搜索标志为活动的分区. 如果发现没有活动分区或有不止一个活动分区, 则转停止.
    8. 将活动分区的第一个扇区读入内存地址 0000:7c00 处.
    9. 检查 (WORD) 0000:7dfe 是否等于 0xaa55, 若不等于则显示 "Missing Operating System" 然后停止, 或尝试软盘启动.
    10. 跳转到 0000:7c00 处继续执行特定系统的启动程序.
    11. 启动系统 ...

    以上步骤中 2,3,4,5 步是由 BIOS 的引导程序完成. 6,7,8,9,10步由MBR中的引导程序完成.

    一般多系统引导程序 (如 SmartFDISK, BootStar, PQBoot 等)都是将标准主引导记录替换成自己的引导程序, 在运行系统启动程序之前让用户选择要启动的分区.
    而某些系统自带的多系统引导程序 (如 lilo, NT Loader 等)则可以将自己的引导程序放在系统所处分区的第一个扇区中, 在 Linux中即为 SuperBlock (其实 SuperBlock 是两个扇区).

    注: 以上各步骤中使用的是标准 MBR, 其他多系统引导程序的引导过程与此不同.



你可能感兴趣的:(Linux系统引导过程及硬盘分区结构论述)