【一、FAT概述】
FAT(File Allocation Table)是一种由微软发明并拥有部分专利的文件系统,供MS-DOS使用,也是所有非NT核心的微软窗口使用的文件系统。FAT是“文件分配表”的意思,顾名思义,就是用来记录文件所在位置的表格,它对于硬盘的使用是非常重要的,假若丢失文件分配表,那么硬盘上的数据就会因无法定位而不能使用了。
FAT文件系统考虑当时电脑性能有限,所以未被复杂化,因此几乎所有个人电脑的操作系统都支持。其中我们接触最多的是FAT16、FAT32文件系统。
FAT有一个严重的缺点:当文件删除后写入新数据,FAT不会将文件整理成完整片段再写入,长期使用后会使文件数据变得逐渐分散,而减慢了读写速度。碎片整理是一种解决方法,但必须经常重组来保持FAT文件系统的效率。
【二、FAT16与FAT32介绍】
FAT16使用了16位的空间来表示每个扇区(Sector)配置文件的情形,故称之为FAT16;FAT32同理。
FAT16由于受到先天的限制,因此每超过一定容量的分区之后,它所使用的簇(Cluster)大小就必须扩增,以适应更大的磁盘空间。所谓簇就是磁盘空间的配置单位,就像图书馆内一格一格的书架一样。每个要存到磁盘的文件都必须配置足够数量的簇,才能存放到磁盘中。FAT16各分区与簇大小的关系如下表:
| 分区大小 | FAT16簇大小 |
| 16MB-127MB | 2KB |
| 127MB-255MB | 4KB |
| 256MB-511MB | 8KB |
| 512MB-1023MB | 16KB |
| 1024MB-2047MB | 32KB |
FAT32文件系统使用了32bit宽的簇地址,所以称为FAT32。但是值得注意的一点是,在微软件的文件系统中只使用了低28位,最大容量为2^28*1024*32,约8.7TB的空量。FAT32各分区与簇大小的关系如下表:
| 分区大小 | FAT32簇大小 |
| 32MB-259MB | 512B |
| 260MB-8GB | 4KB |
| 8GB-16GB | 8KB |
| 16GB-32GB | 16KB |
| 32GB以上 | 32KB |
同FAT16相比,FAT32主要具有以下特点:
1. FAT32最大的优点是可以支持的磁盘大小达到2TB(2048GB),但是不能支持小于512MB的分区。
2. 由于采用了更小的簇,FAT32文件系统可以更有效率地保存信息。如两个分区大小都为2GB,一个分区采用了FAT16文件系统,另一个分区采用了FAT32文件系统。采用FAT16的分区的簇大小为32KB,而FAT32分区的簇只有4KB的大小。这样FAT32就比FAT16的存储效率要高很多。
有一点需要注意的是,FAT32 将记录簇链的二进制位数扩展到了32 位,32 位二进制位的簇链决定了FAT表最大可以寻址2T个簇。这样即使簇的大小为1 扇区,理论上仍然能够寻址1TB范围内的分区。但实际中FAT32 是不能寻址这样大的空间的,随着分区空间大小的增加,FAT表的记录数会变得 臃肿不堪,严重影响系统的性能。所以在实际中通常不格式化超过32GB的FAT32 分区。WIN2000及之上的OS已经不直接支持对超过32GB的分区格式化成FAT32。
【三、FAT文件系统结构】
| 主引导区 | 文件 分配表#1 |
文件 分配表#2 |
根目录 | 其他所有数据... 剩下磁盘空间 |
一个FAT文件系统包括四个不同的部分。
- 保留扇区,位于最开始的位置。第一个保留扇区是引导区(分区启动记录)。它包括一个称为基本输入输出参数块的区域(包括一些基本的文件系统信息尤其是它的类型和其它指向其它扇区的指针),通常包括操作系统的启动调用代码。保留扇区的总数记录在引导扇区中的一个参数中。引导扇区中的重要信息可以被DOS和OS/2中称为驱动器参数块的操作系统结构访问。
- FAT区域。它包含有两份文件分配表,这是出于系统冗余考虑,尽管它很少使用,即使是磁盘修复工具也很少使用它。它是分区信息的映射表,指示簇是如何存储的。
- 根目录区域。它是在根目录中存储文件和目录信息的目录表。在FAT32下它可以存在分区中的任何位置,但是在早期的版本中它永远紧随FAT区域之后。
- 数据区域。这是实际的文件和目录数据存储的区域,它占据了分区的绝大部分。通过简单地在FAT中添加文件链接的个数可以任意增加文件大小和子目录个数(只要有空簇存在)。然而需要注意的是每个簇只能被一个文件占有,这样的话如果在32KB大小的簇中有一个1KB大小的文件,那么31KB的空间就浪费掉了。
【四、文件系统引导原理】
4.1 MBR(master boot record)扇区:
说,电脑启动分几步:
(1) 按下计算机power键以后,开始执行主板bios程序。
(2) 进行完一系列检测和配置以后, 开始按bios中设定的系统引导顺序引导系统。
(3)假定现在是硬盘,Bios执行完自己的程序后把执行权交给硬盘。
(4) 交给硬盘后执行存储硬盘上的系统程序。
这里问:Bios执行完自己的程序后如何把执行权交给硬盘呢?交给硬盘后又执行存储在哪里的程序呢?
其实,称为mbr的一段代码起着举足轻重的作用。MBR(master boot record), 即主引导记录,有时也称主引导扇区。位于整个硬盘的0柱面0磁头1扇区(可以看作是硬盘的第一个扇区),bios在执行自己固有的程序以后就会jump到mbr中的第一条指令。将系统的控制权交由mbr来执行。
在总共512byte的主引导记录中,
a, MBR的引导程序占了其中的前446 个字节(0x0h~0x1BDH),
b, 随后的64个字节(0x1BEH~0x1FDH)为DPT(Disk PartitionTable,硬盘分区表),
c, 最后的两个字节“55 AA”(0x1FEH~0x1FFH)是分区有效结束标志。
MBR不随操作系统的不同而不同,意即不同的操作系统可能会存在相同的MBR,即使不同,MBR也不会夹带操作系统的性质,具有公共引导的特性。
我们来欣赏一段mbr。下面是用winhex查看的一块SanDisk U盘的mbr(手边现在没有SSD了,拿U盘来顶一下)。
你的硬盘的MBR 引导代码可能并非这样。不过即使不同,所执行的功能大体是一样的。
我们看DPT 部分。操作系统为了便于用户对磁盘的管理。加入了磁盘分区的概念。即将一块磁盘逻辑划分为几块。
在DPT 共64 个字节中,以16个字节为分区表项单位描述一个分区的属性。也就是说,第一个分区表项描述一个分区的属性,一般为基本分区。第二个分区表项描述除基本分区外的其余空间,一般而言,就是我们所说的扩展分区。
因为这块U盘只有一个分区,所以我们只在上图中DPT的前16个字节看到有效数据。这里面有两个比较关键的数据,
(1) 0x01C6-0x01C9(DWORD): 0x148F00代表相对扇区数(Relative Sectors) 从该磁盘的开始到该分区的开始的位移量,以扇区来计算。
(2) 0x01CA-0x01CD(DWORD): 0x037FEC24代表总扇区数(Total Sectors) 该分区中的扇区总数。通过这个参数可以计算分区的容量。
也可以在Winhex里面直接查看:

