详解磁盘分区表

人们在使用电脑时,有时由于异常操作,有时由于病毒侵袭,会导致某个分区消失或硬盘无法启动。究其原因,就是硬盘分区表受损。硬盘分区表可以说是支持硬盘正常工作的骨架.操作系统正是通过它把硬盘划分为若干个分区,然后再在每个分区里面创建文件系统,写入数据文件.本文主要讲述的是分区表的位置,结构以及各个分区表是如何链接起来的.当掌握了这些知识后,即使分区表受到破坏,一样也可以根据残存的数据手工修复分区表,从而修复分区。

.分区表的位置及识别标志
    
分区表一般位于硬盘某柱面的0磁头 1扇区.而第1个分区表(也即主分区表)总是位于 
(0
柱面,1磁头,1扇区),剩余的分区表位置可以由主分区表依次推导出来.分区表有64个字节,占据其所在扇区的[441-509]字节.要判定是不是分区表,就看其后紧邻的两个字节(也即[510-511])是不是 "55AA",若是,则为分区表.

.分区表的结构
分区表由4项组成,每项16个字节.4×16 = 64个字节.每项描述一个分区的基本信息.每个字节的含义如下:
分区表项含义  

字节 含义
0 Activeflag.活动标志.若为0x80H,则表示该分区为活动分区.若为0x00H,则表示该分区为非活动分区.
1,2,3 该分区的起始磁头号,扇区号,柱面号磁头号 — 1字节扇区号 — 2字节低6,柱面号— 2字节高2 + 3字节
4 分区文件系统标志:
分区未用: 0x00H. 
扩展分区: 0x05H, 0x0FH.
FAT16
分区: 0x06H.
FAT32
分区: 0x0BH, 0x1BH, 0x0CH, 0x1CH.
NTFS
分区: 0x07H.
5,6,7 该分区的结束磁头号,扇区号,柱面号,含义同上.
8,9,10,11 逻辑起始扇区号。表示分区起点之前已用了的扇区数.
12,13,14,15 该分区所占用的扇区数.

  分区表项有几个字节比较重要,下面分别阐述之: 1、(1,2,3)字节     磁头号由(1)字节8位表示,其范围为(0 —2^8 – 1),也即(0 磁头– 254磁头)。   扇区号由(2)字节低6位表示,其范围为(0 — 2^6 – 1),由于扇区号从1开始,所以其范围是(1扇区– 63扇区)。   柱面号由(2)字节高2位 + (3)字节,共10位表示,其范围为(0 –2 ^10 – 1),也即(0 柱面– 1023柱面)。 当柱面号超过1023时,这10位依然表示成1023,需要注意。   (5,6,7)字节含义同上。 2、(8, 9, 10, 11)字节      如果是主分区表,则这4 个字节表示该分区起始逻辑扇区号与逻辑0扇区(0柱面,0磁头,1扇区)之差。如果非主分区表,     则这4 个字节要么表示该分区起始逻辑扇区号与扩展分区起始逻辑扇区号之差,要么为63。详细情况在后面有所阐述。    注意: 1、扇区上的字节是按左边低位,右边高位的顺序排列的。所以在取值时,需要把字节再反一下,让高位字节在左边,低位字节在右边, 这一点在读取逻辑起始扇区号和分区大小时需要注意。举个例子:第一项的逻辑起始扇区为(3F 00 00 00),转换为十进制前要先反一下字 节顺序,为(00 00 00 3F)然后在转换为十进制,即63 .同理分区大小为(3F 04 7D 00),先反为(00 7D 04 3F)再转换为十进制, 即8193087。   2、逻辑扇区号与(柱面,磁头,扇区)的相互转换: 令L = 逻辑扇区号,C = 柱面号,H = 磁头号,S = 扇区号。 每道扇区数 = 63 每柱面磁头数 = 255 每柱面扇区数 = 每道扇区数* 每柱面磁头数                  = 63 × 255                            = 16065 柱面号下标从0开始。磁头号[0 — 254],扇区号[1 — 63]。 逻辑扇区号下标也从0开始。 (柱面,磁头,扇区)转换成逻辑扇区号的公式为: L = C×16065 + H ×63 + S – 1 ; 比如(1柱面,1磁头,1扇区),其逻辑扇区号为: L = 1×16065 + 1×63 + 1 – 1 = 16128 逻辑扇区号转换成(柱面,磁头,扇区) 公式为: C = L / 16065 H = (L % 16065) / 63 S = (L % 16065) % 63 + 1 比如逻辑扇区号 16127: C = 16127 / 16065 = 1 H = (16127 % 16065) / 63 = 0 S = (16127 % 16065) % 63 + 1 = 63 即(1柱面,0磁头,63扇区)   3、分区表上有四项,每一项表示一个分区,所以一个分区表最多只能表示4个分区。主分 区表上的4项用来表示主分区和扩展分区的信息。因为扩展分区最多只能有一个,所以硬盘 最多可以有四个主分区或者三个主分区,一个扩展分区。余下的分区表是表示逻辑分区的。 这里有必要阐述一点:逻辑区都是位于扩展分区里面的,并且逻辑分区的个数没有限制。   4、分区表所在扇区通常在(0磁头,1扇区),而该分区的开始扇区通常位于(1磁头,1扇区),中间隔了63 个隐藏扇区。  

