⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 硬盘 fat 文件系统原理的详细分析-数据恢复.htm

📁 FAT文件系统
💻 HTM
📖 第 1 页 / 共 4 页
字号:
      扇区。当 FAT32 分区 DBR 扇区被破坏导致分区无法访问时。可以用第 6 扇区的原备份替换第 0 扇区来找回数据。 </P>
      <P>&nbsp;&nbsp;&nbsp; 4.3&nbsp;&nbsp;FAT 表和数据的存储原则 </P>
      <P>&nbsp;&nbsp;&nbsp; FAT 表 (File&nbsp;Allocation&nbsp;Table&nbsp; 文件分配表 ) 
      ,是 Microsoft 在 FAT 文件系统中用于磁盘数据 ( 文件 ) 索引和定位引进的一种链式结构。假如把磁盘比作一本书, FAT 
      表可以认为相当于书中的目录,而文件就是各个章节的内容。但 FAT 表的表示方法却与目录有很大的不同。 </P>
      <P>&nbsp;&nbsp;&nbsp; 在 FAT 文件系统中,文件的存储依照 FAT 表制定的簇链式数据结构来进行。同时, FAT 
      文件系统将组织数据时使用的目录也抽象为文件,以简化对数据的管理。 </P>
      <P>&nbsp;&nbsp;&nbsp; ★ 存储过程假想: </P>
      <P>&nbsp;&nbsp;&nbsp; 我们模拟对一个分区存储数据的过程来说明 FAT 文件系统中数据的存储原则。 </P>
      <P>&nbsp;&nbsp;&nbsp; 假定现在有一个空的完全没有存放数据的磁盘,大小为 100KB 
      ,我们将其想象为线形的空间地址。为了存储管理上的便利,我们人为的将这 100KB 的空间均分成 100 份,每份 1KB 
      。我们来依次存储这样几个文件: A.TXT( 大小 10KB),B.TXT( 大小 53.6KB) , C.TXT( 大小 20.5KB) 。 
      </P>
      <P>&nbsp;&nbsp;&nbsp; 最起码能够想到,我们可以顺序的在这 100KB 空间中存放这 3 
      个文件。同时不要忘了,我们还要记下他们的大小和开始的位置,这样下次要用时才能找的到,这就像是目录。为了便于查找,我们假定用第 1K 
      的空间来存储他们的特征 ( 属性 ) 。还有,我们设计的存储单位是 1KB ,所以, A.TXT 我们需要 10 个存储单位 ( 
      为了说明方便,我们把存储单位叫做 “ 簇 ” 吧。也能少打点字,呵呵。 ) , B.TXT 需要 54 个簇, C.TXT 需要 21 
      个簇。可能有人会说 B.TXT 和 C.TXT 不是各自浪费了不到 1 
      簇的空间吗?干嘛不让他们紧挨着,不是省地方吗?我的回答是,如果按照这样的方式存储,目录中原本只需要记下簇号,现在还需要记下簇内的偏移,这样会增加目录的存储量,而且存取没有了规则,读取也不太方便,是得不偿失的。 
      </P>
      <P>&nbsp;&nbsp;&nbsp; 根据上面所说的思想,我们设计了这样的图 4.3.1 所示的存储方式。 </P>
      <P><IMG height=58 src="硬盘 FAT 文件系统原理的详细分析-数据恢复.files/1696.gif" 
      width=500></P>
      <P>&nbsp;&nbsp;&nbsp; 
      我们再考虑如何来写这三个文件的目录。对于每个文件而言,一定要记录的有:文件名,开始簇,大小,创建日期、时间,修改日期、时间,文件的读写属性等。这里大小能不能用结束簇来计算呢?一定不能,因为文件的大小不一定就是整数个簇的大小,否则的话像 
      B.TXT 的内容就是 54KB 
      的内容了,少了固然不行,可多了也是不行的。那么我们怎么记录呢?可以想象一下。为了管理上的方便,我们用数据库的管理方式来管理我们的目录。于是我把 
      1KB 再分成 10 份,假定开始簇号为 0 ,定义每份 100B 的各个位置的代表含义如图 4.3.2 </P>
      <P align=center><IMG height=229 
      src="硬盘 FAT 文件系统原理的详细分析-数据恢复.files/1697.gif" width=500></P>
      <P>&nbsp;&nbsp;&nbsp; 这样设计的结构绝对可以对文件进行正确的读写了。接着让我们设计的文件系统工作吧。先改动个文件,比如 
      A.TXT ,增加点内容吧!咦?增加后往哪里放呀,虽然存储块的后面有很多空间,但紧随其后 B.TXT 的数据还顶着呢?要是把 A.TXT 
      移到后边太浪费处理资源,而且也不一定解决问题。这个问题看来暂时解决不了。 </P>
      <P>&nbsp;&nbsp;&nbsp; 那我们换个操作,把 B.txt 删了, b.txt 的空间随之释放。这时候空间如图 4.3.3 
      ,目录如图 4.3.4 </P>
      <P><IMG height=315 src="硬盘 FAT 文件系统原理的详细分析-数据恢复.files/1698.gif" 
      width=500></P>
      <P>&nbsp;&nbsp;&nbsp; 这个操作看来还可以,我们接着做,在存入一个文件 D.txt( 大小为 60.3KB), 总共 100 
      簇的空间只用了 31 簇,还有 68 簇剩余,按说能放下。可是?往那里放呢?没有 61 
      个连续的空间了,目录行没办法写了,看来无连续块存储暂时也不行。 </P>
      <P>&nbsp;&nbsp;&nbsp; 
      你一定能够想到我们可以在连续空间不够或增加文件长度的时候转移影响我们操作的其他文件,从而腾出空间来,但我要问你,那不是成天啥也不要干了,就是倒腾东西了吗? 
      </P>
      <P>&nbsp;&nbsp;&nbsp; 看来我们设计的文件系统有致命的漏洞,怎么解决呢?其实可以这样解决: </P>
      <P>&nbsp;&nbsp;&nbsp; 
      首先我们允许文件的不连续存储。目录中依然只记录开始簇和文件的大小。那么我们怎么记录文件占用那些簇呢,以文件映射簇不太方便,因为文件名是不固定的。我们换个思想,可以用簇来映射文件,在整个存储空间的前部留下几簇来记录数据区中数据与簇号的关系。对于上例因为总空间也不大,所以用前部的 
      1Kb 的空间来记录这种对应,假设 3 个文件都存储,空间分配如图 4.3.5 ,同时修改一下目录,如图 4.3.6 </P>
      <P><IMG height=295 src="硬盘 FAT 文件系统原理的详细分析-数据恢复.files/1699.gif" 
      width=500></P>
      <P>&nbsp;&nbsp;&nbsp; 
      第一簇用来记录数据区中每一簇的被占用情况,暂时称其为文件分配表。结合文件分配表和文件目录就可以达到完全的文件读取了。我们想到,把文件分配表做成一个数据表,以图 
      4.3.7 的形式记录簇与数据的对应。 </P>
      <P>&nbsp;&nbsp;&nbsp; 用图 4.3.7 
      的组织方式是完全可以实现对文件占有簇的记录的。但还不够效率。比如文件名在文件分配表中记录太多,浪费空间,而实际上在目录中已经记录了文件的开始簇了。所以可以改良一下,用链的方式来存放占有簇的关系,变成图 
      4.3.8 的组织方式。 </P>
      <P align=center><IMG height=220 
      src="硬盘 FAT 文件系统原理的详细分析-数据恢复.files/1700.gif" width=500></P>
      <P>&nbsp;&nbsp;&nbsp; 参照图 4.3.8 来理解一下文件分配表的意义。如文件 a.txt 我们根据目录项中指定的 a.txt 
      的首簇为 2 ,然后找到文件分配表的第 2 簇记录,上面登记的是 3 ,我们就能确定下一簇是 3 。找到文件分配表的第 3 簇记录,上面登记的是 4 
      ,我们就能确定下一簇是 4...... 直到指到第 11 簇,发现下一个指向是 FF ,就是结束。文件便丝毫无误读取完毕。 </P>
      <P>&nbsp;&nbsp;&nbsp; 我们再看上面提到的第三种情况,就是将 b.txt 删除以后,存入一个大小为 60.3KB 的 d.txt 
      。利用簇链可以很容易的实现。实现后的磁盘如图 4.3.9&nbsp;&nbsp;4.3.10&nbsp;&nbsp;4.3.11 </P>
      <P> </P>
      <P><IMG height=412 src="硬盘 FAT 文件系统原理的详细分析-数据恢复.files/1701.gif" 
      width=500></P>
      <P>&nbsp;&nbsp;&nbsp; 上面是我们对文件存储的一种假设,也该揭开谜底的时候了。上面的思想其实就是 fat 文件系统的思想的精髓 
      ( 但并不是,尤其像具体的参数的意义与我们所举的例子是完全不同的。请忘掉上边细节,努力记忆下边 ) 。 </P>
      <P>&nbsp;&nbsp;&nbsp; ★ FAT16 存储原理 : &nbsp;&nbsp; </P>
      <P>&nbsp;&nbsp;&nbsp; 当把一部分磁盘空间格式化为 fat 文件系统时, fat 
      文件系统就将这个分区当成整块可分配的区域进行规划,以便于数据的存储。一般来讲,其划分形式如图 7 所示。我们把 FAT16 
      部分提取出来,详细描述一下: </P>
      <P>&nbsp;&nbsp;&nbsp; FAT16 是 Microsoft 
      较早推出的文件系统,具有高度兼容性,目前仍然广泛应用于个人电脑尤其是移动存储设备中, FAT16 简单来讲由图 4.3.12 所示的 6 部分组成 
      ( 主要是前 5 部分 ) 。引导扇区 (DBR) 我们已经说过 ,FAT16 在 DBR 之后没有留有任何保留扇区,其后紧随的便是 FAT 表。 
      FAT 表是 FAT16 用来记录磁盘数据区簇链结构的。像前面我们说过的例子一样, FAT 
      将磁盘空间按一定数目的扇区为单位进行划分,这样的单位称为簇。通常情况下,每扇区 512 字节的原则是不变的。簇的大小一般是 2n&nbsp;(n 
      为整数 ) 个扇区的大小,像 512B,1K,2K,4K,8K,16K,32K , 64K 。实际中通常不超过 32K 。 &nbsp; 
      之所以簇为单位而不以扇区为单位进行磁盘的分配,是因为当分区容量较大时,采用大小为 512b 的扇区管理会增加 fat 
      表的项数,对大文件存取增加消耗,文件系统效率不高。分区的大小和簇的取值是有关系的,见表 9&nbsp;&nbsp; </P>
      <P><IMG height=248 src="硬盘 FAT 文件系统原理的详细分析-数据恢复.files/1702.gif" 
      width=500></P>
      <P>&nbsp;&nbsp;&nbsp; 注意:少于 32680 个扇区的分区中,簇空间大小可最多达到每个簇 8 
      个扇区。不管用户是使用磁盘管理器来格式化分区,还是使用命令提示行键入 format 命令格式化,格式化程序都创建一个 12 位的 FAT 。少于 
      16MB 的分区,系统通常会将其格式化成 12 位的 FAT , FAT12 是 FAT 的初始实现形式,是针对小型介质的。 FAT12 
      文件分配表要比 FAT16 和 FAT32 的文件分配表小,因为它对每个条目使用的空间较少。这就给数据留下较多的空间。所有用 FAT12 格式化的 
      5.25 英寸软盘以及 1.44MB 的 3.5 英寸软盘都是由 FAT12 格式化的。除了 FAT 表中记录每簇链结的二进制位数与 FAT16 
      不同外,其余原理与 FAT16 均相同,不再单独解释。 </P>
      <P>&nbsp;&nbsp;&nbsp; 格式化 FAT16 
      分区时,格式化程序根据分区的大小确定簇的大小,然后根据保留扇区的数目、根目录的扇区数目、数据区可分的簇数与 FAT 表本身所占空间 &nbsp; 
      来确定 FAT 表所需的扇区数目,然后将计算后的结果写入 DBR 的相关位置。 </P>
      <P>&nbsp;&nbsp;&nbsp; FAT16&nbsp;DBR 参数的偏移 0x11 处记录了根目录所占扇区的数目。偏移 0x16 记录了 
      FAT 表所占扇区的数据。偏移 0x10 记录了 FAT 表的副本数目。系统在得到这几项参数以后,就可以确定数据区的开始扇区偏移了。 </P>
      <P>&nbsp;&nbsp;&nbsp; FAT16 文件系统从根目录所占的 32 
      个扇区之后的第一个扇区开始以簇为单位进行数据的处理,这之前仍以扇区为单位。对于根目录之后的第一个簇,系统并不编号为第 0 簇或第 1 簇 
      &nbsp;( 可能是留作关键字的原因吧 ) ,而是编号为第 2 簇,也就是说数据区顺序上的第 1 个簇也是编号上的第 2 簇。 </P>
      <P>&nbsp;&nbsp;&nbsp; FAT 文件系统之所以有 12 , 16 , 32 不同的版本之分,其根本在于 FAT 
      表用来记录任意一簇链接的二进制位数。以 FAT16 为例,每一簇在 FAT 表中占据 2 字节 ( 二进制 16 位 ) 。所以, FAT16 
      最大可以表示的簇号为 0xFFFF( 十进制的 65535) ,以 32K 为簇的大小的话, FAT32 可以管理的最大磁盘空间为: 
      32KB×65535=2048MB, 这就是为什么 FAT16 不支持超过 2GB 分区的原因。 </P>
      <P>&nbsp;&nbsp;&nbsp; FAT 表实际上是一个数据表,以 2 个字节为单位,我们暂将这个单位称为 FAT 记录项,通常情况其第 
      1 、 2 个记录项 ( 前 4 个字节 ) 用作介质描述。从第三个记录项开始记录除根目录外的其他文件及文件夹的簇链情况。根据簇的表现情况 FAT 
      用相应的取值来描述,见表 10 </P>
      <P align=center><IMG height=151 
      src="硬盘 FAT 文件系统原理的详细分析-数据恢复.files/1703.gif" width=303><IMG height=32 
      src="" width=32></P>
      <P>&nbsp;&nbsp;&nbsp; 看一幅在 winhex 所截 FAT16 的文件分配表,图 10 : </P>
      <P align=center> </P>
      <P align=center><IMG height=395 
      src="硬盘 FAT 文件系统原理的详细分析-数据恢复.files/1704.gif" width=500></P>
      <P>&nbsp;&nbsp;&nbsp; 如图, FAT 表以 "F8&nbsp;FF&nbsp;FF&nbsp;FF"&nbsp; 开头,此 2 
      字节为介质描述单元,并不参与 FAT 表簇链关系。小红字标出的是 FAT 扇区每 2 字节对应的簇号。 </P>
      <P>&nbsp;&nbsp;&nbsp; 相对偏移 0x4~0x5 偏移为第 2 簇 ( 顺序上第 1 簇 ) ,此处为 FF, 表示存储在第 2 
      簇上的文件 ( 目录 ) 是个小文件,只占用 1 个簇便结束了。 </P>
      <P>&nbsp;&nbsp;&nbsp; 第 3 簇中存放的数据是 0x0005 ,这是一个文件或文件夹的首簇。其内容为第 5 
      簇,就是说接下来的簇位于第 5 簇 ?D?D 〉 &nbsp;FAT 表指引我们到达 FAT 表的第 5 簇指向,上面写的数据是 
      "FF&nbsp;FF", 意即此文件已至尾簇。 </P>
      <P>&nbsp;&nbsp;&nbsp; 第 4 簇中存放的数据是 0x0006 ,这又是一个文件或文件夹的首簇。其内容为第 6 
      簇,就是说接下来的簇位于第 6 簇 ?D?D 〉 FAT 表指引我们到达 FAT 表的第 6 簇指向,上面写的数据是 0x0007 
      ,就是说接下来的簇位于第 7 簇 ?D?D 〉 FAT 表指引我们到达 FAT 表的第 7 簇指向 …… 直到根据 FAT 链读取到扇区相对偏移 
      0x1A~0x1B ,也就是第 13 簇,上面写的数据是 0x000E ,也就是指向第 14 簇 ?D?D 〉 14 簇的内容为 
      "FF&nbsp;FF" ,意即此文件已至尾簇。 </P>
      <P>&nbsp;&nbsp;&nbsp; 后面的 FAT 表数据与上面的道理相同。不再分析。 </P>
      <P>&nbsp;&nbsp;&nbsp; FAT 表记录了磁盘数据文件的存储链表,对于数据的读取而言是极其重要的,以至于 Microsoft 
      为其开发的 FAT 文件系统中的 FAT 表创建了一份备份,就是我们看到的 FAT2 。 FAT2 与 FAT1 
      的内容通常是即时同步的,也就是说如果通过正常的系统读写对 FAT1 做了更改,那么 FAT2 
      也同样被更新。如果从这个角度来看,系统的这个功能在数据恢复时是个天灾。 </P>
      <P>&nbsp;&nbsp;&nbsp; FAT 文件系统的目录结构其实是一颗有向的从根到叶的树,这里提到的有向是指对于 FAT 分区内的任一文件 
      ( 包括文件夹 ) ,均需从根目录寻址来找到。可以这样认为:目录存储结构的入口就是根目录。 </P>
      <P>&nbsp;&nbsp;&nbsp; FAT 文件系统根据根目录来寻址其他文件 ( 包括文件夹 ) 
      ,故而根目录的位置必须在磁盘存取数据之前得以确定。 FAT 文件系统就是根据分区的相关 DBR 参数与 DBR 中存放的已经计算好的 FAT 表 
      (2 份 ) 的大小来确定的。格式化以后,跟目录的大小和位置其实都已经确定下来了:位置紧随 FAT2 之后,大小通常为 32 
      个扇区。根目录之后便是数据区第 2 簇。 </P>
      <P>&nbsp;&nbsp;&nbsp; FAT 文件系统的一个重要思想是把目录 ( 文件夹 ) 当作一个特殊的文件来处理, FAT32 
      甚至将根目录当作文件处理 ( 旁: NTFS 将分区参数、安全权限等好多东西抽象为文件更是这个思想的升华 ) ,在 FAT16 
      中,虽然根目录地位并不等同于普通的文件或者说是目录,但其组织形式和普通的目录 ( 文件夹 ) 并没有不同。 FAT 分区中所有的文件夹 ( 目录 ) 
      文件,实际上可以看作是一个存放其他文件 ( 文件夹 ) 入口参数的数据表。所以目录的占用空间的大小并不等同于其下所有数据的大小,但也不等同于 0 
      。通常是占很小的空间的,可以看作目录文件是一个简单的二维表文件。其具体存储原理是: </P>
      <P>&nbsp;&nbsp;&nbsp; 不管目录文件所占空间为多少簇,一簇为多少字节。系统都会以 32 个字节为单位进行目录文件所占簇的分配。这 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -