基础知识 1. 硬盘结构 硬盘的内部是由圆形金属片堆叠起来的,每个盘片的两面都有一个磁头(Head)负责读写这个磁面(Side),在每个磁面上划分了一圈一圈的同心圆,叫做柱面(Cylinder)对于软盘通常称之为磁道,在每个柱面中又划分了若干段,称之为扇区(Sector)。 由于技术的发展,硬盘的密度越来越大,使得硬盘的实际盘片数越来越少,对磁盘操作的柱面、磁头、扇区被硬盘控制器内部转换,已经不是实际的柱面、磁头、扇区了。由于最早时磁盘存取系统估计不足,传输数据时只给扇区留了6位,柱面留了10位,磁头留了8位。也就是说,柱面最大只能为1023。但是大硬盘的柱面远大于这个数,所以后来就采用将柱面数减少,将磁头数增加的方式来满足磁盘寻址的要求,对于实际地址的转换在BIOS中进行,这叫逻辑块寻址方式(Logical Block Addressing,LBA)硬盘中有关柱面、磁头、扇区的数据都是以此为基准的。 2. 分区结构 众多的文件数据存放在磁盘上,需要有组织,这就形成了文件系统。但是各个操作系统的文件系统都不尽相同,为了划分管理文件系统,在现在的PC机上都采用通用的分区结构。 分区机构是这样的:硬盘的以一个扇区(就是0柱面0磁头1扇区)叫主引导扇区(Main Boot Record,MBR),存放着引导程序和主分区表(Main Partition Table)和结束标志"55AA"。一般称的分区表即是主分区表。一个分区表最多可包含四个分区表项,每个分区表项中标示着一个分区信息或一个扩展分区表的位置,而扩展分区表中可能还有扩展分区表,这就形成了一个链状结构,可以记录很多个分区。 C语言定义如下 typedef struct { char bootcode[0x1be]; //启动代码 PartitionTable PT[4]; //分区表 word EndingFlag; //结束标识 }MBR; 分区表项的如下: typedef struct { byte BootFlag; //启动标志 CHS StartCHS; //分区开始的柱面、磁头、扇区 byte SystemID; //分区类型 CHS EndCHS; //分区结束的柱面、磁头、扇区 dword RelativeSectors; //分区相对扇区数,指分区相对于记录该分区的分区表的扇区位置之差 dword TotalSectors;//分区总扇区数 }PartitionTable; 其中CHS为一个柱面、磁头、扇区的结构,定义如下: struct CHS { byte Head; //磁头 byte Sector:6; //扇区 byte CyH2:2; //柱面的高两位 byte CyL8; //柱面的低八位 word Cylinder() {return (word(CyH2)*256+CyL8);} //返回柱面值 void SetCylinder(word Cylinder) //设置柱面值 { CyH2=(Cylinder>>8)&0x3; CyL8=(Cylinder&0xff); } }; 其中分区类型是对应于各种文件系统统一编排的一个代码。比如06H是大于32M的FAT16分区的标,05H是扩展分区的标志,等等。 一般的,对于DOS/Windows3.x/Windows95/98的系统来说,第一个分区表项记录着DOS主分区(C盘)的信息,而且是可以启动的,第二个分区表项一般是扩展分区,在这个扩展分区表项所指向的分区表中又是一个Dos主分区(D盘)和一个扩展分区,依次类推。而在绝大部分系统中Dos主分区(C盘)是从0柱面1磁头1扇区开始的。(有些机器在这个位置有个小分区,专门用来管理启动或机器设置,之后才是C盘的分区) 3. FAT文件系统 FAT文件系统(FAT12/FAT16/FAT32)是从DOS发展过来的一种文件系统,其优点是简单易用,并被多种操作系统支持。(目前支持FAT32的操作系统还不多)FAT文件系统名称后的数字是标识文件中系统一个分配单元所需的位(bit)数。 一个FAT12/16文件系统的结构是这样的: 引导扇区 第一文件分配表 第二文件分配表 根目录 数据区 (1).引导扇区 引导扇区是文件系统的第一个扇区,其中包含分区重要的数据信息--BPB(BIOS Paramenter Block-磁盘参数表)。磁盘参数表中包含分区总大小、磁盘参数等重要信息。其C语言定义为: typedef struct { word SectorBytes; //每扇区字节数 byte SectorsPerCluster; //每簇扇区数 word ReservedSectors; //保留扇区数 byte NbrFat; //FAT的个数 word RootEntry; //根目录项数 word TotalSectors; //分区总扇区数(分区小于32M时) byte Media; //分区介质标识 word SectorsPerFAT; //每个FAT占的扇区数 word SectorsPerTrack; //每道扇区数 word Heads; //磁头数 dword HiddenSectors; //隐含扇区数 dword BigTotalSectors; //分区总扇区数(分区大于32M时) }BPB_FAT16; 其中保留扇区数为从分区开始到第一个FAT表开始中间的扇区数。隐含扇区数同分区表中的隐含扇区数含义相同。虽然存在FAT个数的定义,但现在的FAT12/16系统基本上没有除2以外的值。因而一般不考虑其他情况。根目录项数是指根目录总共能容纳下的目录的项数。一个目录项占32个字节,所以一个扇区有512/32=16个目录项。用这个值除以16就是根目录所占的扇区数。分区总扇区数在分区大于32M时已经超过65535,两个字节已经无法表示,因此在大于32M的分区中TotalSector总是等于零,而将实际的数放在BigTotalSectors中。 分区介质标识是确定BPB有效的标志。它必须与FAT表中第一个字节的分区介质标识统一。硬盘的分区介质标识为0F8h,如果这个标识不对或者与FAT不统一则将会出"Invalid media type"的错误。 SectorsPerFAT是每个FAT所占的扇区数。系统根据分区起始地址+保留扇区数+每个FAT所占扇区数*FAT个数+根目录项数/16来确定数据区开始的位置,然后由这个位置+簇号*每簇扇区数来最终确定数据在硬盘扇的具体位置。 (2)文件分配表 文件分配表是文件在磁盘上分布的信息。FAT文件系统将数据区按每簇扇区数为单位划分成一个一个单元,每个单元是文件分配的最小单位。这个单元就称为簇。 一些大的文件可能占用了很多簇,而且在磁盘上没有连续存放。FAT表就是为了确定文件每个簇的连接关系而设的。FAT表的每一项都对应着数据区的一个簇,FAT16的FAT表每一项占16位,也就是两个字节。每一项的内容表示其对应簇的分配情况,0表示尚未分配;FFF0h~FFF6h为备用;FFF7h表示坏簇,即该簇中磁盘有损坏;FFF8h~FFFF表示文件结束;其他值则表示当前簇的下一簇的簇号。 FAT表的最前面两项是不用的,因此第一个数据簇的簇号为2。FAT表第一个字节也是分区介质类型,和BPB中的一样。因此用"F8 FF FF"可以作为硬盘FAT起始的标志。 绝大多数FAT系统有两个FAT表,第二个FAT表又称为后备文件分配表。系统内部完成后备文件分配表与第一文件分配表的统一。 本文讨论的完全恢复是基于后备文件分配表没有被破坏的情况下的恢复,如果两个文件分配表都被损坏,理论上就无法完全确定文件信息,因此无法完全恢复。 (3)根目录 FAT12/16的根目录是单独列出来的,在后备文件分配表和数据区之间。每个目录项为32个字节,记录一个文件或目录的信息。(长文件名例外) 文件修复的原理就是由目录项中指示的起始簇号和数据区开始位置来确定文件的位置,从而恢复小的文件。 4. FAT32文件系统 FAT32文件系统与FAT12/16的差别较大,一个主要的差别就是将根目录划归到数据区中了,在BPB中专门加了一项根目录开始簇号。这样根目录的大小就不再受到限制,大大增加了根目录的自由度。 FAT32的BPB定义如下: typedef struct { word BytesPerSector; //每扇区字节数 byte SectorsPerCluster; //每簇扇区数 word ReservedSectors; //保留扇区数 byte NumberOfFATs; //FAT的个数 word RootEntries; //根目录项数(FAT32不用) word TotalSectors; //分区总扇区数(FAT32不用) byte MediaDescriptor; //分区介质标识 word SectorsPerFAT; //每个FAT占的扇区数(FAT32不用) word SectorsPerTrack; //每道扇区数 word Heads; //磁头数 dword HiddenSectors; //隐含扇区数 dword BigTotalSectors; //分区总扇区数 dword BigSectorsPerFat; //每个FAT占的扇区数 word ExtFlags; //扩展标志 word FS_Version; //文件系统版本 dword RootDirStartClus; //根目录起始簇号 word FSInfoSec; //指向包含BIGFATBOOTFSINFO结构的扇区 word BkUpBootSec; //后备引导区的位置 byte Reserved[12]; //备用 }BPB_FAT32; 从上可以看出,FAT32的BPB是在FAT16BPB的基础上加入了一些参数,并停用了一些参数。每个FAT所占扇区数变为4个字节,根目录项数不再使用。 FAT32与FAT12/16的另一不同点在于,FAT32既可以同时使用多个FAT表,也可以只使用其中的某一个FAT表。ExtFlags正是这个标志。当ExtFlags的第8位为0时表示同时使用每个FAT表,当其为1时表示只使用其中的一个FAT表,这个FAT表的序号由ExtFlags的低4位给出。 FS_Version文件系统版本现在都为0。 FAT32将根目录也视作一个目录文件,使用一个簇链(Cluster Chain),RootDirStartClus正是这个链的起始簇号。 FAT32有个专门放BIGFATBOOTFSINFO结构的扇区,该结构包含了剩余簇个数,下一个空闲簇号等信息。这个扇区通常紧接着引导扇区。由于与恢复关系不大,本文不做讨论。 FAT32将引导扇区和文件系统信息扇区信息存了两份,另一份的位置由BkUpBootSec指出。这样由于偶然发生的损坏就很容易恢复。 5. 扩展BIOS参数块 在BPB的后面是Extended BIOS Paramenter Block。EBPB的结构如下: typedef struct //Extended BIOS Paramenter Block { byte PhysicalDriveNumber; //物理硬盘号 byte CurrentHead; //当前磁头 byte ExtBootRecSign; //扩展引导记录标志 dword SerialNumber; //序列号 char VolumeLabel[11]; //卷标 char FSID[8]; //文件系统标识 }EBPB; 其中物理硬盘号和当前磁头是系统运行时使用的,硬盘上的值没有什么实际意义。ExtBootRecSign一般为28h或29h。SerialNumber是格式化后生成的序列号。文件系统标识指示了文件系统的类型,即"FAT12"、 "FAT16"、 "FAT32"。 6. 压缩磁盘简介 从DOS6.0开始有了压缩磁盘的功能。DBLSPACE、DRVSPACE、DRVSPACE3是各个不同时期的磁盘压缩系统。压缩磁盘其实是个大文件,其内部是个更为复杂的FAT系统。这个大文件包含了文件头、MDFAT(Microsoft Drivespace FAT)、内部BPB、内部FAT、内部根目录及内部数据区,和分区非常相似。主要不同的是,它的FAT不直接对应数据区,而是对应于MDFAT表,每一个MDFAT表项包含扇区起始位置信息和扇区的压缩信息。 这样在存取一个文件时需要由目录项确定起始簇,由起始簇表确定MDFAT表项,再由MDFAT得到扇区位置,并由压缩信息决定是否进行压缩解压。根据FAT表来确定下一个簇或者文件结束。但其中的扇区位置等信息都是相对于这个文件的逻辑地址,具体物理地址还要用外部的分区信息和外部FAT表决定。因此对于C盘被压缩后的恢复是非常困难的。 7. ROM、PROM、EPROM、EEPROM、Flash ROM分别指什么? ROM指的是"只读存储器",即Read-Only Memory。这是一种线路最简单半导体电路,通过掩模工艺,一次性制造,其中的代码与数据将永久保存(除非坏掉),不能进行修改。这玩意一般在大批量生产时才会被用的,优点是成本低、非常低,但是其风险比较大,在产品设计时,如果调试不彻底,很容易造成几千片的费片,行内话叫"掩砸了"! PROM指的是"可编程只读存储器"既Programmable Red-Only Memory。这样的产品只允许写入一次,所以也被称为"一次可编程只读存储器"(One Time ProgarmmingROM,OTP-ROM)。PROM在出厂时,存储的内容全为1,用户可以根据需要将其中的某些单元写入数据0(部分的PROM在出厂时数据全为0,则用户可以将其中的部分单元写入1),以实现对其"编程"的目的。PROM的典型产品是"双极性熔丝结构",如果我们想改写某些单元,则可以给这些单元通以足够大的电流,并维持一定的时间,原先的熔丝即可熔断,这样就达到了改写某些位的效果。另外一类经典的PROM为使用"肖特基二极管"的PROM,出厂时,其中的二极管处于反向截止状态,还是用大电流的方法将反相电压加在"肖特基二极管",造成其永久性击穿即可。 EPROM指的是"可擦写可编程只读存储器",即Erasable Programmable Read-Only Memory。它的特点是具有可擦除功能,擦除后即可进行再编程,但是缺点是擦除需要使用紫外线照射一定的时间。这一类芯片特别容易识别,其封装中包含有"石英玻璃窗",一个编程后的EPROM芯片的"石英玻璃窗"一般使用黑色不干胶纸盖住,以防止遭到阳光直射。 EEPROM指的是"电可擦除可编程只读存储器",即Electrically Erasable Programmable Read-Only Memory。它的最大优点是可直接用电信号擦除,也可用电信号写入。EEPROM不能取代RAM的原应是其工艺复杂,耗费的门电路过多,且重编程时间比较长,同时其有效重编程次数也比较低。 Flash memory指的是"闪存",所谓"闪存",它也是一种非易失性的内存,属于EEPROM的改进产品。它的最大特点是必须按块(Block)擦除(每个区块的大小不定,不同厂家的产品有不同的规格),而EEPROM则可以一次只擦除一个字节(Byte)。目前"闪存"被广泛用在PC机的主板上,用来保存BIOS程序,便于进行程序的升级。其另外一大应用领域是用来作为硬盘的替代品,具有抗震、速度快、无噪声、耗电低的优点,但是将其用来取代RAM就显得不合适,因为RAM需要能够按字节改写,而Flash ROM做不到。 8. DOS(DOS兼容系统硬盘数据)的构成 主分区和扩展分区结构基本相似,以下以主分区为例。 主引导记录(MBR):MBR占一个扇区,在CYL 0、SIDE 0 、SEC 1,由代码区和分区表构成。其中代码区可以由FDISK/MBR重建。 系统扇区:CYL 0、SIDE 0 、SEC 1-CYL 0、SIDE 0 、SEC63,共62个扇区 引导区(BOOT):CYL 0、SIDE 1 、SEC 1 这是我们过去称的DOS引导区。也占一个扇区。 隐藏扇区:CYL 0、SIDE 0 、SEC 1,如果是FAT16那么占一个扇区,如果是FAT32则由此占32个扇区。 文件分配表:一般有两个FAT表,FAT12、FAT16的第一FAT表一般均在0-1-2,FAT32的第一FAT表在0-1-33。FAT表是记录文件占用扇区连接的地方,如果两个FAT表都坏了,后果不堪设想。由于FAT表的长度与当前分区的大小有关所以FAT2的地址是需要计算的。 根目录区:(ROOT)这里记录了根目录里的目录文件项等, ROOT区跟在FAT2后面。 数据区:跟在ROOT区后面,这才是数据内容。 9. 主引导记录简单说明: 主引导记录是硬盘引导的起点,关于代码区不多说了,其分区表,比较重要的是2个标志,在偏移1BE处的80的标记表示系统可引导,且整个分区表只能有一个80标记。另一个就是结尾的55 AA标记。用来表示主引导记录是一个有效的记录。 其实,无论MBR还是隐含扇区还是BOOT区,都不重要,这些重建都比较容易。对数据恢复来说,能否成功的找回数据文件是重要的。另外,由于FAT表记录了文件在硬盘上占用扇区的链表,如果2个FAT表都完全损坏了。那么恢复文件,特别是占用多个不连续扇区文件就相当困难了。 基本思路是: 1、FAT2没有损坏的情况,用FAT2覆盖FAT1。 2、FAT2也已经损坏的情况,我一般是只期待找回其中某些关键的文件了。我们最期待的是这些文件是连续的。如果不连续的话,也并非没有可能,但这往往还要知道文件的一些细节,包括对一些文件本身的连接结构有了解。如果FAT2没有完全破坏,是有一定用处的,另外,一般来说,FAT16的硬盘因为FAT表靠前破坏的比较严重,一般两个FAT表都坏了,小硬盘也很难恢复了。
阅读(1509) | 评论(0) | 转发(0) |