.分区表链的查找
 
 分区表链实际上相当于一个单向链表结构。第一个分区表,也即主分区表,可以有一项描述扩展分区。而这一项就相当于指针,指向扩展分区。然后我们根据该指针来到扩展分区起始柱面的01扇区,找到第二个分区表。对于该分区表,通常情况下:第一项描述了扩展分区中第一个分区的信息,第二项描述下一个分区,而这第二项就相当于指向第二个分区的指针,第三项,第四项一般均为0。我们可以根据该指针来到扩展分区中第二个分区起始柱面的01扇区,找到第三个分区表。以此类推,只到最后一个分区表。而最后一个分区表只有第一项有信息,余下三项均为0.相当于其指针为空.所以只要找到了一个分区表就可以推导找出其后面所有分区表。不过该分区表前面的分区表就不好推导出来了。但令人高兴的是这个链表的头节点,也即主分区表的位置是固定的位于(0柱面, 0磁头, 1扇区)处,我们可以很轻易的找到它,然后把剩下的所有分区表一一找到。 
以笔者的硬盘为例:一个主分区(C盘)一个扩展分区.扩展分区中有两个逻辑分区(D,E盘)其分区表链示意图如下:

硬盘分区表结构

 

图一分区表链示意图 

().读取(0柱面,0磁头,1扇区)处C盘的主分区表:  [80 01 01 00 0B FE 7F FD 3F 00 00 00 3F 04 7D 00 ]                                                [00 00 41 FE 0F FE FF FF 7E 04 7D 00 1F 2C B4 00 ]   [00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ]     [00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ] 第一项: (80)(01 01 00)(0B)(FE 7F FD )(3F 00 00 00 )(3F 04 7D 00) 描述的是C盘的情况。 1.(80):表示C盘为活动分区。即系统会从C盘启动。 2.(01 01 00):表示C盘的起始扇区为(0柱面,1磁头,1扇区)。 3.(0B):表示C盘的文件系统为FAT32。 4.(FE 7F FD): (FE) 16 = (254) 10 (7F) 16 = (0111 1111) 2 (FD) 16 = (1111 1101) 2 磁头号:(254) 10; 扇区号:(11 1111) 2 = (63) 10. 柱面号:(01 1111 1101) 2 = (509) 10 故C盘结束扇区为(509柱面,254磁头,63扇区)。 5.(3F 00 00 00): 反向,(00 00 00 3F) 16 = (63) 10,为C盘起始逻辑扇区号与逻辑0扇区号之差。表示C盘前面已有63个扇区,这63个扇区为系统隐藏扇区。 6. (3F 04 7D 00) 反向,(00 7D 04 3F) 16 = (8193087) 10。表明C盘有8193087个扇区。即(0柱面,1磁头,1扇区)至(509柱面,254磁头,63扇区) 共有8193087个扇区。 第二项: (00)(00 41 FE)(0F)(FE FF FF)(7E 04 7D 00)(1F 2C B4 00) 描述的是扩展分区的情况。 1. (00): 表示该分区不是活动分区。 2. (00 41 FE): (00) 16 = (0) 10  (41) 16 = (0100 0001) 2 (FE) 16 = (1111 1110) 2 磁头号:(0) 10; 扇区号:(00 0001) 2 = (1) 10. 柱面号:(01 1111 1110) 2 = (510) 10 所以扩展分区的起始扇区为(510柱面,0磁头,1扇区)。 3. (0F): 表示该分区为扩展分区。 4. (FE FF FF): (FE) 16 = (254) 10 (FF) 16 = (1111 1111) 2 (FF) 16 = (1111 1111) 2; 磁头号:(254) 10; 扇区号:(11 1111) 2 = (63) 10. 柱面号:(11 1111 1111) 2 = (1023) 10 但这是不准确的,因为当柱面号的真实值超过1023时,表示柱面号的10位也依然是1023。 5. (7E 04 7D 00): 反向,(00 7D 04 7E) 16 = (8193150) 10. 表示扩展分区的起始扇区号为8193150,即(510 柱面,0磁头,1扇区)。这是真实准确的, 我一般都用这一项来定位分区起点。 6. (1F 2C B4 00): 反向, (00 B4 2C 1F) 16 = (11807775) 10. 表示扩展分区共有11807775个扇区。通过上面得到的起点和分区的大小, 可以推导出扩展分区的结束位置:8193150 + 11807775 = 20000925号扇区,即(1244 柱面,254磁头,63扇区)。 二.查找D盘分区表 根据上面的信息,第二个分区表,也即D盘分区表在(510柱面,0磁头,1扇区)处。读取该扇区,得到分区表如下: [00 01 41 FE 0B FE FF 7B 3F 00 00 00 BF A3 5D 00 ]                                      [00 00 C1 7C 05 FE FF FF FE A3 5D 00 21 88 56 00 ]  [00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ]  [00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ] 第一项: (00)(01 41 FE)(0B)(FE FF 7B)(3F 00 00 00 )(BF A3 5D 00)  描述的是D盘的情况。 1.(00):表示D盘不是活动分区。 2.(01 41 FE):  (01) 16 = (1) 10 (41) 16 = (0100 0001) 2 (FE) 16 = (1111 1110) 2. 磁头号:(1) 10; 扇区号:(00 0001) 2 = (1) 10. 柱面号:(01 1111 1110) 2 = (510) 10; 故D盘开始扇区为(510柱面,1磁头,1扇区)。 3.(0B):表示D盘的文件系统为FAT32。 4.(FE FF 7B): (FE) 16 = (254) 10 。 (FF) 16 = (1111 1111) 2 (7B) 16 = (0111 1011) 2. 磁头号:(254) 10; 扇区号:(11 1111) 2 = (63) 10. 柱面号:(11 0111 1011) 2 = (891) 10 故D盘结束扇区为(891柱面,254磁头,63扇区)。 5.(3F 00 00 00): 反向,(00 00 00 3F)16 = (63)10,为D盘起始逻辑扇区号(510柱面,1磁头,1扇区)与扩展分区起始逻辑扇区号 (510柱面,0磁头,1扇区)之差。表示D盘前面已有63个扇区,这63个扇区为系统隐藏扇区。 6. (BF A3 5D 00) 反向,(00 5D A3 BF) 16 = (6136767) 10。表明D盘有6136767个扇区。 通过上面得到的起点和分区的大小,可以推导出D盘的结束位置:8193150 + 63 + 6136767 = 14329980号扇区。 即(891柱面,254磁头,63扇区)。与上面的正好吻合。 第二项: (00)(00 C1 7C)(05)(FE FF FF)(FE A3 5D 00)(21 88 56 00) 描述的是E盘的情况。 1. (00): 表示E盘不是活动分区。 2. (00 C1 7C) (00) 16 = (0) 10 (C1) 16 = (1100 0001) 2 (7C) 16 = (0111 1100) 2 磁头号:(0) 10 扇区号:(00 0001) 2 = (1) 10 柱面号:(11 0111 1100) 2 = (892) 10 所以E盘的起始扇区为(892柱面,0磁头,1扇区)。 3. (05): 表示E盘的在扩展分区里面。 4.(FE FF FF): (FE) 16 = (254) 10 (FF) 16 = (1111 1111) 2 (FF) 16 = (1111 1111) 2 磁头号:(254) 10 扇区号:(11 1111) 2 = (63) 10 柱面号:(11 1111 1111) 2 = (1023) 10 但这是不准确的,原因同上。 5.(FE A3 5D 00):  反向,(00 5D A3 FE) 16 = (6136830) 10. 这一项非常重要,它定位了E盘分区表所在扇区。其值为E盘分区表所在扇区号  与扩展分区起始扇区号之差。所以,E盘分区表所在扇区号为: 8193150 + 6136830 = 14329980。即(892柱面,0磁头,1扇区)。 6.(21 88 56 00): 反向,(00 56 88 21) 16 = (5670945) 10.表示E盘共有11807775个扇区。通过上面得到的起点和分区的大小,可以推导出E 盘的结束位置:14329980 + 5670945 = 20000925号扇区,即(1244 柱面,254磁头,63扇区)。 三.查找E盘分区表根据上面的信息,第三个分区表,也即E盘分区表在(892柱面,0磁头,1扇区)处。读取该扇区,得到分区表如下: [00 01 C1 7C 0B FE FF FF 3F 00 00 00 E2 87 56 00] [ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ] [00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ] [00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ] 该分区表第二项全为0,说明没有下一个分区表了。该分区表就是分区表链的最后一个节点。 第一项: (00)(01 C1 7C)(0B)(FE FF FF)(3F 00 00 00 )(E2 87 56 00) 该项与D盘分区表的第二项描述的都是E盘的情况,但它们在某些细节上又有所区别。 1.(00):表示E盘不是活动分区。 2.(01 C1 7C):  (01) 16 = (1) 10 (C1) 16 = (1100 0001) 2 (7C) 16 = (0111 1100) 2. 磁头号:(1) 10 扇区号:(00 0001) 2 = (1) 10 柱面号:(11 0111 1100) 2 = (892) 10 故E盘起始扇区为(892柱面,1磁头,1扇区)。 3.(0B):表示E盘的文件系统为FAT32。 4.(FE FF FF): (FE) 16 = (254) 10 。 (FF) 16 = (1111 1111) 2 (FF) 16 = (1111 1111) 2. 磁头号:(254) 10; 扇区号:(11 1111) 2 = (63) 10. 柱面号:(11 1111 1111) 2 = (1023) 10 但这是不准确的,原因同上。 5.(3F 00 00 00): 反向,(00 00 00 3F) 16 = (63) 10.这一项与D盘分区表相应项有所不同.为E盘起始逻辑 扇区号(892柱面,1磁头,1扇区)与(892柱面,0磁头,1扇区)之差。表示E盘前面已有63个扇区, 这63个扇区为系统隐藏扇区。 操作系统无法对这些扇区进行读写,所以可以把自己的秘密信息写在这里. 6. (E2 87 56 00): 反向,(00 56 87 E2) 16 = (5670882) 10。表明E盘有5670882个扇区。而D盘分区表相应项为5670945. 5670945 – 5670882 = 63. 正好等于63个隐藏扇区.这是因为D盘分区表描述的是(892柱面,0磁头,1扇区) 到 (1244 柱面,254磁头,63扇区) 之间的扇区数。 而E盘分区表描述的是(892柱面, 1磁头,1扇区) 到 (1244 柱面,254磁头,63扇区) 之间的扇区数。 第二部分 修复硬盘分区表软件   1 《易我分区表医生》是一款修复硬盘分区的软件,当你的驱动器发生错误(不是硬件错误)时这个工具能自动的检查并且修复你的MBR、分区表和分区的引导扇区错误,能恢复IDE/ATA/SATA/SCSI接口的硬盘上 的FAT16/FAT32/NTFS/NTFS5/EXT2/EXT3/SWAP 等文件系统。 2  Disk Genius(DiskMan) v3.0 Beta 2是国产全中文硬盘分区表维护软件,软件主要功能及特点: 1、仿WINDOWS纯中文图形界面,支持鼠标操作; 2、提供比fdisk更灵活的分区操作,支持分区参数编辑; 3、提供强大的分区表重建功能,迅速修复损坏了的分区表; 4、支持FAT/FAT32分区的快速格式化; 5、在不破坏数据的情况下直接调整FAT/FAT32分区的大小; 6、自动重建被破坏的硬盘主引导记录; 7、为防止误操作,对于简单的分区动作,在存盘之前仅更改内存缓冲区,不影响硬盘分区表; 8、能查看硬盘任意扇区,并可保存到文件。 9、可隐藏FAT/FAT32及NTFS分区。 10、可备份包括逻辑分区表及各分区引导记录在内的所有硬盘分区信息。 11、提供扫描硬盘坏区功能,报告损坏的柱面。 12、具备扇区拷贝功能。 13、可以彻底清除分区数据。 以上两款硬盘数据恢复软件下载地址 http://www.fix.com.cn/softdown/index.htm 第三部分 用软件修复硬盘分区表   Disk Genius备份恢复分区表   Disk Genius不仅提供了诸如建立、激活、删除、隐藏分区之类的基本硬盘分区管理功能,还具有分区表备份和恢复、分区参数修改、硬盘主引导记录修复、重建分区表等强大的分区维护功能。此外,它还具有分区格式化、分区无损调整、硬盘表面扫描、扇区拷贝、彻底清除扇区数据等实用功能。   提示:如果只是想利用Disk Genius查看、备份硬盘分区信息,可以直接在Windows下运行它,但如果涉及更改分区参数的写盘操作,则必须在纯DOS环境下运行,而且在使用前应将CMOS中的“Anti Virus”选项设为“Disable”   运行Disk Genius后,程序将自动读取硬盘的分区信息,并在屏幕上以图表的形式显示硬盘分区情况。如图所示,这是Disk Genius检测笔者硬盘得到的分区信息结构图。其中左侧的柱状图显示硬盘上各分区的位置及大小,屏幕右侧用表格的形式显示了各分区的类型及其具体参数,包括分区的引导标志、系统标志、分区起始和终止柱面号、扇区号、磁头号。在柱状图与参数表格之间,有一个动态连线指示了它们之间的对应关系。可以通过鼠标在柱状图或表格中点击来选择一个分区,也可以用键盘上的光标移动键来选择当前分区。   需要备份分区表的时候,按下“F9”按键或者运行工具备份分区表命令,并且在弹出的对话框中输入文件名即可备份当前分区表。按下“F10”按键或者运行工具恢复分区表命令,然后输入文件名,软件将读入指定的分区表备份文件并更新屏幕显示,确认无误后即可将备份的分区表恢复到硬盘。 学用DiskMan恢复硬盘分区表   以及是否为活动分区等重要信息。一旦分区表被破坏,系统因为无法识别分区,会把硬盘作为一个未分区的裸盘处理,因此造成一些软破坏,也不用着急,因为现在有一款非常不错的分区表修复维护工具可以帮我们找回昔日正常的硬盘,这就是DiskMan   DiskMan是一款小巧的硬盘分区表维护工具,大小只有108KB,可是功能却非常强大。它可以手工修改硬盘有中包括逻辑分区在内的所有数据,能重建被三十的表,可以按使用者的意愿分区,从而使一个硬盘中多个操作系统共存。它的独特之处在于,采用全中文图形界面,无须任何汉字系统支持,以非常直观的图表提示了分区表的详细结构。   DiskMan后出现的程序界面边柱形表示古物,有几截就表明有几个分区,其不同的颜色表示不同的分区类型,带网格属扩展(逻辑)分区,不带网格属主分区(或自由空间)。右边的图表是硬盘及各分区的参数信息,可用十进制和十六进制显示。分区和分区参数的对应关系用箭头联系起来,一目了然。   启动该软件后,它会自动检查硬盘分区参数,发现不合理参数时逐一给出提示。你可以手工修改错误的参数,方法是:用光标上、下方向键选择(或鼠标点击)要修改的分区,按F11键进入修改状态。在弹出的修改分区参数窗口中,将光标移动到要修改的参数项,键入设定的值后,选确定退出即可。对修改过的分区,其序号旁边被标记上蓝色的字母m。如果分区的大小或位置改动过,该分区将被视为新建立的分区,其序号旁的标志变为红色的字母n,存盘后,该分区的原引导记录将不再起作用或被覆盖。   提示:不要随便更改分区大小,特别是修改分区起始柱面、起始扇区、起始磁头参数,这会造成逻辑盘数据的丢失,因为DiskMan不能无损调整分区。   DiskMan中最重要的一项功能就是重建分区表了。如果你的硬盘分区表被分区调整软件(或病)严重破坏,引起硬盘和系统瘫痪,DiskMan可通过未被破坏的分区引导记录信息重新建立分区表。在菜单的工具栏中选择重建分区DiskMan 即开始搜索并重建分区。DiskMan将首先搜索0柱面0磁头从2扇区开始的隐含扇区,寻找被病毒挪动过的分区表。接下来搜索每个磁头的第一个扇区。搜索过程可以采用自动交互两种方式进行。自动方式保留发现的每一个分区,适用于大多数情况。交互方式对发现的每一个分区都给出提示,由用户选择是否保留。当自动方式重建的分区表不正确时,可以采用交互方式重新搜索,如果重新找回分区,上面的数据都能保留。   利用DiskMan手工修改分区参数,需要熟悉分区各参数的意义;而用其重建分区功能,也不能保证百分之百正确恢复。所以保护分区表最保险的方法还是备份分区表信息。启动DiskMan后按F9,输入文件名,插入软盘后选择确定即可。如要还原,只需按F10键,按提示操作,即可将硬盘分区信息完全恢复。   提示:DiskMan作为必备工具软件,放到系统紧急启动盘上,并利用它将分区表信息也备份到启动盘上,有务无患。 此外,DiskMan还能建立分区、激活分区、删除分区、隐藏分区、查看任意扇区数据。它的所有功能都可以通过快捷键和鼠标点击菜单的方式来完成,操作非常方便;并且,所有操作在未存盘前,都在内存中进行,不必担心误操作造成严重后果。 用易我分区表医生修复硬盘分区表的方法详解文章  http://www.fix.com.cn/data-recovery/post/16.htm
首先是分区表项起始和终止扇区的表示上,其实有两种方法。第一种是平时常见的用扇区所在的cylinder,side,sector号表示。很快就会发现有这样一个问题,cylinder号所占的记录空间只有10位,也就是说cylinder号最大为2的10次方-1,2^10-1,即为1023。但是对于现在硬盘而言,早就超过了1024柱面的这个限制。因此这种表示方法很有局限性。第二种方法,其实就是分区表项后半部分的起始扇区的位置和分区所占的扇区数。这两种记录方法在分区表项中同时出现,但是现在应该是对后一种记录方法优先解释,也就是无论cylinder,side,sector写成什么样子,关键是后面的起始扇区的位置和分区所占的扇区数在决定分区的大小和位置。

