硬盘的数据结构_第1页
硬盘的数据结构_第2页
硬盘的数据结构_第3页
硬盘的数据结构_第4页
硬盘的数据结构_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 硬盘的数据结构在上文中,我们谈了数据在硬盘中的存储的一般原理。为了能更深入的了解硬盘,我们还必须对硬盘的数据结构有个简单的了解。硬盘上的数据按照其不同的特点和作用大致可分为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硬盘分区表)(见下表),

2、最后两个字节55,AA(偏移1FEH- 偏移1FFH)是分区的结束标志。这个整体构成了硬盘的主引导扇区。大致的结构如图5: 主引导记录中包含了硬盘的一系列参数和一段引导程序。其中的硬盘引导程序的主要作用是检查分区表是否正确并且在系统硬件完成自检以后引导具有激活标志的分区上的操作系统,并将控制权交给启动程序。MBR是由分区程序(如F)所产生的,它不依赖任何操作系统,而且硬盘引导程序也是可以改变的,从而实现多系统共存。下面,我们以一个实例让大家更直观地来了解主引导记录:例:80 01 01 00 0B FE BF FC 3F 00 00 00 7E 86 BB 00在这里我们可以看到,最前面的80

3、是一个分区的激活标志,表示系统可引导;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扇区,是操作系统可以直接访问的第一个扇区,它包括一个引导程序和一个被称为B

4、PB(Bios Parameter Block)的本分区参数记录表。引导程序的主要任务是当MBR将系统控制权交给它时,判断本分区跟目录前两个文件是不是操作系统的引导文件(以DOS为例,即是Io.sys和Msdos.sys)。如果确定存在,就把其读入内存,并把控制权 交给该文件。BPB参数块记录着本分区的起始扇区、结束扇区、文件存储格式、硬盘介质描述符、根目录大小、FAT个数,分配单元的大小等重要参数。(3)FAT区在DBR之后的是我们比较熟悉的FAT(File Allocation Table文件分配表)区。在解释文件分配表的概念之前,我们先来谈谈簇(cluster)的概念。文件占用磁盘空间时

5、,基本单位不是字节而是簇。簇的大小与磁盘的规格有关,一般情况下,软盘每簇是1个扇区,硬盘每簇的扇区数与硬盘的总容量大小有关,可能是4、8、16、32、64通过上文我们已经知道,同一个文件的数据并不一定完整地存放在磁盘的一个连续的区域内,而往往会分成若干段,像一条链子一样存放。这种存储方式称为文件的链式存储。(见图6)硬盘上的文件常常要进行创建、删除、增长、缩短等操作。这样操作做的越多,盘上的文件就可能被分得越零碎(每段至少是1簇)。但是,由于硬盘上保存着段与段之间的连接信息(即FAT),操作系统在读取文件时,总是能够准确地找到各段的位置并正确读出。不过,这种以簇为单位的存储法也是有其缺陷的。这

6、主要表现在对空间的利用上。每个文件的最后一簇都有可能有未被完全利用的空间(称为尾簇空间)。一般来说,当文件个数比较多时,平均每个文件要浪费半个簇的空间。好了,我们言归正传,为了实现文件的链式存储,硬盘上必须准确地记录哪些簇已经被文件占用,还必须为每个已经占用的簇指明存储后继内容的下一个簇的簇号,对一个文件的最后一簇,则要指明本簇无后继簇。这些都是由FAT表来保存的,表中有很多表项,每项记录一个簇的信息。由于FAT对于文件管理的重要性,所以FAT有一个备份,即在原FAT的后面再建一个同样的FAT。初形成的FAT中所有项都标明为未占用,但如果磁盘有局部损坏,那么格式化程序会检测出损坏的簇,在相应的

7、项中标为坏簇,以后存文件时就不会再使用这个簇了。FAT的项数与硬盘上的总簇数相当,每一项占用的字节数也要与总簇数相适应,因为其中需要存放簇号。FAT的格式有多种,最为常见和为读者所熟悉的是FAT16和FAT32,其中FAT16是指文件分配表使用16位数字,由于16位分配表最多能管理65536(即2的16次方)个簇,也就是所规定的一个硬盘分区。由于每个簇的存储空间最大只有32KB,所以在使用FAT16管理硬盘时,每个分区的最大存储容量只有(6553632 KB)即2048MB,也就是我们常说的2G。现在的硬盘容量是越来越大,由于FAT16对硬盘分区的容量限制,所以当硬盘容量超过2G之后,用户只能

8、将硬盘划分成多个2G的分区后才能正常使用,为此微软公司从Windows 95 OSR2版本开始使用FAT32标准,即使用32位的文件分配表来管理硬盘文件,这样系统就能为文件分配多达4294967296(即2的32次方)个簇,所以在簇同样为32KB时每个分区容量最大可达65G以上。此外使用FAT32管理硬盘时,每个逻辑盘中的簇长度也比使用FAT16标准管理的同等容量逻辑盘小很多。由于文件存储在硬盘上占用的磁盘空间以簇为最小单位,所以某一文件即使只有几十个字节也必须占用整个簇,因此逻辑盘的簇单位容量越小越能合理利用存储空间。所以FAT32更适于大硬盘。(4)DIR区DIR(Directory)是根

9、目录区,紧接着第二FAT表(即备份的FAT表)之后,记录着根目录下每个文件(目录)的起始单元,文件的属性等。定位文件位置时,操作系统根据DIR中的起始单元,结合FAT表就可以知道文件在硬盘中的具体位置和大小了。(5)数据(DATA)区数据区是真正意义上的数据存储的地方,位于DIR区之后,占据硬盘上的大部分数据空间。数据在硬盘上的存储(创易工作室2001年06月26日 11:37)硬盘是现在计算机上最常用的存储器。我们都知道,计算机之所以神奇,是因为它具有高速分析处理数据的能力。而这些数据都被以文件的形式存储在硬盘里。不过,计算机可不像人那么聪明。在读取相应的文件时,你必须要给出它相应的规则。这

10、就是分区概念的形成。 分区从实质上说就是对硬盘的一种格式化。当我们创建分区时,就已经设置好了硬盘的各项物理参数,指定了硬盘主引导记录(即MasterBootRecord,一般简称为MBR)和引导记录备份的存放位置。而对于文件系统以及其他操作系统管理硬盘所需要的信息则是通过之后的高级格式化,即Format命令来实现。硬件分区后,将会被划分为面、磁道和扇区。需要注意的是,这些只是个虚拟的概念,并不是真正在硬盘上划道子_。先从面说起,硬盘一般是由一片或几片圆形薄膜叠加而成。我们所说,每个圆形薄膜都有两个面(Side),这两个面都是用来存储数据的。按照面的多少,依次称为0面、1面、2面由于每个面都专有

11、一个读写磁头,也常用0头(head)、1头称之。按照硬盘容量和规格的不同,硬盘面数(或头数)也不一定相同,少的只有2面,多的可达数十面。各面上磁道号相同的磁道合起来,称为一个柱面(cylinder)(见图1)。图1上面我们提到了磁道的概念。那么究竟何为磁道呢?大家都知道,读写硬盘时,磁头依靠磁盘的高速旋转引起的空气动力效应悬浮在盘面上,与盘面的距离不到1微米(约为头发直径的百分之一)。由于磁盘是旋转的,则连续写入的数据是排列在一个圆周上的。我们称这样的圆周为一个磁道(Track)。(见图2)如果读写磁头沿着圆形薄膜的半径方向移动一段距离,以后写入的数据又排列在另外一个磁道上。图2根据硬盘规格的

12、不同,磁道数可以从几百到数千不等;一个磁道上可以容纳数KB的数据,而主机读写时往往并不需要一次读写那么多,于是,磁道又被划分成若干段,每段称为一个扇区(Sector)。一个扇区一般存放512字节的数据。扇区也需要编号,同一磁道中的扇区,分别称为1扇区,2扇区。这里需要注意的是,硬盘在划分扇区时,和一般的软盘有一定的区别。软盘的一个磁道中,扇区号依次编排,即2号与1号相邻,3号与2号相邻,以此类推。而在硬盘的一个磁道中,扇区号是按照某个间隔跳跃着编排的。我们举一个例子来说明:在某个硬盘上,以实际存储位置而论,2号扇区并不是1号扇区后的第一个,而是第5个,3号扇区又是2号扇区后的第5个,以此类推。

13、这个5就是我们说的交叉因子。(见图3)当然,这个交叉因子的设定并不是绝对的,每个种类的硬盘为根据自身的情况加以变化。选择适当的交叉因子,可使硬盘驱动器读写扇区的速度与硬盘的旋转速度相匹配,提高存储数据的速度。图3计算机对硬盘的读写,处于效率的考虑,是以扇区为基本单位的。即使计算机只需要硬盘上存储的某个字节,也必须一次把这个字节所在的扇区中的512字节全部读入内存,再使用所需的那个字节。不过,在上文中我们也提到,硬盘上面、磁道、扇区的划分表面上是看不到任何痕迹的,虽然磁头可以根据某个磁道的应有半径来对准这个磁道,但怎样才能在首尾相连的一圈扇区中找出所需要的某一扇区呢?原来,每个扇区并不仅仅是由5