4.2 扩展分区
扩展分区中的每个逻辑驱动器都存在一个类似于MBR的扩展引导记录( Extended Boot Record, EBR),也有人称之为虚拟mbr或扩展mbr,意思是一样的。扩展引导记录包括一个扩展分区表和该扇区的标签。扩展引导记录将记录只包含扩展分区中每个逻辑驱动器的第一个柱面的第一面的信息。一个逻辑驱动器中的引导扇区一般位于相对扇区32 或63。但是,如果磁盘上没有扩展分区,那么就不会有扩展引导记录和逻辑驱动器。
通过一幅4分区的磁盘结构图可以看到磁盘的大致组织形式。

【五、FAT分区原理】
从前面的磁盘结构图可以看到基本分区有两部分组成:引导扇区+数据区。这部分我们着重研究FAT 格式分区内数据是如何存储的。
下面依次解释DBR、FAT1、FAT2、根目录、数据区、剩余扇区的概念。
5.1 DBR
DBR区(DOS BOOT RECORD)即操作系统引导记录区的意思,通常占用分区的第0扇区共512 个字节(特殊情况也要占用其它保留扇区,我们先说第0 扇)。
在这512 个字节中,其实又是由跳转指令,厂商标志和操作系统版本号,BPB(BIOS Parameter Block),扩展BPB,OS引导程序,结束标志几部分组成。
下面以用的最多的FAT32 为例说明分区DBR各字节的含义(这里还是拿U盘顶一下):
0x00: 3个字节,代表跳转指令;
0x03: 8个字节,代表厂商标志和OS版本号;
0x0B: 53个字节,代表BPB;

0x40: 26个字节,代表扩展BPB;
0x5A: 420个字节,代表引导程序代码;
0x1FE: 2个字节,代表有效结束标志;