然后是分区表项中起始扇区位置的定义。对于primary分区而言,这个起始扇区位置就是扇区的绝对位置。而对于logic分区而言,这个起始扇区位置是logic分区相对于它所在的extend分区的偏移位置,一般是63个sector。而对于extend来说就复杂一些了,第一个extend分区的起始扇区位置就是扇区的绝对位置,但是往后的extend分区表项(为什么会有多个extend分区表?这个下面有解释)的起始扇区位置是该extend分区相对于第一个extend分区的起始扇区的偏移位置,而不是绝对位置也不是相对于前一个logic起始或结尾的偏移位置。

该讲讲extend分区表的结构。extend分区表包含两项,一项是在该extend分区里面的logic分区的位置和所占空间,另一项是下一个extend分区的位置和所占空间。也就说我们平时看到的大的extend分区其实是很多小extend分区串起来的,而且每个小extend分区里面有一个logic分区。换句话说,有几个logic分区就有几个extend分区,只是一般而言他们是串起来的。

最后讲一下分区表的位置和55AA标记。分区表都是在side的第一个sector里面,不会写到其他位置,所有的都是。55AA这个标记不只在分区表结尾有,在分区的第一个sector的最后也有。 

Published by

风君子

独自遨游何稽首 揭天掀地慰生平