14、12个字节组成的,在这些由计算机存取的数据的前、后两端,都另有一些特定的数据,这些数据构成了扇区的界限标志,标志中含有扇区的编号和其他信息。计算机就凭借着这些标志来识别扇区(见图4)。 图4(责任编辑 Jacky school) 硬盘数据存储及其相关系统的原理(胜鸥2001年04月29日 02:13)对计算机用户来说,硬盘故障简直就是一场灾难。很多时候硬盘里的数据比硬盘本身甚至整台电脑更值钱。如果你没有按我上期“备份数据、有备无患”一文中所讲经常备份你宝贵的数据,一旦遇到数据丢失的灾难,要恢复起来就很难了。但通过一些软件和方法,你还是有可能恢复一些重要数据的。数据丢失后,你首先应该“保护好灾难

15、现场”:即在确定恢复计划前,不要再对硬盘进行任何写操作。在介绍一些数据恢复的软件及方法前,我们有必要先来了解一下硬盘数据存储及其相关系统的原理。硬盘驱动器是一种采用磁介质的数据存储设备,数据存储在密封于洁净的硬盘驱动器内腔的若干个磁盘片上。这些盘片一般是在以铝为主要成分的片基表面涂上磁性介质所形成,在磁盘片的每一面上,以转动轴为轴心、以一定的磁密度为间隔的若干个同心圆就被划分成磁道(track),每个磁道又被划分为若干个扇区(sector),数据就按扇区存放在硬盘上。在每一面上都相应地有一个读写磁头(head),所以不同磁头的所有相同位置的磁道就构成了所谓的柱面(cylinder)。传统的硬盘

16、读写都是以柱面、磁头、扇区为寻址方式的(CHS寻址)。硬盘在上电后保持高速旋转(5400转/min以上),位于磁头臂上的磁头悬浮在磁盘表面,可以通过步进电机在不同柱面之间移动,对不同的柱面进行读写。所以在上电期间如果硬盘受到剧烈振荡,磁盘表面就容易被划伤,磁头也容易损坏,这都将给盘上存储的数据带来灾难性的后果。硬盘的第一个扇区(0道0头1扇区)被保留为主引导扇区。在主引导区内主要有两项内容:主引导记录和硬盘分区表。主引导记录是一段程序代码,其作用主要是对硬盘上安装的操作系统进行引导;硬盘分区表则存储了硬盘的分区信息。计算机启动时将读取该扇区的数据,并对其合法性进行判断(扇区最后两个字节是否为0

17、 x55AA或0 xAA55 ),如合法则跳转执行该扇区的第一条指令。所以硬盘的主引导区常常成为病毒攻击的对象,从而被篡改甚至被破坏。可引导标志:0 x80为可引导分区类型标志;0表示未知;1为FAT12;4为FAT16;5为扩展分区等等。CMOS中的硬盘信息在计算机的CMOS中也存储了硬盘的信息,主要有硬盘类型、容量、柱面数、磁头数、每道扇区数、寻址方式等内容,对硬盘参数加以说明,以便计算机正确访问硬盘。当CMOS因故掉电或发生错误时,硬盘设置可能会丢失或错误,硬盘访问也就无法正确进行。这种情况我们就必须重新设置硬盘参数,如果事先已记下硬盘参数或者有某些防病毒软件事先备份的CMOS信息,只需

18、手工恢复即可;否则也可使用BIOS设置(setup)中的“自动检测硬盘类型”(HD type auto detection)的功能,一般也能得到正确的结果。硬盘故障大体上可以分为软故障和硬故障两大类,具体有硬盘操作系统被损坏、硬盘主引导区被破坏、 FAT表表被破坏、CMOS硬盘参数不正确、硬盘控制器与硬盘驱动器未能正常连接、硬盘驱动器或硬盘控制器硬件故障、主板故障等情况。比如:开机自检过程中,屏幕提示“Hard disk drive failure”或类似信息,则可以判断为硬盘驱动器或硬盘控制器(提示“Hard drive controller failure”)硬件故障。开机自检过程中,屏幕

19、提示“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

20、)负责读写这个磁面(Side),在每个磁面上划分了一圈一圈的同心圆,叫做柱面(Cylinder)对于软盘通常称之为磁道,在每个柱面中又划分了若干段,称之为扇区(Sector)。由于技术的发展,硬盘的密度越来越大,使得硬盘的实际盘片数越来越少,对磁盘操作的柱面、磁头、扇区被硬盘控制器内部转换,已经不是实际的柱面、磁头、扇区了。由于最早时磁盘存取系统估计不足,传输数据时只给扇区留了6位,柱面留了10位,磁头留了8位。也就是说,柱面最大只能为1023。但是大硬盘的柱面远大于这个数,所以后来就采用将柱面数减少,将磁头数增加的方式来满足磁盘寻址的要求,对于实际地址的转换在BIOS中进行,这叫逻辑块寻址方

21、式(Logical Block Addressing,LBA)硬盘中有关柱面、磁头、扇区的数据都是以此为基准的。2. 分区结构众多的文件数据存放在磁盘上,需要有组织,这就形成了文件系统。但是各个操作系统的文件系统都不尽相同,为了划分管理文件系统,在现在的PC机上都采用通用的分区结构。分区机构是这样的:硬盘的以一个扇区(就是0柱面0磁头1扇区)叫主引导扇区(Main Boot Record,MBR),存放着引导程序和主分区表(Main Partition Table)和结束标志55AA。一般称的分区表即是主分区表。一个分区表最多可包含四个分区表项,每个分区表项中标示着一个分区信息或一个扩展分区表

22、的位置,而扩展分区表中可能还有扩展分区表,这就形成了一个链状结构,可以记录很多个分区。 C语言定义如下 typedef struct char bootcode0 x1be; /启动代码 PartitionTable PT4; /分区表 word EndingFlag; /结束标识MBR; 分区表项的如下: typedef struct byte BootFlag; /启动标志 CHS StartCHS; /分区开始的柱面、磁头、扇区 byte SystemID; /分区类型 CHS EndCHS; /分区结束的柱面、磁头、扇区 dword RelativeSectors; /分区相对扇区数,

23、指分区相对于记录该分区的分区表的扇区位置之差 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=(Cylinder8)&0 x3; CyL8=(Cy

24、linder&0 xff); ;其中分区类型是对应于各种文件系统统一编排的一个代码。比如06H是大于32M的FAT16分区的标,05H是扩展分区的标志,等等。一般的,对于DOS/Windows3.x/Windows95/98的系统来说,第一个分区表项记录着DOS主分区(C盘)的信息,而且是可以启动的,第二个分区表项一般是扩展分区,在这个扩展分区表项所指向的分区表中又是一个Dos主分区(D盘)和一个扩展分区,依次类推。而在绝大部分系统中Dos主分区(C盘)是从0柱面1磁头1扇区开始的。(有些机器在这个位置有个小分区,专门用来管理启动或机器设置,之后才是C盘的分区) 3. FAT文件系统FAT文件

25、系统(FAT12/FAT16/FAT32)是从DOS发展过来的一种文件系统,其优点是简单易用,并被多种操作系统支持。(目前支持FAT32的操作系统还不多)FAT文件系统名称后的数字是标识文件中系统一个分配单元所需的位(bit)数。一个FAT12/16文件系统的结构是这样的: 引导扇区 第一文件分配表 第二文件分配表 根目录 数据区 (1).引导扇区 引导扇区是文件系统的第一个扇区,其中包含分区重要的数据信息-BPB(BIOS Paramenter Block-磁盘参数表)。磁盘参数表中包含分区总大小、磁盘参数等重要信息。其C语言定义为: typedef struct word SectorBy

26、tes; /每扇区字节数 byte SectorsPerCluster; /每簇扇区数 word ReservedSectors; /保留扇区数 byte NbrFat; /FAT的个数 word RootEntry; /根目录项数 word TotalSectors; /分区总扇区数(分区小于32M时) byte Media; /分区介质标识 word SectorsPerFAT; /每个FAT占的扇区数 word SectorsPerTrack; /每道扇区数 word Heads; /磁头数 dword HiddenSectors; /隐含扇区数 dword BigTotalSector

27、s; /分区总扇区数(分区大于32M时) BPB_FAT16;其中保留扇区数为从分区开始到第一个FAT表开始中间的扇区数。隐含扇区数同分区表中的隐含扇区数含义相同。虽然存在FAT个数的定义,但现在的FAT12/16系统基本上没有除2以外的值。因而一般不考虑其他情况。根目录项数是指根目录总共能容纳下的目录的项数。一个目录项占32个字节,所以一个扇区有512/32=16个目录项。用这个值除以16就是根目录所占的扇区数。分区总扇区数在分区大于32M时已经超过65535,两个字节已经无法表示,因此在大于32M的分区中TotalSector总是等于零,而将实际的数放在BigTotalSectors中。分

28、区介质标识是确定BPB有效的标志。它必须与FAT表中第一个字节的分区介质标识统一。硬盘的分区介质标识为0F8h,如果这个标识不对或者与FAT不统一则将会出Invalid media type的错误。SectorsPerFAT是每个FAT所占的扇区数。系统根据分区起始地址+保留扇区数+每个FAT所占扇区数*FAT个数+根目录项数/16来确定数据区开始的位置,然后由这个位置+簇号*每簇扇区数来最终确定数据在硬盘扇的具体位置。 (2)文件分配表文件分配表是文件在磁盘上分布的信息。FAT文件系统将数据区按每簇扇区数为单位划分成一个一个单元,每个单元是文件分配的最小单位。这个单元就称为簇。一些大的文件可

29、能占用了很多簇,而且在磁盘上没有连续存放。FAT表就是为了确定文件每个簇的连接关系而设的。FAT表的每一项都对应着数据区的一个簇,FAT16的FAT表每一项占16位,也就是两个字节。每一项的内容表示其对应簇的分配情况,0表示尚未分配;FFF0hFFF6h为备用;FFF7h表示坏簇,即该簇中磁盘有损坏;FFF8hFFFF表示文件结束;其他值则表示当前簇的下一簇的簇号。FAT表的最前面两项是不用的,因此第一个数据簇的簇号为2。FAT表第一个字节也是分区介质类型,和BPB中的一样。因此用F8 FF FF可以作为硬盘FAT起始的标志。绝大多数FAT系统有两个FAT表,第二个FAT表又称为后备文件分配表

30、。系统内部完成后备文件分配表与第一文件分配表的统一。本文讨论的完全恢复是基于后备文件分配表没有被破坏的情况下的恢复,如果两个文件分配表都被损坏,理论上就无法完全确定文件信息,因此无法完全恢复。 (3)根目录FAT12/16的根目录是单独列出来的,在后备文件分配表和数据区之间。每个目录项为32个字节,记录一个文件或目录的信息。(长文件名例外)文件修复的原理就是由目录项中指示的起始簇号和数据区开始位置来确定文件的位置,从而恢复小的文件。 4. FAT32文件系统FAT32文件系统与FAT12/16的差别较大,一个主要的差别就是将根目录划归到数据区中了,在BPB中专门加了一项根目录开始簇号。这样根目

31、录的大小就不再受到限制,大大增加了根目录的自由度。FAT32的BPB定义如下:typedef struct word BytesPerSector; /每扇区字节数 byte SectorsPerCluster; /每簇扇区数 word ReservedSectors; /保留扇区数 byte NumberOfFATs; /FAT的个数 word RootEntries; /根目录项数(FAT32不用) word TotalSectors; /分区总扇区数(FAT32不用) byte MediaDescriptor; /分区介质标识 word SectorsPerFAT; /每个FAT占的扇区

32、数(FAT32不用) word SectorsPerTrack; /每道扇区数 word Heads; /磁头数 dword HiddenSectors; /隐含扇区数 dword BigTotalSectors; /分区总扇区数 dword BigSectorsPerFat; /每个FAT占的扇区数 word ExtFlags; /扩展标志 word FS_Version; /文件系统版本 dword RootDirStartClus; /根目录起始簇号 word FSInfoSec; /指向包含BIGFATBOOTFSINFO结构的扇区 word BkUpBootSec; /后备引导区的位

33、置 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将根目录也视作一个目录文件,使用一个

34、簇链(Cluster Chain),RootDirStartClus正是这个链的起始簇号。FAT32有个专门放BIGFATBOOTFSINFO结构的扇区,该结构包含了剩余簇个数,下一个空闲簇号等信息。这个扇区通常紧接着引导扇区。由于与恢复关系不大,本文不做讨论。FAT32将引导扇区和文件系统信息扇区信息存了两份,另一份的位置由BkUpBootSec指出。这样由于偶然发生的损坏就很容易恢复。 5. 扩展BIOS参数块在BPB的后面是Extended BIOS Paramenter Block。EBPB的结构如下:typedef struct /Extended BIOS Paramenter B

35、lock byte PhysicalDriveNumber; /物理硬盘号 byte CurrentHead; /当前磁头 byte ExtBootRecSign; /扩展引导记录标志 dword SerialNumber; /序列号 char VolumeLabel11; /卷标 char FSID8; /文件系统标识 EBPB;其中物理硬盘号和当前磁头是系统运行时使用的,硬盘上的值没有什么实际意义。ExtBootRecSign一般为28h或29h。SerialNumber是格式化后生成的序列号。文件系统标识指示了文件系统的类型,即FAT12、 FAT16、 FAT32。6. 压缩磁盘简介从

