本人写文章,难免有错误的地方请大家谅解,如果有错误请大家指教,现在开始正题,大家都知道FAT文件系统不是什么新鲜的文件系统了,目前用此文件系统的设备很多,比如现在的数码相机、数码摄像机、手机等等设备都以FAT作为它管理文件的一个系统,因为FAT文件系统的结构相对简单,容易理解,FAT文件系统进行了数次的升级,从FAT12进化到FAT16直到FAT的最后版本FAT32(还有一个是exFAT因为和FAT还是略有不同,在此就不多做介绍),今天就以FAT最新的FAT32文件系统作为本将的开始,网上类似讲解FAT文件系统的文章也很多,我就讲解最重要的一些知识,也是我的一些经验,希望能对各位爱好数据恢复的朋友们有所帮助。
 
了解一个文件系统就要从最基础的开始,我们先从FAT32DBRDOS BOOT RECORDDOS引导记录)讲起,DBR分为两部分:DOS引导程序和BPBBIOS参数块)。其中DOS引导程序完成DOS系统文件(IO.SYSMSDOS.SYS)的定位与装载,而BPB用来描述本DOS分区的磁盘信息,如比较重要的参数有“每个扇区的字节数”、“每个簇有多少个扇区”、“保留扇区”、“FAT表数量”、“扇区总数”、“每FAT扇区数”,现在就从上述列出的几个关键的参数做详细的讲述:
 
1、每个扇区的字节数:
 
就是一个扇区共有多少个字节来组成,一般情况都是512个字节为一个扇区,16进制表示为200H
 
2、每个簇有多少个扇区:
 
就是一个簇包含了多少个扇区,他的表示都是2的次方(512字节1248163264扇区),比如8个扇区构成一个簇,它的簇大小就是816进制表示为8H
 
3、保留扇区:
 
就是DBRFAT表之间共有多少个扇区。
 
4FAT表数量:
 
表示该分区上的FAT表共有几个副本,一般情况都为2(注:在重建DBR的情况下可以灵活调配)。
 
5、扇区总数:
 
表示该分区的扇区数量。
 
6、每FAT扇区数:
就是单个FAT表的扇区总数,通过次参数配合上面的参数就能够定位到根目录也就是Root,公式为:保留扇区+FAT表数量*FAT扇区数=根目录的地址。
 
上述就是最为重要的几个BPB参数的解释,下面是DBR的截图,让大家看一下:
 
 
剖析FAT文件系统结构_休闲
 
WinHEX 扇区截图
 
剖析FAT文件系统结构_休闲_02
 
WinHex模板解释出来的BPB参数
 
    在此提供一个WinHex调用的模板,大家可以把----------------------之间的代码复制到一个记事本中,保存为以TPL为扩展名的文件,然后存放到WinHex的目录中即可。
 
 
--------------------------------------------------------------------------
template "FAT32 引导扇区"
 
// Template by Stefan Fleischmann
// X-Ways Software Technology AG
 
// 适用于 FAT32 格式逻辑驱动器的 0 扇区。
 
description "BIOS 参数块 (BPB) 和其它"
applies_to disk
sector-aligned
 
requires 0x02  "90"
requires 0x52  "46 41 54 33 32" // ="FAT32" 在偏移地址 52
requires 0x1FE "55 AA"
 
begin
       read-only hex 3 "JMP 指令"
       char[8]    "OEM"
 
       section    "BIOS 参数块"
       uint16     "字节 / 扇区"
       uint8              "扇区 / "
       uint16     "保留扇区"
       uint8              "FAT 计数"
       uint16     "根项目 (未使用)"
       uint16     "扇区 (小容量)"
       hex 1             "媒介描述 (16 进制)"
       uint16     "扇区 / FAT (小容量)"
       uint16     "扇区 / 磁轨"
       uint16     ""
       uint32     "隐藏扇区"
       uint32     "扇区 (大容量)"
      
       section    "FAT32 扇区"
       uint32     "扇区 / FAT"
       uint16     "延迟"
       uint16     "版本"
       uint32     "根目录第 1 "
       uint16     "FSInfo 扇区"
       uint16     "备份引导扇区"
       read-only hex 12 "(保留)"
       endsection
      
       hex 1             "BIOS 驱动 (16 进制, HD=8x)"
       read-only uint8 (未使用)
       hex 1             "扩展启动特征 (29h)"
       uint32     "卷序列号 (10 进制)"
       move -4
       hex 4             "卷序列号 (16 进制)"
       char[11] "卷标签"
       char[8]    "文件系统"
       endsection
 
       goto        0x1FE
       read-only hex 2 "特征 (55 AA)"
end
 
--------------------------------------------------------------------------
 
至此上述所说的就是BPB参数极为重要的参数,下面讲述一下FAT表的作用。
 
了解FAT表之前我们先了解一下如何定位到FAT表,我们如何才能知道FAT的具体位置呢,上面已经讲到FAT表的位置就在“保留扇区”中记录,他里面记录了FAT1表的位置;为什么要有FAT表呢,有两大用途,我分别做阐述:
 
用途一:
 
