📄 硬盘 fat 文件系统原理的详细分析-数据恢复.htm
字号:
32 个字节以确定的偏移来定义本目录下的一个文件 ( 或文件夹 ) 的属性,实际上是一个简单的二维表。 </P>
<P> 这 32 个字节的各字节偏移定义如表 11 : </P>
<P align=center><IMG height=382
src="硬盘 FAT 文件系统原理的详细分析-数据恢复.files/1705.gif" width=398></P>
<P> 对表 11 中的一些取值进行说明: </P>
<P> (1) 、对于短文件名,系统将文件名分成两部分进行存储,即主文件名 + 扩展名。 0x0~0x7
字节记录文件的主文件名, 0x8~0xA 记录文件的扩展名,取文件名中的 ASCII 码值。不记录主文件名与扩展名之间的
"." 主文件名不足 8 个字符以空白符 (20H) 填充,扩展名不足 3 个字符同样以空白符 (20H) 填充。 0x0
偏移处的取值若为 00H ,表明目录项为空;若为 E5H ,表明目录项曾被使用,但对应的文件或文件夹已被删除。 ( 这也是误删除后恢复的理论依据 )
。文件名中的第一个字符若为 “.” 或 “..” 表示这个簇记录的是一个子目录的目录项。 “.” 代表当前目录; “..” 代表上级目录 (
和我们在 dos 或 windows
中的使用意思是一样的,如果磁盘数据被破坏,就可以通过这两个目录项的具体参数推算磁盘的数据区的起始位置,猜测簇的大小等等,故而是比较重要的 )
</P>
<P> (2) 、 0xB 的属性字段:可以看作系统将 0xB 的一个字节分成 8
位,用其中的一位代表某种属性的有或无。这样,一个字节中的 8 位每位取不同的值就能反映各个属性的不同取值了。如 00000101
就表示这是个文件,属性是只读、系统。 </P>
<P> (3) 、 0xC~0x15 在原 FAT16 的定义中是保留未用的。在高版本的 WINDOWS
系统中有时也用它来记录修改时间和最近访问时间。那样其字段的意义和 FAT32 的定义是相同的,见后边 FAT32 。 </P>
<P> (4) 、 0x16~0x17 中的时间 = 小时 *2048+ 分钟 *32+ 秒 /2
。得出的结果换算成 16 进制填入即可。也就是: 0x16 字节的 0~4 位是以 2 秒为单位的量值; 0x16 字节的 5~7 位和 0x17
字节的 0~2 位是分钟; 0x17 字节的 3~7 位是小时。 </P>
<P> (5) 、 0x18~0x19 中的日期 =( 年份 -1980)*512+ 月份 *32+
日。得出的结果换算成 16 进制填入即可。也就是: 0x18 字节 0~4 位是日期数; 0x18 字节 5~7 位和 0x19 字节 0
位是月份; 0x19 字节的 1~7 位为年号,原定义中 0~119 分别代表 1980~2099 ,目前高版本的 Windows 允许取
0~127 ,即年号最大可以到 2107 年。 </P>
<P> (6) 、 0x1A~0x1B 存放文件或目录的表示文件的首簇号,系统根据掌握的首簇号在 FAT
表中找到入口,然后再跟踪簇链直至簇尾,同时用 0x1C~0x1F 处字节判定有效性。就可以完全无误的读取文件 ( 目录 ) 了。 </P>
<P> (7) 、普通子目录的寻址过程也是通过其父目录中的目录项来指定的,与数据文件 ( 指非目录文件 )
不同的是目录项偏移 0xB 的第 4 位置 1 ,而数据文件为 0 。 </P>
<P> 对于整个 FAT 分区而言,簇的分配并不完全总是分配干净的。如一个数据区为 99 个扇区的 FAT
系统,如果簇的大小设定为 2 扇区,就会有 1
个扇区无法分配给任何一个簇。这就是分区的剩余扇区,位于分区的末尾。有的系统用最后一个剩余扇区备份本分区的 DBR ,这也是一种好的备份方法。
</P>
<P> 早的 FAT16 系统并没有长文件名一说, Windows 操作系统已经完全支持在 FAT16
上的长文件名了。 FAT16 的长文件名与 FAT32 长文件名的定义是相同的,关于长文件名,在 FAT32 部分再详细作解释。 </P>
<P> ★ FAT32 存储原理: </P>
<P> FAT32 是个非常有功劳的文件系统, Microsoft 成功地设计并运用了它,直到今天 NTFS
铺天盖地袭来的时候, FAT32 依然占据着 Microsoft Windows 文件系统中重要的地位。 FAT32 最早是出于
FAT16 不支持大分区、单位簇容量大以致空间急剧浪费等缺点设计的。实际应用中, FAT32 还是成功的。 </P>
<P> FAT32 与 FAT16 的原理基本上是相同的,图 4.3.13 标出了 FAT32 分区的基本构成。
</P>
<P align=center><IMG height=84
src="硬盘 FAT 文件系统原理的详细分析-数据恢复.files/1706.gif" width=500></P>
<P> FAT32 在格式化的过程中就根据分区的特点构建好了它的 DBR ,其中 BPB
参数是很重要的,可以回过头来看一下表 4 和表 5 。首先 FAT32 保留扇区的数目默认为 32 个,而不是 FAT16
的仅仅一个。这样的好处是有助于磁盘 DBR 指令的长度扩展,而且可以为 DBR 扇区留有备份空间。上面我们已经提到,构建在 FAT32 上的
win98 或 win2000 、 winXP ,其操作系统引导代码并非只占一个扇区了。留有多余的保留扇区就可以很好的拓展 OS 引导代码。在
BPB 中也记录了 DBR 扇区的备份扇区编号。备份扇区可以让我们在磁盘遭到意外破坏时恢复 DBR 。 </P>
<P> FAT32 的文件分配表的数据结构依然和 FAT16 相同,所不同的是, FAT32
将记录簇链的二进制位数扩展到了 32 位,故而这种文件系统称为 FAT32 。 32 位二进制位的簇链决定了 FAT 表最大可以寻址 2T
个簇。这样即使簇的大小为 1 扇区,理论上仍然能够寻址 1TB 范围内的分区。但实际中 FAT32
是不能寻址这样大的空间的,随着分区空间大小的增加, FAT 表的记录数会变得臃肿不堪,严重影响系统的性能。所以在实际中通常不格式化超过 32GB 的
FAT32 分区。 WIN2000 及之上的 OS 已经不直接支持对超过 32GB 的分区格式化成 FAT32 ,但 WIN98 依然可以格式化大到
127GB 的 FAT32 分区,但这样没必要也不推荐。同时 FAT32 也有小的限制, FAT32 卷必须至少有 65527
个簇,所以对于小的分区,仍然需要使用 FAT16 或 FAT12 。 </P>
<P>
分区变大时,如果簇很小,文件分配表也随之变大。仍然会有上面的效率问题存在。既要有效地读写大文件,又要最大可能的减少空间的浪费。 FAT32
同样规定了相应的分区空间对应的簇的大小,见表 12 : </P>
<P align=center><IMG height=308
src="硬盘 FAT 文件系统原理的详细分析-数据恢复.files/1707.gif" width=439></P>
<P> FAT32 簇的取值意义和 FAT16 类似,不过是位数长了点罢了,比较见表 13 :
</P>FAT32 的另一项重大改革是根目录的文件化,即将根目录等同于普通的文件。这样根目录便没有了 FAT16 中 512
个目录项的限制,不够用的时候增加簇链,分配空簇即可。而且,根目录的位置也不再硬性地固定了,可以存储在分区内可寻址的任意簇内,不过通常根目录
<P>是最早建立的 ( 格式化就生成了 ) 目录表。所以,我们看到的情况基本上都是根目录首簇占簇区顺序上的第 1 个簇。在图 4.3.12
中也是按这种情况制作的画的。 </P>
<P> FAT32 对簇的编号依然同 FAT16 。顺序上第 1 个簇仍然编号为第 2 簇,通常为根目录所用 (
这和 FAT16 是不同的, FAT16 的根目录并不占簇区空间, 32 个扇区的根目录以后才是簇区第 1 个簇 ) </P>
<P> FAT32 的文件寻址方法与 FAT16 相同,但目录项的各字节参数意义却与 FAT16
有所不同,一方面它启用了 FAT16 中的目录项保留字段,同时又完全支持长文件名了。 </P>
<P> 对于短文件格式的目录项。其参数意义见表 14 : </P>
<P align=center><IMG height=523
src="硬盘 FAT 文件系统原理的详细分析-数据恢复.files/1708.gif" width=398></P>
<P> 说明: </P>
<P> (1) 、这是 FAT32 短文件格式目录项的意义。其中文件名、扩展名、时间、日期的算法和 FAT16
时相同的。 </P>
<P> (2) 、由于 FAT32 可寻址的簇号到了 32 位二进制数。所以系统在记录文件 ( 文件夹 )
开始簇地址的时候也需要 32 位来记录, FAT32 启用目录项偏移 0x12~0x13 来表示起始簇号的高 16 位。 </P>
<P> (3) 、文件长度依然用 4 个字节表示,这说明 FAT32 依然只支持小于 4GB 的文件 ( 目录
) ,超过 4GB 的文件 ( 目录 ), 系统会截断处理。 </P>
<P> FAT32 的一个重要的特点是完全支持长文件名。长文件名依然是记录在目录项中的。为了低版本的 OS
或程序能正确读取长文件名文件,系统自动为所有长文件名文件创建了一个对应的短文件名,使对应数据既可以用长文件名寻址,也可以用短文件名寻址。不支持长文件名的
OS 或程序会忽略它认为不合法的长文件名字段,而支持长文件名的 OS 或程序则会以长文件名为显式项来记录和编辑,并隐藏起短文件名。 </P>
<P> 当创建一个长文件名文件时,系统会自动加上对应的短文件名,其一般有的原则: </P>
<P> (1) 、取长文件名的前 6 个字符加上 "~1" 形成短文件名,扩展名不变。 </P>
<P> (2) 、如果已存在这个文件名,则符号 "~" 后的数字递增,直到 5 。 </P>
<P> (3) 、如果文件名中 "~" 后面的数字达到 5
,则短文件名只使用长文件名的前两个字母。通过数学操纵长文件名的剩余字母生成短文件名的后四个字母,然后加后缀 "~1" 直到最后 (
如果有必要,或是其他数字以避免重复的文件名 ) 。 </P>
<P> (4) 、如果存在老 OS 或程序无法读取的字符,换以 "_" </P>
<P> 长文件名的实现有赖于目录项偏移为 0xB 的属性字节,当此字节的属性为:只读、隐藏、系统、卷标,即其值为
0FH 时, DOS 和 WIN32 会认为其不合法而忽略其存在。这正是长文件名存在的依据。将目录项的 0xB 置为 0F ,其他就任由系统定义了,
Windows9x 或 Windows 2000 、 XP 通常支持不超过 255 个字符的长文件名。系统将长文件名以 13
个字符为单位进行切割,每一组占据一个目录项。所以可能一个文件需要多个目录项,这时长文件名的各个目录项按倒序排列在目录表中,以防与其他文件名混淆。
</P>
<P> 长文件名中的字符采用 unicode 形式编码 ( 一个巨大的进步哦 ) ,每个字符占据 2
字节的空间。其目录项定义如表 15 。 </P>
<P align=center><IMG height=430
src="硬盘 FAT 文件系统原理的详细分析-数据恢复.files/1709.gif" width=405></P>
<P> 系统在存储长文件名时,总是先按倒序填充长文件名目录项,然后紧跟其对应的短文件名。从表 15
可以看出,长文件名中并不存储对应文件的文件开始簇、文件大小、各种时间和日期属性。文件的这些属性还是存放在短文件名目录项中,一个长文件名总是和其相应的短文件名一一对应,短文件名没有了长文件名还可以读,但长文件名如果没有对应的短文件名,不管什么系统都将忽略其存在。所以短文件名是至关重要的。在不支持长文件名的环境中对短文件名中的文件名和扩展名字段作更改
( 包括删除,因为删除是对首字符改写 E5H)
,都会使长文件名形同虚设。长文件名和短文件名之间的联系光靠他们之间的位置关系维系显然远远不够。其实,长文件名的 0xD
字节的校验和起很重要的作用,此校验和是用短文件名的 11
个字符通过一种运算方式来得到的。系统根据相应的算法来确定相应的长文件名和短文件名是否匹配。这个算法不太容易用公式说明,我们用一段 c
程序来加以说明。 </P>
<P> 假设文件名 11 个字符组成字符串 shortname[], 校验和用 chknum
表示。得到过程如下: </P>
<P> int i , j,chknum=0; <BR>
for (i=11; i>0; i--)
<BR> chksum = ((chksum & 1) ? 0x80 : 0) + (chksum >> 1) + shortname[j++];
</P>
<P> 如果通过短文件名计算出来的校验和与长文件名中的 0xD
偏移处数据不相等。系统无论如何都不会将它们配对的。 </P>
<P> 依据长文件名和短文件名对目录项的定义,加上对簇的编号和链接, FAT32 上数据的读取便游刃有余了。
</P>
<P class="zw style1"> </P></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=0 width=778 align=center bgColor=#f8feef
border=0>
<TBODY>
<TR>
<TD>
<DIV align=center>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD width="108%" bgColor=#8dc63f colSpan=6 height=5></TD></TR>
<TR>
<TD colSpan=6 height=3></TD></TR></TBODY></TABLE>泉州天力科技版权所有© 2003-2004 <A
href="http://www.tl800.com/lxwm.html"
target=_blank>联系我们</A><BR>电话:0086-0595-22841608
013305960800<BR>E-mail:cailujin<IMG height=15
src="硬盘 FAT 文件系统原理的详细分析-数据恢复.files/@.gif"
width=10>163.com<BR>WWW.TL800.COM</DIV></TD></TR></TBODY></TABLE>
<SCRIPT src="硬盘 FAT 文件系统原理的详细分析-数据恢复.files/mystat.htm"></SCRIPT>
</BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -