硬盘的数据结构对于一些朋友来说总是很神密!为什么我们删除了的文件用软件能找到?为什么我们格式化了的硬盘数据还能找回来?要回答这一切,你就得对硬盘的数据结构有个清醒的认识。
硬盘上的数据由五大部分组成,它们分别是: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 1B7C
00000010 BF1B 0650 57B9 E501 F3A4 CBBE BE07 B104
00000020 382C 7C09 7515 83C6 10E2 F5CD 188B 148B
00000030 EE83 C610 4974 1638 2C74 F6BE 1007 0302
00000040 8000 0080 68B6 7600 0008 FAEA 507C 0000
00000050 31C0 8ED8 8ED0 BC00 20FB A040 7C3C FF74
00000060 0288 C252 BE81 7DE8 3F01 F6C2 8074 5FB4
00000070 41BB AA55 CD13 7256 81FB 55AA 7550 A041
00000080 7C84 C075 0583 E101 7444 B448 BE00 7FC7
00000090 0442 00CD 1372 3766 8B4C 10BE 057C C644
000000A0 FF01 668B 1E44 7CC7 0410 00C7 4402 0100
000000B0 6689 5C08 C744 0600 7066 31C0 8944 0466
000000C0 8944 0CB4 42CD 1372 05BB 0070 EB7D B408
000000D0 CD13 730A F6C2 800F 84E8 00E9 8D00 BE05
000000E0 7CC6 44FF 0066 31C0 88F0 4066 8944 0431
000000F0 D288 CAC1 E202 88E8 88F4 4089 4408 31C0
00000100 88D0 C0E8 0266 8904 66A1 447C 6631 D266
00000110 F734 8854 0A66 31D2 66F7 7404 8854 0B89
00000120 440C 3B44 087D 3C8A 540D C0E2 068A 4C0A
00000130 FEC1 08D1 8A6C 0C5A 8A74 0BBB 0070 8EC3
00000140 31DB B801 02CD 1372 2A8C C38E 0648 7C60
00000150 1EB9 0001 8EDB 31F6 31FF FCF3 A51F 61FF
00000160 2642 7CBE 877D E840 00EB 0EBE 8C7D E838
00000170 00EB 06BE 967D E830 00BE 9B7D E82A 00EB
00000180 FE47 5255 4220 0047 656F 6D00 4861 7264
00000190 2044 6973 6B00 5265 6164 0020 4572 726F
000001A0 7200 BB01 00B4 0ECD 10AC 3C00 75F4 C300
000001B0 0000 0000 0000 0000 4CA6 4CA6 0000 8001
000001C0 0100 0BFE 3FD8 3F00 0000 5A31 3500 0000
000001D0 01D9 0FFE FFFF 9931 3500 04FF FB00 0000
000001E0 0000 0000 0000 0000 0000 0000 0000 0000
000001F0 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的程序,是不是很想试试。 |