硬盘的数据结构精品资料.doc
硬盘的数据结构在上文中,我们谈了数据在硬盘中的存储的一般原理。为了能更深入的了解硬盘,我们还必须对硬盘的数据结构有个简单的了解。硬盘上的数据按照其不同的特点和作用大致可分为5部分:MBR区、DBR区、FAT区、DIR区和DATA区。我们来分别介绍一下:(1)MBR区MBR(Main Boot Record),按其字面上的理解即为主引导记录区,位于整个硬盘的0磁道0柱面1扇区。不过,在总共512字节的主引导扇区中,MBR只占用了其中的446个字节(偏移0-偏移1BDH),另外的64个字节(偏移1BEH-偏移1FDH)交给了DPT(Disk Partition Table硬盘分区表)(见下表),最后两个字节"55,AA"(偏移1FEH- 偏移1FFH)是分区的结束标志。这个整体构成了硬盘的主引导扇区。大致的结构如图5: 主引导记录中包含了硬盘的一系列参数和一段引导程序。其中的硬盘引导程序的主要作用是检查分区表是否正确并且在系统硬件完成自检以后引导具有激活标志的分区上的操作系统,并将控制权交给启动程序。MBR是由分区程序(如F)所产生的,它不依赖任何操作系统,而且硬盘引导程序也是可以改变的,从而实现多系统共存。下面,我们以一个实例让大家更直观地来了解主引导记录:例:80 01 01 00 0B FE BF FC 3F 00 00 00 7E 86 BB 00在这里我们可以看到,最前面的"80"是一个分区的激活标志,表示系统可引导;"01 01 00"表示分区开始的磁头号为01,开始的扇区号为01,开始的柱面号为00;"0B"表示分区的系统类型是FAT32,其他比较常用的有04(FAT16)、07(NTFS);"FE BF FC"表示分区结束的磁头号为254,分区结束的扇区号为63、分区结束的柱面号为764;"3F 00 00 00"表示首扇区的相对扇区号为63;"7E 86 BB 00"表示总扇区数为12289622。(2)DBR区DBR(Dos Boot Record)是操作系统引导记录区的意思。它通常位于硬盘的0磁道1柱面1扇区,是操作系统可以直接访问的第一个扇区,它包括一个引导程序和一个被称为BPB(Bios Parameter Block)的本分区参数记录表。引导程序的主要任务是当MBR将系统控制权交给它时,判断本分区跟目录前两个文件是不是操作系统的引导文件(以DOS为例,即是Io.sys和Msdos.sys)。如果确定存在,就把其读入内存,并把控制权 交给该文件。BPB参数块记录着本分区的起始扇区、结束扇区、文件存储格式、硬盘介质描述符、根目录大小、FAT个数,分配单元的大小等重要参数。(3)FAT区在DBR之后的是我们比较熟悉的FAT(File Allocation Table文件分配表)区。在解释文件分配表的概念之前,我们先来谈谈簇(cluster)的概念。文件占用磁盘空间时,基本单位不是字节而是簇。簇的大小与磁盘的规格有关,一般情况下,软盘每簇是1个扇区,硬盘每簇的扇区数与硬盘的总容量大小有关,可能是4、8、16、32、64通过上文我们已经知道,同一个文件的数据并不一定完整地存放在磁盘的一个连续的区域内,而往往会分成若干段,像一条链子一样存放。这种存储方式称为文件的链式存储。(见图6)硬盘上的文件常常要进行创建、删除、增长、缩短等操作。这样操作做的越多,盘上的文件就可能被分得越零碎(每段至少是1簇)。但是,由于硬盘上保存着段与段之间的连接信息(即FAT),操作系统在读取文件时,总是能够准确地找到各段的位置并正确读出。不过,这种以簇为单位的存储法也是有其缺陷的。这主要表现在对空间的利用上。每个文件的最后一簇都有可能有未被完全利用的空间(称为尾簇空间)。一般来说,当文件个数比较多时,平均每个文件要浪费半个簇的空间。好了,我们言归正传,为了实现文件的链式存储,硬盘上必须准确地记录哪些簇已经被文件占用,还必须为每个已经占用的簇指明存储后继内容的下一个簇的簇号,对一个文件的最后一簇,则要指明本簇无后继簇。这些都是由FAT表来保存的,表中有很多表项,每项记录一个簇的信息。由于FAT对于文件管理的重要性,所以FAT有一个备份,即在原FAT的后面再建一个同样的FAT。初形成的FAT中所有项都标明为"未占用",但如果磁盘有局部损坏,那么格式化程序会检测出损坏的簇,在相应的项中标为"坏簇",以后存文件时就不会再使用这个簇了。FAT的项数与硬盘上的总簇数相当,每一项占用的字节数也要与总簇数相适应,因为其中需要存放簇号。FAT的格式有多种,最为常见和为读者所熟悉的是FAT16和FAT32,其中FAT16是指文件分配表使用16位数字,由于16位分配表最多能管理65536(即2的16次方)个簇,也就是所规定的一个硬盘分区。由于每个簇的存储空间最大只有32KB,所以在使用FAT16管理硬盘时,每个分区的最大存储容量只有(65536×32 KB)即2048MB,也就是我们常说的2G。现在的硬盘容量是越来越大,由于FAT16对硬盘分区的容量限制,所以当硬盘容量超过2G之后,用户只能将硬盘划分成多个2G的分区后才能正常使用,为此微软公司从Windows 95 OSR2版本开始使用FAT32标准,即使用32位的文件分配表来管理硬盘文件,这样系统就能为文件分配多达4294967296(即2的32次方)个簇,所以在簇同样为32KB时每个分区容量最大可达65G以上。此外使用FAT32管理硬盘时,每个逻辑盘中的簇长度也比使用FAT16标准管理的同等容量逻辑盘小很多。由于文件存储在硬盘上占用的磁盘空间以簇为最小单位,所以某一文件即使只有几十个字节也必须占用整个簇,因此逻辑盘的簇单位容量越小越能合理利用存储空间。所以FAT32更适于大硬盘。(4)DIR区DIR(Directory)是根目录区,紧接着第二FAT表(即备份的FAT表)之后,记录着根目录下每个文件(目录)的起始单元,文件的属性等。定位文件位置时,操作系统根据DIR中的起始单元,结合FAT表就可以知道文件在硬盘中的具体位置和大小了。(5)数据(DATA)区数据区是真正意义上的数据存储的地方,位于DIR区之后,占据硬盘上的大部分数据空间。数据在硬盘上的存储(创易工作室2001年06月26日 11:37)硬盘是现在计算机上最常用的存储器。我们都知道,计算机之所以神奇,是因为它具有高速分析处理数据的能力。而这些数据都被以文件的形式存储在硬盘里。不过,计算机可不像人那么聪明。在读取相应的文件时,你必须要给出它相应的规则。这就是分区概念的形成。 分区从实质上说就是对硬盘的一种格式化。当我们创建分区时,就已经设置好了硬盘的各项物理参数,指定了硬盘主引导记录(即MasterBootRecord,一般简称为MBR)和引导记录备份的存放位置。而对于文件系统以及其他操作系统管理硬盘所需要的信息则是通过之后的高级格式化,即Format命令来实现。硬件分区后,将会被划分为面、磁道和扇区。需要注意的是,这些只是个虚拟的概念,并不是真正在硬盘上划道子_。先从面说起,硬盘一般是由一片或几片圆形薄膜叠加而成。我们所说,每个圆形薄膜都有两个"面"(Side),这两个面都是用来存储数据的。按照面的多少,依次称为0面、1面、2面由于每个面都专有一个读写磁头,也常用0头(head)、1头称之。按照硬盘容量和规格的不同,硬盘面数(或头数)也不一定相同,少的只有2面,多的可达数十面。各面上磁道号相同的磁道合起来,称为一个柱面(cylinder)(见图1)。图1上面我们提到了磁道的概念。那么究竟何为磁道呢?大家都知道,读写硬盘时,磁头依靠磁盘的高速旋转引起的空气动力效应悬浮在盘面上,与盘面的距离不到1微米(约为头发直径的百分之一)。由于磁盘是旋转的,则连续写入的数据是排列在一个圆周上的。我们称这样的圆周为一个磁道(Track)。(见图2)如果读写磁头沿着圆形薄膜的半径方向移动一段距离,以后写入的数据又排列在另外一个磁道上。图2根据硬盘规格的不同,磁道数可以从几百到数千不等;一个磁道上可以容纳数KB的数据,而主机读写时往往并不需要一次读写那么多,于是,磁道又被划分成若干段,每段称为一个扇区(Sector)。一个扇区一般存放512字节的数据。扇区也需要编号,同一磁道中的扇区,分别称为1扇区,2扇区。这里需要注意的是,硬盘在划分扇区时,和一般的软盘有一定的区别。软盘的一个磁道中,扇区号依次编排,即2号与1号相邻,3号与2号相邻,以此类推。而在硬盘的一个磁道中,扇区号是按照某个间隔跳跃着编排的。我们举一个例子来说明:在某个硬盘上,以实际存储位置而论,2号扇区并不是1号扇区后的第一个,而是第5个,3号扇区又是2号扇区后的第5个,以此类推。这个"5"就是我们说的交叉因子。(见图3)当然,这个交叉因子的设定并不是绝对的,每个种类的硬盘为根据自身的情况加以变化。选择适当的交叉因子,可使硬盘驱动器读写扇区的速度与硬盘的旋转速度相匹配,提高存储数据的速度。图3计算机对硬盘的读写,处于效率的考虑,是以扇区为基本单位的。即使计算机只需要硬盘上存储的某个字节,也必须一次把这个字节所在的扇区中的512字节全部读入内存,再使用所需的那个字节。不过,在上文中我们也提到,硬盘上面、磁道、扇区的划分表面上是看不到任何痕迹的,虽然磁头可以根据某个磁道的应有半径来对准这个磁道,但怎样才能在首尾相连的一圈扇区中找出所需要的某一扇区呢?原来,每个扇区并不仅仅是由512个字节组成的,在这些由计算机存取的数据的前、后两端,都另有一些特定的数据,这些数据构成了扇区的界限标志,标志中含有扇区的编号和其他信息。计算机就凭借着这些标志来识别扇区(见图4)。 图4(责任编辑 Jacky school) 硬盘数据存储及其相关系统的原理(胜鸥2001年04月29日 02:13)对计算机用户来说,硬盘故障简直就是一场灾难。很多时候硬盘里的数据比硬盘本身甚至整台电脑更值钱。如果你没有按我上期“备份数据、有备无患”一文中所讲经常备份你宝贵的数据,一旦遇到数据丢失的灾难,要恢复起来就很难了。但通过一些软件和方法,你还是有可能恢复一些重要数据的。数据丢失后,你首先应该“保护好灾难现场”:即在确定恢复计划前,不要再对硬盘进行任何写操作。在介绍一些数据恢复的软件及方法前,我们有必要先来了解一下硬盘数据存储及其相关系统的原理。硬盘驱动器是一种采用磁介质的数据存储设备,数据存储在密封于洁净的硬盘驱动器内腔的若干个磁盘片上。这些盘片一般是在以铝为主要成分的片基表面涂上磁性介质所形成,在磁盘片的每一面上,以转动轴为轴心、以一定的磁密度为间隔的若干个同心圆就被划分成磁道(track),每个磁道又被划分为若干个扇区(sector),数据就按扇区存放在硬盘上。在每一面上都相应地有一个读写磁头(head),所以不同磁头的所有相同位置的磁道就构成了所谓的柱面(cylinder)。传统的硬盘读写都是以柱面、磁头、扇区为寻址方式的(CHS寻址)。硬盘在上电后保持高速旋转(5400转/min以上),位于磁头臂上的磁头悬浮在磁盘表面,可以通过步进电机在不同柱面之间移动,对不同的柱面进行读写。所以在上电期间如果硬盘受到剧烈振荡,磁盘表面就容易被划伤,磁头也容易损坏,这都将给盘上存储的数据带来灾难性的后果。硬盘的第一个扇区(0道0头1扇区)被保留为主引导扇区。在主引导区内主要有两项内容:主引导记录和硬盘分区表。主引导记录是一段程序代码,其作用主要是对硬盘上安装的操作系统进行引导;硬盘分区表则存储了硬盘的分区信息。计算机启动时将读取该扇区的数据,并对其合法性进行判断(扇区最后两个字节是否为0x55AA或0xAA55 ),如合法则跳转执行该扇区的第一条指令。所以硬盘的主引导区常常成为病毒攻击的对象,从而被篡改甚至被破坏。可引导标志:0x80为可引导分区类型标志;0表示未知;1为FAT12;4为FAT16;5为扩展分区等等。CMOS中的硬盘信息在计算机的CMOS中也存储了硬盘的信息,主要有硬盘类型、容量、柱面数、磁头数、每道扇区数、寻址方式等内容,对硬盘参数加以说明,以便计算机正确访问硬盘。当CMOS因故掉电或发生错误时,硬盘设置可能会丢失或错误,硬盘访问也就无法正确进行。这种情况我们就必须重新设置硬盘参数,如果事先已记下硬盘参数或者有某些防病毒软件事先备份的CMOS信息,只需手工恢复即可;否则也可使用BIOS设置(setup)中的“自动检测硬盘类型”(HD type auto detection)的功能,一般也能得到正确的结果。硬盘故障大体上可以分为软故障和硬故障两大类,具体有硬盘操作系统被损坏、硬盘主引导区被破坏、 FAT表表被破坏、CMOS硬盘参数不正确、硬盘控制器与硬盘驱动器未能正常连接、硬盘驱动器或硬盘控制器硬件故障、主板故障等情况。比如:开机自检过程中,屏幕提示“Hard disk drive failure”或类似信息,则可以判断为硬盘驱动器或硬盘控制器(提示“Hard drive controller failure”)硬件故障。开机自检过程中,屏幕提示“Hard disk not present”或类似信息,则可能是CMOS硬盘参数设置错误或硬盘控制器与硬盘驱动器连接不正确。开机自检过程中,屏幕提示“Missing operating system”、“Non OS” 、“Non system disk or disk error,replace disk and press a key to reboot”等类似信息,则可能是硬盘主引导区分区表被破坏、操作系统未正确安装或者CMOS硬盘参数设置错误等。开机用软盘启动后无法进入C盘,可能是分区表被破坏 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 bootcode0x1be; /启动代码 PartitionTable PT4; /分区表 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表示尚未分配;FFF0hFFF6h为备用;FFF7h表示坏簇,即该簇中磁盘有损坏;FFF8hFFFF表示文件结束;其他值则表示当前簇的下一簇的簇号。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 Reserved12; /备用 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 VolumeLabel11; /卷标 char FSID8; /文件系统标识 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表都坏了,小硬盘也很难恢复了。 电子硬盘文件管理 数据逻辑结构1 根据Flash memory的特点,将文件的管理格式分配如下1. 文件信息区(File Message Area)FMA2. 文件存储链表区(File store Link Area)FLA3. 文件数据区(File Data Area)FDA4. 文件目录区(File Directory Area)可选四个区的关系如下: 文件信息区文件信息区文件数据文件存储链表区文件信息区 文件序号 1 字节 文件名 8 文件扩展名 3 文件时间 3 文件大小 4 文件存储链表快 2 其他信息 n如下列信息 文件信息区 例存储aaaaaaaa.txt 1 8 3 3 4 2 *01 aaaaaaaa txt 030802 0a0b0f0d 0a0b *根据oaob块(注意硬盘管理为簇,这里是块,每块根据Flash的大小分为4k,8k,16k,32K,.) 0a0b快就是我的文件数据链表区.根据下图0cod(0000h)0d0f(0001h)1011(0002h)0a0b块 datadatadata 链表快 数据块 0c0d 0d0f 1011根据文件信息块的0a0b查找链表块,由链表快查找数据块.链表快为循序存储,你还可以进行链式存储附录资料:不需要的可以自行删除 libxml2应用实例 Libxml