我们在使用文件系统的过程中,会有“建立”、“删除”、“移动”等动作,就会造成文件系统中有大量的不连续的簇的产生,如果存储文件的时候文件系统只把文件存储到连续的簇中就会造成非常之严重的空间浪费,所以FAT表的产生的原因之一简单的说就是把那些不连续的簇在存储文件的时候通过FAT表项的指针做指引来把不同地方的空间给它“集合”起来,在读取文件的时候通过这个链表(FAT表的指向)就很轻松的把文件读取出来了。
 
通途二:
 
如果对NTFS有一定了解的网友们就会知道,NTFS里面有一个元文件名为“$Bitmap”他就是记录整个文件系统的空间使用情况的,在FAT文件系统中FAT表也就充当了空间利用率的作用。
 
在来说一下FAT表内的特征,FAT32文件系统中的FAT表是4个字节描述一个簇,也就是一个32位的指针。他的特征一般为:“F8 FF FF 0F FF FF FF FF”第一个字节F8是同BPB参数中的“媒介描述符”而定,他们是一样的,在修复文件系统的时候上面的特征作为辅助判断,请文友朋友们自由发挥。
 
下面讲述一下FAT32文件系统中的根目录,相比FAT32文件系统之前的版本的FAT文件系统来说FAT32文件系统在根目录的设计上的确优于它的前身(FAT12 & FAT16),不知道大家注意到没有,在使用FAT32之前的FAT的版本文件系统的时候会遇到这样的问题,就是在根目录存储过多的文件的时候提示“无法创建文件夹”等消息提示,如图:
 
剖析FAT文件系统结构_职场_03
 
此时我们看磁盘属性的剩余空间还是有很多的,如图:
 
剖析FAT文件系统结构_剖析FAT文件系统结构_04
 
可用空间还有247MB,为什么存不下了呢,答案因为FAT32之前的版本的根目录没有在数据区中,而是在格式化的时候就跟定死了,所以导致有剩余空间但是在根目录建立过多的文件或者文件夹的时候报错,如果以8.3标准命名的文件夹或者文件在存储到根目录的时候可以存放共有512个目录项,如果在格式化的时候输入了分区的卷标,那就存放不了512个目录项了,可存放的目录项就是511个,如果在已经存有512个目录项的文件系统上想添加分区的卷标就不行了,因为卷标也是占用目录项的位置的,还有一种可能就是在根目录如果超过8.3命名规则,那么存放在根目录的目录项就更少了,因为有长名的存在,而FAT32是把根目录移植到了数据区中,就好比管理一个文件一样去管理根目录,这样就解决了根目录不能存放太多文件的限制了,因为通过FAT表的指向,开辟一个新的空间存放其余的根目录项。
 
剖析FAT文件系统结构_剖析FAT文件系统结构_05
 
目录项模板截图
 
在此提供一个WinHex调用的模板,大家可以把----------------------之间的代码复制到一个记事本中,保存为以TPL为扩展名的文件,然后存放到WinHex的目录中即可。
 
--------------------------------------------------------------------------
template "FAT Directory Entry"
 
// Template by Stefan Fleischmann
// X-Ways Software Technology AG
 
// To be applied to a sector of a FAT16 or FAT32 drive
// that contains a directory. Not suitable for LFN
// (long filename) directory entries.
 
description "Normal/short entry format"
applies_to disk
multiple
 
begin
       char[8]    "Filename (blank-padded)"
       char[3]    "Extension (blank-padded)"
       hex 1             "0F = LFN entry"
       move             -1
       binary     "Attributes ( - -a-dir-vol-s-h-r)"
       goto        0
       hex 1             "00 = Never used, E5 = Erased"
       move             11
       read-only byte "(reserved)"
       move             1
       DOSDateTime       "Creation date & time"
       move             -5
       byte        "Cr. time refinement in 10-ms units"
       move             2
       DOSDateTime       "Access date (no time!)"
       move             2
       DOSDateTime       "Update date & time"
       move             -6
       uint16     "(FAT 32) High word of cluster #"
       move             4
       uint16     "16-bit cluster #"
       uint32     "File size (zero for a directory)"
end
--------------------------------------------------------------------------
 
至此大概的FAT32文件系统结构就先告一段落,说明一下,如果想了解DBRFAT表项、目录项的其它字节的含义请参照相关数据恢复的书籍,因为之前我已经说过我就是把我的一些经验讲出来,如果不明白大家可以一起探讨,最后我再说一下如何创建FAT32文件系统的结构(就是格式化Format),在此我就提供一个非常重要的一个公式,是我自己着么出来的如何计算单个FAT表大小的一个公式,在做格式化FAT32文件系统的软件的时候很有用公式如下:
 
单个FAT表大小=(((分区大小÷每扇区字节数-保留扇区)÷簇大小-2)×4÷每扇区字节数)-((分区大小÷每扇区字节数)%簇大小)
 
建立完毕结构以后,剩余的使用与管理工作就交给管理文件系统的操作系统来完成了,至此我的讲解到此结束,最后发布一个我做的格式化脚本的录像。
 
联系电话:+0086-158-4651-2151
QQ:104505021 (Windows Hao)
联系人:郝槟楠