36、DOS6.0开始有了压缩磁盘的功能。DBLSPACE、DRVSPACE、DRVSPACE3是各个不同时期的磁盘压缩系统。压缩磁盘其实是个大文件,其内部是个更为复杂的FAT系统。这个大文件包含了文件头、MDFAT(Microsoft Drivespace FAT)、内部BPB、内部FAT、内部根目录及内部数据区,和分区非常相似。主要不同的是,它的FAT不直接对应数据区,而是对应于MDFAT表,每一个MDFAT表项包含扇区起始位置信息和扇区的压缩信息。这样在存取一个文件时需要由目录项确定起始簇,由起始簇表确定MDFAT表项,再由MDFAT得到扇区位置,并由压缩信息决定是否进行压缩解压。根据FAT表

37、来确定下一个簇或者文件结束。但其中的扇区位置等信息都是相对于这个文件的逻辑地址,具体物理地址还要用外部的分区信息和外部FAT表决定。因此对于C盘被压缩后的恢复是非常困难的。 7. ROM、PROM、EPROM、EEPROM、Flash ROM分别指什么? ROM指的是只读存储器,即Read-Only Memory。这是一种线路最简单半导体电路,通过掩模工艺,一次性制造,其中的代码与数据将永久保存(除非坏掉),不能进行修改。这玩意一般在大批量生产时才会被用的,优点是成本低、非常低,但是其风险比较大,在产品设计时,如果调试不彻底,很容易造成几千片的费片,行内话叫掩砸了!PROM指的是可编程只读存储

38、器既Programmable Red-Only Memory。这样的产品只允许写入一次,所以也被称为一次可编程只读存储器(One Time ProgarmmingROM,OTP-ROM)。PROM在出厂时,存储的内容全为1,用户可以根据需要将其中的某些单元写入数据0(部分的PROM在出厂时数据全为0,则用户可以将其中的部分单元写入1),以实现对其编程的目的。PROM的典型产品是双极性熔丝结构,如果我们想改写某些单元,则可以给这些单元通以足够大的电流,并维持一定的时间,原先的熔丝即可熔断,这样就达到了改写某些位的效果。另外一类经典的PROM为使用肖特基二极管的PROM,出厂时,其中的二极管处于反

39、向截止状态,还是用大电流的方法将反相电压加在肖特基二极管,造成其永久性击穿即可。EPROM指的是可擦写可编程只读存储器,即Erasable Programmable Read-Only Memory。它的特点是具有可擦除功能,擦除后即可进行再编程,但是缺点是擦除需要使用紫外线照射一定的时间。这一类芯片特别容易识别,其封装中包含有石英玻璃窗,一个编程后的EPROM芯片的石英玻璃窗一般使用黑色不干胶纸盖住,以防止遭到阳光直射。EEPROM指的是电可擦除可编程只读存储器,即Electrically Erasable Programmable Read-Only Memory。它的最大优点是可直接用电

40、信号擦除,也可用电信号写入。EEPROM不能取代RAM的原应是其工艺复杂,耗费的门电路过多,且重编程时间比较长,同时其有效重编程次数也比较低。 Flash memory指的是闪存,所谓闪存,它也是一种非易失性的内存,属于EEPROM的改进产品。它的最大特点是必须按块(Block)擦除(每个区块的大小不定,不同厂家的产品有不同的规格),而EEPROM则可以一次只擦除一个字节(Byte)。目前闪存被广泛用在PC机的主板上,用来保存BIOS程序,便于进行程序的升级。其另外一大应用领域是用来作为硬盘的替代品,具有抗震、速度快、无噪声、耗电低的优点,但是将其用来取代RAM就显得不合适,因为RAM需要能够

41、按字节改写,而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个

42、扇区。 文件分配表:一般有两个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标记。另一

43、个就是结尾的55 AA标记。用来表示主引导记录是一个有效的记录。其实,无论MBR还是隐含扇区还是BOOT区,都不重要,这些重建都比较容易。对数据恢复来说,能否成功的找回数据文件是重要的。另外,由于FAT表记录了文件在硬盘上占用扇区的链表,如果2个FAT表都完全损坏了。那么恢复文件,特别是占用多个不连续扇区文件就相当困难了。基本思路是: 1、FAT2没有损坏的情况,用FAT2覆盖FAT1。 2、FAT2也已经损坏的情况,我一般是只期待找回其中某些关键的文件了。我们最期待的是这些文件是连续的。如果不连续的话,也并非没有可能,但这往往还要知道文件的一些细节,包括对一些文件本身的连接结构有了解。如果F

