文件被误删了,或者被格式化了,数据恢复软件还能把数据读回来,这就要了解一下硬盘的数据结构了。
硬盘上的数据由五大部分组成,它们分别是: MBR 区、 DBR 区, FAT 区, DIR 区和
DATA 区。
1.MBR ( Main Boot Record )区 , 即主引导记录区,位于整个硬盘的 0 磁道 0
柱面 1 扇区 .
2.DBR ( Dos Boot Record )区 , 操作系统引导记录区。位于硬盘的 0 磁道 1
柱面 1 扇区,是操作系统可以直接访问的第一个扇区 .
3.FAT ( File Allocation Table 文件分配表)区 ;
4.DIR ( Directory )根目录区,记录着根目录下每个文件(目录)的起始单元,文件的属性等
;
5.DATA 区是真正意义上的数据存储的地方,位于 DIR 区之后,占据硬盘上的大部分数据空间。
了解了硬盘数据的基本结构,我们把重点放在 mbr 所在的扇区:主引导扇区。
主引导扇区包括: mbr,dpt 和结束标志。位于硬盘的 0 磁道 0 柱面 1 扇区,用
diskman 可以读出其中的内容,下面是一次操作的结果:
表一 :
0 1 2 3 4 5 6 7 8 9 A B C D E F
00000000 EB48 90D0 BC00 7CFB 5007 501F FCBE 1B 7C
00000010 BF1B 0650 57B9 E 501 F 3A 4 CBBE BE07 B104
00000020 382C 7C 09 7515 83C 6 10E 2 F 5CD 188B 148B
00000030 EE 83 C 610 4974 1638 2C 74 F 6BE 1007 0302
00000040 8000 0080 68B6 7600 0008 FAEA 507C 0000
00000050 31C 0 8ED8 8ED0 BC00 20FB A040 7C 3C FF74
00000060 0288 C 252 BE81 7DE8 3F 01 F 6C 2 8074 5FB4
00000070 41BB AA55 CD13 7256 81FB 55AA 7550 A 041
00000080 7C 84 C 075 0583 E101 7444 B448 BE00 7FC7
00000090 0442 00CD 1372 3766 8B 4C 10BE 057C C644
000000A 0 FF01 668B 1E44 7CC7 0410 00C 7 4402 0100
000000B0 6689 5C 08 C 744 0600 7066 31C 0 8944 0466
000000C 0 8944 0CB4 42CD 1372 05BB 0070 EB7D B408
000000D0 CD13 730A F 6C 2 800F 84E8 00E9 8D00 BE05
000000E0 7CC6 44FF 0066 31C 0 88F 0 4066 8944 0431
000000F 0 D288 CAC1 E202 88E8 88F 4 4089 4408 31C 0
00000100 88D 0 C 0E8 0266 8904 66A 1 447C 6631 D266
00000110 F 734 8854 0A 66 31D2 66F 7 7404 8854 0B89
00000120 440C 3B44 087D 3C 8A 540D C0E2 068A 4C 0A
00000130 FEC1 08D1 8A 6C 0C 5A 8A 74 0BBB 0070 8EC3
00000140 31DB B801 02CD 1372 2A 8C C38E 0648 7C 60
00000150 1EB9 0001 8EDB 31F 6 31FF FCF 3 A 51F 61FF
00000160 2642 7CBE 877D E840 00EB 0EBE 8C 7D E838
00000170 00EB 06BE 967D E830 00BE 9B7D E 82A 00EB
00000180 FE47 5255 4220 0047 656F 6D00 4861 7264
00000190 2044 6973 6B00 5265 6164 0020 4572 726F
000001A 0 7200 BB01 00B4 0ECD 10AC 3C 00 75F 4 C 300
000001B0 0000 0000 0000 0000 4CA6 4CA6 0000 8001
000001C 0 0100 0BFE 3FD8 3F 00 0000 5A 31 3500 0000
000001D0 01D9 0FFE FFFF 9931 3500 04FF FB00 0000
000001E0 0000 0000 0000 0000 0000 0000 0000 0000
000001F 0 0000 0000 0000 0000 0000 0000 0000 55AA
这块 10.2G (以下显示为 9766MB
,误差原因不用我解释了吧?)的硬盘共分了四个区:分区结构如下:
主引导扇区中前 446 字节 -- 偏移地址从 0000H-01BDH 为 mbr
区,存放着主引导程序,从上面的显示中,读者可能已经看出,这个硬盘以 linux 系统的 grub 为引导程序。
接下来的 64 字节为硬盘分区表 --dpt ,偏移地址从 01BEH-01FDH,
共分为四个分区表项,每个分区表项占 16
字节,表示一个分区,从这里大家就可以知道为什么硬盘只能分四个主分区了吧?但有时我们需要更多的分区来规划我们的硬盘,为解决这个问题,就把这四个分区表项中的一个定义为扩展分区(与主分区是并列关系),扩展分区中又可以定义逻辑分区(与扩展分区是包含与被包含的关系)。但读者不要以为这些信息都在这一个
16 字节的分区表项中。事实上是 :
被定义为扩展分区的这一个分区表项只包含了指向逻辑分区的信息。而逻辑分区的分区表在其它的扇区中存放!
本文重点介绍 dpt 中的内容,上面已经提到, dpt 分为四个分区表项,每个分区表项占 16
个字节,下面着重讲述这 16 个字节是怎么分配的。
表三:
第 1 字节 引导标志,该值为 80H 表示为可自举分区 ( 活动分区,仅有一个 ) ,该值为 00H
表示其余分区
第 2 字节 分区起始磁头
第 3 字节 低 6 位是分区起始扇区,高 2 位是分区起始的柱面的头两位
第 4 字节 分区起始柱面的低 8 位
第 5 字节 系统标志
第 6 字节 分区终止磁头
第 7 字节 低 6 位为分区终止扇区,高 2 位为终止柱面的前 2 位
第 8 字节 分区终止柱面的低 8 位。
第 9-12 字节 本分区前的扇区数,低位字节在前 ( 注:不是低位在前 )
第 13-16 字节 本分区总的扇区数,低位字节在前
现在根据上面的列表详细解释一下:我们提取出下面四个分区表项:
表四:
分区 | 字节序号
表项 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
1 : | 80 01 01 00 0B FE 3F D8 3F 00 00 00 5A 31 35
00
2 : | 00 00 01 D9 0F FE FF FF 99 31 35 00 04 FF FB
00
3 : | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00
4 : | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00
由于数据以 16 进制显示,每个数字占一个字节的四位,所以两个数字占一个字节。
对于第一个分区表项:
第 1 字节为 80 ,表示活动分区;
第 2 字节为 01 ,十进制为 1 ,表示起始磁头号;
第 3 字节为 01 ,二进制为 00000001, 低 6 位 000001, 对应的十进制为 1,
表示起始扇区;
第 4 字节为 00 ,二进制为 00000000, 与第三字节的高 2 位 00 组成
0000000000, 十进制为 0 ,表示起始柱面;
第 5 字节为 0B ,为系统标志;
第 6 字节为 FE ,十进制为 254 ,表示终止磁头;
第 7 字节为 3F ,二进制为 00111111, 低 6 位为 111111 ,转换为十进制为
63, 表示终止扇区;
第 8 字节为 D8 ,二进制为 11011000, 与第 7 字节的高 2 位 00 组成
0011011000, 十进制为 216, 表示终止柱面;
第 9-12 字节为 3F 00 00 00 ,按低位字节在前的原则排列为: 00 00 00 3F
,转换为十进制为 63, 表示该分区前的扇区数目;
第 13-16 字节为 5A 31 35 00 ,按低位字节在前的原则排列为: 00 35 31 5A
, 转换为十进制为 3486042, 表示该分区占用的扇区数目。
我们可以与表 2 对照,发现两者完全统一!同理,我们还可以分析第 2
个分区表项,这就交给感兴趣的读者自己完成吧。
在第 3 和第 4 个分区表项中,所以数据都为 0 ,表示这两个分区表项没有分配。
最后两个字节 -- 偏移地址从 01FEH-01FFH ,为结束标志,通常为 55 AA,
如果改为其它值,则硬盘可能不被引导。
通过以上的讲解,你是不是对硬盘的数据结构又有了更深的认识?对于使用 windows 和 linux
双系统的用户,经常要与 mbr 打交道,有很多网友问 : 装了 linux 和 windows 双系统,现在又不想使用 linux
了,于是把 linux 的分区格式化为 fat32 回收,但当初装在 mbr 的引导信息老是去不掉。这里我可以告诉你一个方法,就是用
windows98 启动盘启动电脑,然后运行 fdisk/mbr 命令就可以了,这条命令是重建 mbr (前 446
字节),但并不破坏 dpt
中的数据,也就是并不破坏硬盘的分区表,可以安全使用。你可以在使用这条命令前后各查看一下主引导扇区,就会发现从 447
字节开始以后的数据都没有改变。如果你没有 diskman 这个软件,下面的 C 程序一样可以帮你搞掂!
以下是程序的源码:
#include
#include
int main()
{
register int i;
unsigned char buffer[512] = {0};
biosdisk(2, 0x80, 0, 0, 1, 1, buffer);
for (i=0; i<512; i++)
{
if (!(i%8))
{
printf(" ");
if (!(i%16))
{
printf("\n");
printf("%04x:", i);
}
}
printf("%02x ", buffer);
}
}
在 turboc2.0 中可编译通过。运行 biosdisk() 函数,你还可进一步编写备份 mbr,
恢复 mbr 的程序或把 mbr 清 0 的程序。
【本站声明】本站刊载的部分内容全部来源互联网,对于此类文章本站仅提供交流平台,不为其版权负责。如涉及侵犯您的知识产权的文章,请联系我们,我们将尽快做出更正。并向您表示感谢!同时特别感谢对本站所有支持的网友。