总有人间一两风,填我十万八千梦

MBR格式磁盘分区表分析<一>主分区(含源代码)

Windows C/C++ Zero、J 6388℃ 0评论

分区表是硬盘中很重要的一个表,它描述了硬盘各个分区的大小和起始位置等信息,倘若磁盘分区表损坏将会导致硬盘分区丢失,数据将无法读取和写入.本文这里涉及的是MBR格式的分区表,GPT格式的请自行百度。在阅读本文之前你需要了解硬盘的一些基本的信息,比如什么是磁头、柱面和扇区,可以参见这篇文章://www.youranshare.com/push/topics/other/128.html ,同时如果你要想阅读我的源代码的话请务必会使用STD标准库的Vector,OK我们开始吧,文章中有可能存在不足的地方,我也就是抛个砖引个玉,欢迎大家及时纠正指出。

文中使用的分析工具是我之前写的一个工具,百度网盘地址: http://pan.baidu.com/s/1o6r9UKq 密码: bxbp

mbrtools

什么是MBR分区表?

传统的分区方案(称为MBR分区方案)是将分区信息保存到磁盘的第一个扇区(0柱面,0磁头,1扇区,偏移位置为0x1BE)中的64个字节中,每个分区项占用0x10个字节,这0x10个字节中存有活动状态标志、文件系统标识、起止柱面号、磁头号、扇区号、隐含扇区数目(4个字节)、分区总扇区数目(4个字节)等内容。由于MBR扇区只有0x40个字节用于分区表,所以只能记录4个分区的信息。这就是硬盘主分区数目(注意是主分区不能超过4个的原因。后来为了支持更多的分区,引入了扩展分区及逻辑分区的概念。但每个分区项仍用16个字节存储。
主分区数目不能超过4个的限制,很多时候,4个主分区并不能满足需要。另外最关键的是MBR分区方案无法支持超过2TB容量的磁盘。因为这一方案用4个字节存储分区的总扇区数,最大能表示2^32次方个扇区,按每扇区512字节计算,每个分区最大不能超过2TB。磁盘容量超过2TB以后,分区的起始位置也就无法表示了。

每一个分区表项占用0x10个字节,其相关的含义如下:

  1. 偏移量0:这个字节表示活动标志,若为0x00h则表示该分区为非活动分区,若为0x08h则表示该分区为活动分区
  2. 偏移量1~3: 这3个字节表示该分区的起始磁头号(1字节)、扇区号(2字节低6位)、柱面号(2字节高2位+3字节)号
  3. 偏移量4:这个字节表示分区文件系统标志,0x05h,0x0Fh 表示扩展分区;0x06h表示FAT16分区;0x0Bh表示FAT32分区;0x07h表示NTFS 分区(当然有其他的标识)
  4. 偏移量5~7:这3个字节表示该分区的结束磁头号、扇区号、柱面号
  5. 偏移量8~11:这4个字节表示逻辑起始扇区号
  6. 偏移量12~15:这4个字节表示分区占用的扇区数目

在上面的含义中分别有3个字节表示起始和结束的柱面、磁头和扇区号,这种寻址方式是CHS寻址,最大只能支持8GB,8GB现在来说已经很小了,所以提出了LBA(Logical Block Address)的寻址方式,LBA就是为所有的扇区从0开始编号,访问的时候直接给出对应的扇区号就行了,每一个分区表项中8~11表示了起始的LBA,12~15表示了结束的LBA,因为是32位,所以最大就能支持2TB容量的硬盘了,例如下面是我的硬盘上的主分区表的一项:

80 01 01 00 07 FE FF FF  3F 00 00 00 36 C1 C0 08

按照对应的格式进行划分  (80) (01 01 00) (07) (FE FF FF) (3F 00 00 00) (36 C1 C0 08),我们得到的结果就是该分区的激活标识为80表示激活,(01 01 00)起始的柱面、磁头和扇区号,文件系统为07表示NTFS的,(FE FF FF)表示结束的柱面、磁头和扇区(分区已经超过8G了,这个数据就无效了),(3F 00 00 00)表示分区的起始扇区LBA为0x0000003F(注意是小端),(36 C1 C0 08)表示当前分区大小为0x08C0C136

主分区表项较为简单,我先来说一下主分区表定位主分区的过程

我把我的U盘格式化成了4个主分区,其中第一个分区和第二个分区之间有间隙,如图DiskGenius显示的图片

upic因为都是主分区,所以在我们的MBR扇区应该有四个表项,我们用工具看一下我们的四主分区表项目:

ptmain

  1. 表项1,80 20 21 00 07 B2 59 F4 00 08-00 00 DB B4 7A 00 描述了第1个分区激活,起始LBA为0x00000800,大小为0x007AB4DB
  2. 表项2,00 6B A2 0A 07 FE FF FF 00 10-80 00 00 08 80 00描述了第2个分区不是激活,起始LBA为0x00801000,大小为0x00800800
  3. 表项3,00 FE FF FF 07 FE FF FF 00 18-00 01 00 08 80 00 描述了第3个分区不是激活,起始LBA为0x01001800,大小为0x00800800
  4. 表项4,00 FE FF FF 07 FE FF FF 00 20-80 01 00 80 54 00描述了第4个分区不是激活,起始LBA为0x01802000,大小为

根据上面的分析我们可以绘制出当前分区边界的图:

mainptdemo

图中只有一个管理结点,这是因为这些都是主分区,由主分区表进行管理,所以四个主分区都在主管理结点内部;图中我们还看到了一个分区间隙,这个间隙是怎么来的呢?我们来计算一下,分区表告诉我们分区一占用的位置为:0x00000800~(0x00000800+0x007AB4DB)=0x007ABCDB,分区二占用的位置为0x00801000~(0x00801000+0x00800800)=0x01001800,从数据中可以看到分区一的结束位置不是分区二的开始位置,那么就很明显了,这个两个分区没有连续,这就是导致间隙的原因。如果分区全部是主分区,那么我们的分区管理可以用下面的图描述:

demoallmainpt

如果全为主分区,那么就只能创建4个分区,这很难满足我们的要求,扩展分区便应运而生,今天就先写到这里,明天我们继续来探索扩展分区的结构(MBR分析的源代码在后面的文章中附上.)

转载请注明:悠然品鉴 » MBR格式磁盘分区表分析<一>主分区(含源代码)

喜欢 (11)or分享 (0)
发表我的评论
取消评论

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址