44、AT2没有完全破坏,是有一定用处的,另外,一般来说,FAT16的硬盘因为FAT表靠前破坏的比较严重,一般两个FAT表都坏了,小硬盘也很难恢复了。 电子硬盘文件管理 数据逻辑结构根据Flash memory的特点,将文件的管理格式分配如下文件信息区(File Message Area)FMA文件存储链表区(File store Link Area)FLA文件数据区(File Data Area)FDA文件目录区(File Directory Area)可选四个区的关系如下: 文件信息区文件信息区文件数据文件存储链表区文件信息区 文件序号 1 字节 文件名 8 文件扩展名 3 文件时间 3 文件大

45、小 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查找链表块,由链表快查找数据块.链表快为循序存储,你还可以进行链式存储附录资料:不

46、需要的可以自行删除 libxml2应用实例Libxml2 是一个xml的c语言版的解析器,本来是为Gnome项目开发的工具,是一个基于MIT License的免费开源软件。它除了支持c语言版以外,还支持c+、PHP、Pascal、Ruby、Tcl等语言的绑定,能在Windows、Linux、Solaris、MacOsX等平台上运行。功能还是相当强大的,相信满足一般用户需求没有任何问题。二、 Libxml2安装:一般如果在安装系统的时候选中了所有开发库和开发工具的话(Fedora Core系列下),应该不用安装,下面介绍一下手动安装: 1) 从xmlsoft站点或ftp()站点下载libxml压

47、缩包(libxml2-xxxx.tar.gz)2) 对压缩包进行解压缩 tar xvzf libxml2-xxxx.tar.gz3) 进入解压缩后的文件夹中运行 ./configure -prefix /home/user/myxml/xmlinst(此处为待安装的路径)或者直接使用 ./configure make make install 4) 添加路径 export PATH=/home/user/myxml/xmlinst/bin:$PATH 说明:为了结构清晰,最好将libxml2不安装在解压目录中。安装完成后就可以使用简单的代码解析XML文件,包括本地和远程的文件,但是在编码上有一

48、些问题。Libxml默认只支持UTF8的编码,无论输入输出都是UTF-8,所以如果你解析完一个XML得到的结果都是UTF8的,如果需要输出GB2312或者其它编码,需要ICONV来做转码(生成UTF8编码的文件也可以用它做),如果系统中没有安装iconv的话,需要安装libiconv。 1) 下载libiconv压缩包(例如libiconv-1.11.tar.gz) 2) 对压缩包进行解压缩tar xvzf libiconv-1.11.tar.gz 3) 进入解压缩后的文件夹中运行 ./configure make make install三、关于XML:在开始研究 Libxml2 库之前,先

49、了解一下XML的相关基础。XML 是一种基于文本的格式,它可用来创建能够通过各种语言和平台访问的结构化数据。它包括一系列类似 HTML 的标记,并以树型结构来对这些标记进行排列。例如,可参见清单 1 中介绍的简单文档。为了更清楚地显示 XML 的一般概念,下面是一个简化的XML文件。清单 1. 一个简单的 XML 文件 root delete 10清单 1 中的第一行是 XML 声明,它告诉负责处理 XML 的应用程序,即解析器,将要处理的 XML 的版本。大部分的文件使用版本 1.0 编写,但也有少量的版本 1.1 的文件。它还定义了所使用的编码。大部分文件使用 UTF-8,但是,XML 设

50、计用来集成各种语言中的数据,包括那些不使用英语字母的语言。接下来出现的是元素。一个元素以开始标记 开始(如 ),并以结束标记 结束(如 ),其中使用斜线 (/) 来区别于开始标记。元素是 Node 的一种类型。XML 文档对象模型 (DOM) 定义了几种不同的 Nodes 类型,包括:Elements(如 files 或者 age)Attributes(如 units)Text(如 root 或者 10)元素可以具有子节点。例如,age 元素有一个子元素,即文本节点 10。XML 解析器可以利用这种父子结构来遍历文档,甚至修改文档的结构或内容。LibXML2 是这样的解析器中的其中一种,并且文

51、中的示例应用程序正是使用这种结构来实现该目的。对于各种不同的环境,有许多不同的解析器和库。LibXML2 是用于 UNIX 环境的解析器和库中最好的一种,并且经过扩展,它提供了对几种脚本语言的支持,如 Perl 和 Python。四、Libxml2中的数据类型和函数一个函数库中可能有几百种数据类型以及几千个函数,但是记住大师的话,90%的功能都是由30%的内容提供的。对于libxml2,我认为搞懂以下的数据类型和函数就足够了。1)内部字符类型xmlCharxmlChar是Libxml2中的字符类型,库中所有字符、字符串都是基于这个数据类型。事实上它的定义是:xmlstring.htypedef

