详解硬盘 MBR
摘自:csdn博客:http://blog.csdn.net/sallay/article/details/3668614
硬盘是现在计算机上最常用的存储器之一。我们都知道,计算机之所以神奇,是
因为它具有高速分析处理数据的能力。而这些数据都以文件的形式存储在硬盘里。
不过,计算机可不像人那么聪明。在读取相应的文件时,你必须要给出相应的规
则。这就是分区概念。
分区从实质上说就是对硬盘的一种格式化。当我们创建分区时,就已经设置
好了硬盘的各项物理参数,指定了硬盘主引导
(即 Master Boot Record,
一般简称为MBR)和引导记录备份的存放位置。而对于文件系统以及其他操作
系统管理硬盘所需要的信息则是通过以后的高级格式化,即 Format命令来实现。
面、磁道和扇区硬盘分区后,将会被划分为面(Side)、磁道(Track)和扇区
(Sector)。需要注意的是,这些只是个虚拟的概念,并不是真正在硬盘上划轨
道。
先从面说起,硬盘一般是由一片或几片圆形薄膜叠加而成。我们所说,每个
圆形薄膜都有两个“面”,这两个面都是用来存储数据的。按照面的多少,依次称
为 0 面、1 面、2 面……由于每个面都专有一个读写磁头,也常用 0 头(head)、
1头……称之。按照硬盘容量和规格的不同,硬盘面数(或头数)也不一定相同,
少的只有 2面,多的可达数十面。各面上磁道号相同的磁道合起来,称为一个柱
面(Cylinder)。
上面我们提到了磁道的概念。那么究竟何为磁道呢?由于磁盘是旋转的,则
连续写入的数据是排列在一个圆周上的。我们称这样的圆周为一个磁道。如果读
写磁头沿着圆形薄膜的半径方向移动一段距离,以后写入的数据又排列在另外一
个磁道上。根据硬盘规格的不同,磁道数可以从几百到数千不等;一个磁道上可
以容纳数 KB的数据,而主机读写时往往并不需要一次读写那么多,于是,磁道
又被划分成若干段,每段称为一个扇区。一个扇区一般存放 512字节的数据。
扇区也需要编号,同一磁道中的扇区,分别称为 1扇区,2扇区……
计算机对硬盘的读写,处于效率的考虑,是以扇区为基本单位的。即使计算
机只需要硬盘上存储的某个字节,也必须一次把这个字节所在的扇区中的 512
字节全部读入内存,再使用所需的那个字节。不过,在上文中我们也提到,硬盘
上面、磁道、扇区的划分
面上是看不到任何痕迹的,虽然磁头可以根据某个磁
道的应有半径来对准这个磁道,但怎样才能在首尾相连的一圈扇区中找出所需要
的某一扇区呢?原来,每个扇区并不仅仅由 512个字节组成的,在这些由计算
机存取的数据的前、后两端,都另有一些特定的数据,这些数据构成了扇区的界
限标志,标志中含有扇区的编号和其他信息。计算机就凭借着这些标志来识别扇
区。硬盘的数据结构 在上文中,我们谈了数据在硬盘中的存储的一般原理。为
了能更深入地了解硬盘,我们还必须对硬盘的数据结构有个简单的了解。硬盘上
的数据按照其不同的特点和作用大致可分为 5部分:MBR区、DBR区、FAT 区、
DIR区和 DATA区。
我们来分别介绍一下:
1、MBR区
MBR(Main Boot Record 主引导记录区)位于整个硬盘的 0磁道 0柱面 1
扇区。不过,在总共 512字节的主引导扇区中,MBR只占用了其中的 446个字
节,另外的 64个字节交给了 DPT(Disk Partition Table 硬盘分区表),最后两
个字节“55,AA”是分区的结束标志。这个整体构成了硬盘的主引导扇区。
主引导记录中包含了硬盘的一系列参数和一段引导程序。其中的硬盘引导程
序的主要作用是检查分区表是否正确并且在系统硬件完成自检以后引导具有激
活标志的分区上的操作系统,并将控制权交给启动程序。MBR是由分区程序(如
Fdisk.exe)所产生的,它不依赖任何操作系统,而且硬盘引导程序也是可以改
变的,从而实现多系统共存。
下面,我们以一个实例让大家更直观地来了解主引导记录:
例:80 01 01 00 0B FE BF FC 3F 00 00 00 7E 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。
2、DBR区
DBR(Dos Boot Record)是操作系统引导记录区的意思。它通常位于硬盘的
0磁道 1柱面 1扇区,是操作系统可以直接访问的第一个扇区,它包括一个引导
程序和一个被称为 BPB(Bios Parameter Block)的本分区参数
。引导程
序的主要任务是当MBR将系统控制权交给它时,判断本分区跟目录前两个文件
是不是操作系统的引导文件(以 DOS为例,即是 Io.sys和 Msdos.sys)。
如果确定存在,就把它读入内存,并把控制权 交给该文件。BPB参数块记录着
本分区的起始扇区、结束扇区、文件存储格式、硬盘介质描述符、根目录大小、
FAT 个数,分配单元的大小等重要参数。DBR是由高级格式化程序(即
Format.com 等程序)所产生的。
3、FAT区
在 DBR之后的是我们比较熟悉的 FAT(File Allocation Table 文件分配表)
区。在解释文件分配表的概念之前,我们先来谈谈簇(Cluster)的概念。文件
占用磁盘空间时,基本单位不是字节而是簇。一般情况下,软盘每簇是 1个扇区,
硬盘每簇的扇区数与硬盘的总容量大小有关,可能是 4、8、16、32、64…… 同
一个文件的数据并不一定完整地存放在磁盘的一个连续的区域内,而往往会分成
若干段,像一条链子一样存放。这种存储方式称为文件的链式存储。由于硬盘上
保存着段与段之间的连接信息(即 FAT),操作系统在读取文件时,总是能够
准确地找到各段的位置并正确读出。 为了实现文件的链式存储,硬盘上必须准
确地记录哪些簇已经被文件占用,还必须为每个已经占用的簇指明存储后继内容
的下一个簇的簇号。对一个文件的最后一簇,则要指明本簇无后继簇。这些都是
由 FAT 表来保存的,表中有很多表项,每项记录一个簇的信息。由于 FAT 对于
文件管理的重要性,所以 FAT 有一个备份,即在原 FAT 的后面再建一个同样的
FAT。初形成的 FAT 中所有项都标明为“未占用”,但如果磁盘有局部损坏,那么
格式化程序会
出损坏的簇,在相应的项中标为“坏簇”,以后存文件时就不会
再使用这个簇了。FAT的项数与硬盘上的总簇数相当,每一项占用的字节数也
要与总簇数相适应,因为其中需要存放簇号。FAT 的格式有多种,最为常见的
是 FAT16和 FAT32。
4、DIR区
DIR(Directory)是根目录区,紧接着第二 FAT 表(即备份的 FAT 表)之后,
记录着根目录下每个文件(目录)的起始单元,文件的属性等。定位文件位置时,
操作系统根据 DIR中的起始单元,结合 FAT表就可以知道文件在硬盘中的具体
位置和大小了。
5、数据(DATA)区
数据区是真正意义上的数据存储的地方,位于 DIR区之后,占据硬盘上的大
部分数据空间。
一、硬盘的物理结构:
硬盘存储数据是根据电、磁转换原理实现的。硬盘由一个或几个表面镀有
磁性物质的金属或玻璃等物质盘片以及盘片两面所安装的磁头和相应的控制电
路组成(图 1),其中盘片和磁头密封在无尘的金属壳中。
硬盘工作时,盘片以设计转速高速旋转,设置在盘片表面的磁头则在电路控制
下径向移动到指定位置然后将数据存储或读取出来。当系统向硬盘写入数据时,
磁头中“写数据”电流产生磁场使盘片表面磁性物质状态发生改变,并在写电流磁
场消失后仍能保持,这样数据就存储下来了;当系统从硬盘中读数据时,磁头经
过盘片指定区域,盘片表面磁场使磁头产生感应电流或线圈阻抗产生变化,经相
关电路处理后还原成数据。因此只要能将盘片表面处理得更平滑、磁头设计得更
精密以及尽量提高盘片旋转速度,就能造出容量更大、读写数据速度更快的硬盘。
这是因为盘片表面处理越平、转速越快就能越使磁头离盘片表面越近,提高读、
写灵敏度和速度;磁头设计越小越精密就能使磁头在盘片上占用空间越小,使磁
头在一张盘片上建立更多的磁道以存储更多的数据。
二、硬盘的逻辑结构:
硬盘由很多盘片(platter)组成,每个盘片的每个面都有一个读写磁头。如果有
N个盘片。就有 2N个面,对应 2N个磁头(Heads),从 0、1、2开始编号。每
个盘片被划分成若干个同心圆磁道(逻辑上的,是不可见的。)每个盘片的划分规
则通常是一样的。这样每个盘片的半径均为固定值 R的同心圆再逻辑上形成了
一个以电机主轴为轴的柱面(Cylinders),从外至里编号为 0、1、2……每个盘片
上的每个磁道又被划分为几十个扇区(Sector),通常的容量是 512byte,并按照
一定规则编号为 1、2、3……形成 Cylinders×Heads×Sector个扇区。这三个参
数即是硬盘的物理参数。我们下面的很多实践需要深刻理解这三个参数的意义。
硬盘存储数据是根据电、磁转换原理实现的。硬盘由一个或几个表面镀有磁
性物质的金属或玻璃等物质盘片以及盘片两面所安装的磁头和相应的控制电路
组成(图 1),其中盘片和磁头密封在无尘的金属壳中。
三、磁盘引导原理:
3.1 MBR(master boot record)扇区:
计算机在按下 power键以后,开始执行主板 bios程序。进行完一系列检测
和配置以后。开始按 bios中设定的系统引导顺序引导系统。假定现在是硬盘。
Bios执行完自己的程序后如何把执行权交给硬盘呢。交给硬盘后又执行存储在
哪里的程序呢。其实,称为 mbr的一段代码起着举足轻重的作用。MBR(master
boot record),即主引导记录,有时也称主引导扇区。位于整个硬盘的 0柱面 0磁
头 1扇区(可以看作是硬盘的第一个扇区),bios在执行自己固有的程序以后就会
jump到mbr中的第一条指令。将系统的控制权交由mbr来执行。在总共 512byte
的主引导记录中,MBR的引导程序占了其中的前 446个字节(偏移 0H~偏移
1BDH),随后的64个字节(偏移1BEH~偏移1FDH)为DPT(Disk PartitionTable,
硬盘分区表),最后的两个字节“55 AA”(偏移 1FEH~偏移 1FFH)是分区有效结束
标志。
MBR不随操作系统的不同而不同,意即不同的操作系统可能会存在相同的
MBR,即使不同,MBR也不会夹带操作系统的性质。具有公共引导的特性。
我们来分析一段mbr。下面是用winhex查看的一块希捷120GB硬盘的mbr。
MBR扇区代码
你的硬盘的 MBR引导代码可能并非这样。不过即使不同,所执行的功能大体
是一样的。这里找 wowocock关于磁盘 mbr的反编译,已加了详细的注释,感
兴趣可以细细研究一下。
我们看 DPT 部分。操作系统为了便于用户对磁盘的管理。加入了磁盘分区的
概念。即将一块磁盘逻辑划分为几块。磁盘分区数目的多少只受限于 C~Z的英
文字母的数目,在上图 DPT 共 64个字节中如何表示多个分区的属性
呢?microsoft 通过链接的
解决了这个问题。在 DPT 共 64个字节中,以 16
个字节为分区表项单位描述一个分区的属性。也就是说,第一个分区表项描述一
个分区的属性,一般为基本分区。第二个分区表项描述除基本分区外的其余空间,
一般而言,就是我们所说的扩展分区。这部分的大体说明见表 1。
DPT代码分析
注:上表中的超过 1字节的数据都以实际数据显示,就是按高位到地位的方式
显示。存储时是按低位到高位存储的。两者表现不同,请仔细看清楚。以后出现
的表,图均同。
也可以在 winhex中看到这些参数的意义:
说明: 每个分区表项占用 16个字节,假定偏移地址从 0开始。如图 3的分
区表项 3。分区表项 4同分区表项 3。
1、0H偏移为活动分区是否标志,只能选 00H和 80H。80H为活动,00H
为非活动。其余值对 microsoft而言为非法值。
2、重新说明一下(这个非常重要):大于 1个字节的数被以低字节在前的存
储格式格式(little endian format)或称反字节顺序保存下来。低字节在前的格式是
一种保存数的方法,这样,最低位的字节最先出现在十六进制数符号中。例如,
相对扇区数字段的值 0x3F000000 的低字节在前表示为 0x0000003F。这个低字
节在前的格式数的十进制数为 63。
3、系统在分区时,各分区都不允许跨柱面,即均以柱面为单位,这就是通
常所说的分区粒度。有时候我们分区是输入分区的大小为 7000M,分出来却是
6997M,就是这个原因。 偏移 2H和偏移 6H的扇区和柱面参数中,扇区占 6位
(bit),柱面占 10位(bit),以偏移 6H 为例,其低 6 位用作扇区数的二进制表示。
其高两位做柱面数 10位中的高两位,偏移 7H组成的 8位做柱面数 10位中的低
8位。由此可知,实际上用这种方式表示的分区容量是有限的,柱面和磁头从 0
开始编号,扇区从 1开始编号,所以最多只能表示 1024个柱面×63个扇区×256个
磁头×512byte=8455716864byte。即通常的 8.4GB(实际上应该是 7.8GB 左右)
限制。实际上磁头数通常只用到 255个(由汇编语言的寻址寄存器决定),即使把
这 3个字节按线性寻址,依然力不从心。 在后来的操作系统中,超过 8.4GB 的
分区其实已经不通过 C/H/S的方式寻址了。而是通过偏移 CH~偏移 FH共 4个
字节 32位线性扇区地址来表示分区所占用的扇区总数。可知通过 4个字节可以
表示 2^32个扇区,即 2TB=2048GB,目前对于大多数计算机而言,这已经是个
天文数字了。在未超过 8.4GB 的分区上,C/H/S的表示方法和线性扇区的表示
方法所表示的分区大小是一致的。也就是说,两种表示方法是协调的。即使不协
调,也以线性寻址为准。(可能在某些系统中会提示出错)。超过 8.4GB的分区结
束 C/H/S一般填充为 FEH FFH FFH。即 C/H/S所能表示的最大值。有时候也会
用柱面对 1024的模来填充。不过这几个字节是什么其实都无关紧要了。
虽然现在的系统均采用线性寻址的方式来处理分区的大小。但不可跨柱面的
原则依然没变。本分区的扇区总数加上与前一分区之间的保留扇区数目依然必须
是柱面容量的整数倍。(保留扇区中的第一个扇区就是存放分区表的 MBR或虚拟
MBR的扇区,分区的扇区总数在线性表示方式上是不计入保留扇区的。如果是
第一个分区,保留扇区是本分区前的所有扇区。
附:分区表类型标志如图 4
3.2 扩展分区
扩展分区中的每个逻辑驱动器都存在一个类似于 MBR的扩展引导记录
( Extended Boot Record, EBR),也有人称之为虚拟 mbr或扩展 mbr,意思是一
样的。扩展引导记录包括一个扩展分区表和该扇区的标签。扩展引导记录将记录
只包含扩展分区中每个逻辑驱动器的第一个柱面的第一面的信息。一个逻辑驱动
器中的引导扇区一般位于相对扇区 32或 63。但是,如果磁盘上没有扩展分区,
那么就不会有扩展引导记录和逻辑驱动器。第一个逻辑驱动器的扩展分区表中的
第一项指向它自身的引导扇区。第二项指向下一个逻辑驱动器的 EBR。如果不
存在进一步的逻辑驱动器,第二项就不会使用,而且被记录成一系列零。如果有
附加的逻辑驱动器,那么第二个逻辑驱动器的扩展分区表的第一项会指向它本身
的引导扇区。第二个逻辑驱动器的扩展分区表的第二项指向下一个逻辑驱动器的
EBR。扩展分区表的第三项和第四项永远都不会被使用。
通过一幅 4分区的磁盘结构图可以看到磁盘的大致组织形式。如图 5
关于扩展分区,如图 6所示,扩展分区中逻辑驱动器的扩展引导记录是一个
连接表。该图显示了一个扩展分区上的三个逻辑驱动器,说明了前面的逻辑驱动
器和最后一个逻辑驱动器之间在扩展分区表中的差异。
除了扩展分区上最后一个逻辑驱动器外,表 2中所描述的扩展分区表的格式
在每个逻辑驱动器中都是重复的:第一个项标识了逻辑驱动器本身的引导扇区,
第二个项标识了下一个逻辑驱动器的 EBR。最后一个逻辑驱动器的扩展分区表
只会列出它本身的分区项。最后一个扩展分区表的第二个项到第四个项被使用。
扩展分区表项中的相对扇区数字段所显示的是从扩展分区开始到逻辑驱动器
中第一个扇区的位移的字节数。总扇区数字段中的数是指组成该逻辑驱动器的扇
区数目。总扇区数字段的值等于从扩展分区表项所定义的引导扇区到逻辑驱动器
末尾的扇区数。
有时候在磁盘的末尾会有剩余空间,剩余空间是什么呢?我们前面说到,分
区是以 1柱面的容量为分区粒度的,那么如果磁盘总空间不是整数个柱面的话,
不够一个柱面的剩下的空间就是剩余空间了,这部分空间并不参与分区,所以一
般无法利用。照道理说,磁盘的物理模式决定了磁盘的总容量就应该是整数个柱
面的容量,为什么会有不够一个柱面的空间呢。在我的理解看来,本来现在的磁
盘为了更大的利用空间,一般在物理上并不是按照外围的扇区大于里圈的扇区这
种管理方式,只是为了与操作系统兼容而抽象出来 CHS。可能其实际空间容量
不一定正好为整数个柱面的容量。