MBR将CPU执行转移给引导扇区,因此,引导扇区的前三个字节必须是合法的可执行的基于x86 的CPU指令。这通常是一条跳转指令,该指令负责跳过接下来的几个不可执行的字节(BPB和扩展BPB),跳到操作系统引导代码部分。
跳转指令之后是8 字节长的OEM ID,它是一个字符串, OEM ID标识了格式化该分区的操作系统的名称和版本号。
DBR的偏移0x5A开始的数据为操作系统引导代码。这是由偏移0x00 开始的跳转指令所指向的。在上图中所列出的跳转指令"EB 58 90" 清楚地指明了OS引导代码的偏移位置。如EB 58,即跳转到58h处,紧接着跳转指令的是一条空指令NOP(90),即开始于0x5A。此段指令在不同的操作系统上和不同的引导方式上,其内容也是不同的。
注:FAT16的跳转指令=EB 3C 90(FAT16现在基本不用了,在这里就不详细介绍了), NTFS的跳转指令=EB 52 90(NTFS后续会介绍)
5.2 保留扇区
在上述FAT文件系统DBR的偏移0x0E 处,用2 个字节存储保留扇区的数目。所谓保留扇区(有时候会叫系统扇区,隐藏扇区), 是指从分区DBR扇区开始的仅为系统所有的扇区,包括DBR扇区。在FAT16 文件系统中,保留扇区的数据通常设置为1,即仅仅DBR 扇区。而在FAT32 中,保留扇区的数据通常取为32,有时候用Partition Magic 分过的FAT32 分区会设置36 个保留扇区,有的工具可能会设置63 个保留扇区。
FAT32 中的保留扇区除了磁盘总第0扇区用作DBR,总第2扇区(win98系统)或总第0xC 扇区(win2000,winxp)用作OS 引导代码扩展部分外,其余扇区都不参与操作系统管理与磁盘数据管理,通常情况下是没作用的。
操作系统之所以在FAT32 中设置保留扇区,是为了对DBR作备份或留待以后升级时用。FAT32中,DBR 偏移0x32 占2 字节的数据 指明了DBR备份扇区所在,一般为0x06,即第6扇区。当FAT32 分区DBR扇区被破坏导致分区无法访问时。可以用第6扇区的原备份替换第0扇区来找回数据。
在FAT文件系统中,文件的存储依照FAT 表制定的簇链式数据结构来进行。同时,FAT文件系统将组织数据时使用的目录也抽象为文件,以简化对数据的管理。
FAT的形成过程是:硬盘格式化后,用户文件以簇为单位存放于DATA区中,每个文件至少一簇,有的多簇,簇号不连续,但是会形成链,这个链就记录在FAT中。
下面为FAT16 Vs FAT32的组织形式对比:
a, FAT16的组织形式:


下面为FAT16 Vs FAT32中簇号取值以及含义:

FDT(File Directory Table)表即为文件目录表,也称为根目录区或ROOT区。用格式化命令(FORMAT)对硬盘(或逻辑盘)进行格式化的时候,就已经为整个硬盘建立了一个根目录FDT。FDT位于第二个FAT表之后,只有当FAT表不能定位文件在硬盘中的位置时,FAT才需和FDT配合以便能准确定位文件的位置。
FDT的具体定义如下:

六、实例:FAT32中查看文件FDT,FAT
首先现在U盘里面新建一个名为“test”的.txt文档,写入一部分内容如下图:

接下来,将会依次进行以下步骤:
(3) 由DBR(BPB)计算FAT首地址。
(4) 由DBR及FAT推算出FDT位置。
(5) 从FDT中查找文件起始簇号。
(6) 按照簇号计算FAT中的位置。
(7) 按照簇链的结构依次找到该文件所在各个扇区,并读出其内容。

(2) 其次找到DBR,

偏移0x0Dh处计算出: 每簇包含扇区数=0x20h=32,
偏移0x0Eh~0x0Fh处计算出: 保留扇区数=0x0020h=32,
偏移0x1Ch~0x1Fh处计算出: 隐藏扇区=0x00148F00=,
偏移0x24h~0x27h处计算出: 每个FAT包含的扇区数=0x00003800=14336,
偏移0x2Ch~0x2Dh处计算出: 根目录起始簇=0x002h=2号簇,
FAT1起始扇区=DBR扇区+保留扇区数
=+32=
FAT2起始扇区=DBR扇区+保留扇区数+每个FAT包含的扇区数
=+32+14336=
根目录起始扇区 = DBR扇区+保留扇区数 + 一个FAT的扇区数 * FAT表个数 + (起始簇号-2) * 每簇的扇区数= +32+14336*2+(2-2)*32=
FAT32没有独立的根目录区,它的根目录放在数据区,
所以,DATA区起始位置=根目录起始扇区=
(4) 由DBR及FAT推算出FDT位置。
利用Winhex 跳转功能,跳转至扇区,即FDT所在位置,

上面第(4)步找到了FDT的起始位置,现在要先找到“test.txt”所在的FDT位置,如下图:

文件簇号=0x00061836=,
(6) 按照簇号计算FAT中的位置。
根据第(5)步计算得到的簇号,我们可以得到:
文件簇号起始扇区=DATA区起始扇区+(簇号-2)*每个簇中包含的扇区数= + (-2) * 32=
(7) 按照簇链的结构依次找到该文件所在各个扇区,并读出其内容。
利用Winhex的跳转功能,跳转至扇区,如下图:

感兴趣的话,自己一定要尝试一下哦,会有很大的收获~
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/14506.html