52、 unsigned char xmlChar;使用unsigned char作为内部字符格式是考虑到它能很好适应UTF-8编码,而UTF-8编码正是libxml2的内部编码,其它格式的编码要转换为这个编码才能在libxml2中使用。还经常可以看到使用xmlChar*作为字符串类型,很多函数会返回一个动态分配内存的xmlChar*变量,使用这样的函数时记得要手动删除内存。2) xmlChar相关函数如同标准c中的char类型一样,xmlChar也有动态内存分配、字符串操作等相关函数。例如xmlMalloc是动态分配内存的函数;xmlFree是配套的释放内存函数;xmlStrcmp是字符串比较函数

53、等等。基本上xmlChar字符串相关函数都在xmlstring.h中定义;而动态内存分配函数在xmlmemory.h中定义。3)xmlChar*与其它类型之间的转换另外要注意,因为总是要在xmlChar*和char*之间进行类型转换,所以定义了一个宏BAD_CAST,其定义如下:xmlstring.h#define BAD_CAST (xmlChar *)原则上来说,unsigned char和char之间进行强制类型转换是没有问题的。4)文档类型xmlDoc、指针xmlDocPtrxmlDoc是一个struct,保存了一个xml的相关信息,例如文件名、文档类型、子节点等等;xmlDocPtr

54、等于xmlDoc*,它搞成这个样子总让人以为是智能指针,其实不是,要手动删除的。xmlNewDoc函数创建一个新的文档指针。xmlParseFile函数以默认方式读入一个UTF-8格式的文档,并返回文档指针。xmlReadFile函数读入一个带有某种编码的xml文档,并返回文档指针;细节见libxml2参考手册。xmlFreeDoc释放文档指针。特别注意,当你调用xmlFreeDoc时,该文档所有包含的节点内存都被释放,所以一般来说不需要手动调用xmlFreeNode或者xmlFreeNodeList来释放动态分配的节点内存,除非你把该节点从文档中移除了。一般来说,一个文档中所有节点都应该动态

55、分配,然后加入文档,最后调用xmlFreeDoc一次释放所有节点申请的动态内存,这也是为什么我们很少看见xmlNodeFree的原因。xmlSaveFile将文档以默认方式存入一个文件。xmlSaveFormatFileEnc可将文档以某种编码/格式存入一个文件中。5)节点类型xmlNode、指针xmlNodePtr节点应该是xml中最重要的元素了,xmlNode代表了xml文档中的一个节点,实现为一个struct,内容很丰富:tree.htypedef struct _xmlNode xmlNode;typedef xmlNode *xmlNodePtr;struct _xmlNode vo

56、id *_private;/* application data */ xmlElementType type; /* type number, must be second ! */ const xmlChar *name; /* the name of the node, or the entity */ struct _xmlNode *children;/* parent-childs link */ struct _xmlNode *last; /* last child link */ struct _xmlNode *parent;/* child-parent link */

57、struct _xmlNode *next; /* next sibling link*/ struct _xmlNode *prev; /* previous sibling link*/ struct _xmlDoc*doc;/* the containing document */ /* End of common part */ xmlNs *ns; /* pointer to the associated namespace */ xmlChar *content; /* the content */ struct _xmlAttr *properties;/* properties

58、 list */ xmlNs *nsDef; /* namespace definitions on this node */ void *psvi;/* for type/PSVI informations */ unsigned short line; /* line number */ unsigned short extra;/* extra data for XPath/XSLT */;可以看到,节点之间是以链表和树两种方式同时组织起来的,next和prev指针可以组成链表,而parent和children可以组织为树。同时还有以下重要元素:节点中的文字内容:content;节点所属

59、文档:doc;节点名字:name;节点的namespace:ns;节点属性列表:properties;Xml文档的操作其根本原理就是在节点之间移动、查询节点的各项信息,并进行增加、删除、修改的操作。xmlDocSetRootElement函数可以将一个节点设置为某个文档的根节点,这是将文档与节点连接起来的重要手段,当有了根结点以后,所有子节点就可以依次连接上根节点,从而组织成为一个xml树。6)节点集合类型xmlNodeSet、指针xmlNodeSetPtr节点集合代表一个由节点组成的变量,节点集合只作为Xpath的查询结果而出现(XPATH的介绍见后面),因此被定义在xpath.h中,其定义

60、如下:/* A node-set (an unordered collection of nodes without duplicates).*/typedef struct _xmlNodeSet xmlNodeSet;typedef xmlNodeSet *xmlNodeSetPtr;struct _xmlNodeSet int nodeNr; /* number of nodes in the set */ int nodeMax; /* size of the array as allocated */ xmlNodePtr *nodeTab;/* array of nodes in

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论