exFAT文件系统详细解析

date
Sep 4, 2024
slug
2024-09-04-exfat-file-system-summary
status
Published
tags
文件系统
type
Post
AI summary
exFAT文件系统是微软为闪存设备开发的,解决了FAT32在文件和分区大小上的限制,支持最大64ZB的分区和16EB的单个文件。其结构与FAT32相似,包含保留扇区、FAT区和数据区。exFAT只有一个FAT表,数据区使用簇号位图来标记簇的占用状态,目录项结构也有所不同,需包含多个属性信息。整体上,exFAT在高容量存储设备中表现出色,但使用时需注意微软的专利问题。
summary
通过对网络资料的学习整理了exFAT文件系统的结构,对其内部如何管理数据和文件进行总结。
exFAT(Extended File Allocation Table)也称为FAT64文件系统,是微软针对闪存设备所开发的文件系统,解决了FAT32上不支持4GB以上文件大小、2TB以上分区大小等问题,当前高容量的SDXC类型的SD卡默认都是这种文件系统格式。但是需要注意,微软仍然持有exFAT的专利,在产品中使用这种类型的文件系统需要给微软支付相应的专利费用。
exFAT文件系统最大分区可以支持到64ZB,单个文件最大可以支持到16EB,簇最大可以支持32MB。
  • 相对比的,FAT32所能够支持的最大簇的大小是64KB。32MB这么大的簇大小当然是可以支持更大的文件系统分区以及有利于大文件的读写操作,但是如果文件系统中包含了大量的几个KB的小文件,每个小文件仍要占用一个簇32MB的话,这个文件系统的实际利用效率肯定就太低了。所以从通用文件系统的效率角度出发去考虑的话,一般不大可能把簇大小设置的这么大。
其实exFAT的结构与FAT32的结构非常类似,把FAT32的结构彻底弄清楚了,学习exFAT就要容易很多。对于FAT32文件系统的学习,可以参考我的另外一篇针对FAT32文件系统的学习总结。

exFAT文件系统的结构

从文件系统的结构上讲,exFAT文件系统与其他FAT类型的文件系统一样,也可以包含保留扇区、FAT区以及数据区三个部分,当然三个部分分别有一些差异。
notion image
  • 另外需要注意的是,也有些资料把数据区开头的簇号位图文件(bitmap)和大写字符文件(upcase)单独分出来作为独立的区域,这样在exFAT的结构上就变成了5个部分:在FAT表和数据区之间增加簇号位图区域和大写字符区域。

保留扇区

与FAT32类似,exFAT文件系统的第一部分也是保留扇区,且保留扇区最重要的部分也就是位于其开头的DBR引导扇区。这个DBR扇区的主要作用有两个:
  • 包含有这个文件系统的一些参数信息,如扇区大小、各个区域的起始位置、簇大小等,主要对应于DBR中的BPB记录;
  • 在这个文件系统安装有操作系统的时候,通过DBR扇区中包含的OS引导代码启动操作系统的运行,主要对应于DBR开头的跳转指令和后面的OS加载代码。
exFAT文件系统的DBR数据结构如下所示:
notion image
整体上看与FAT32的DBR结构非常类似,在其中的0x40-0x70之间的BPB记录中包含了这个exFAT分区在整个硬盘上的起始位置,FAT表和数据区部分的位置,数据区中根目录所在的簇号,每个扇区的字节数,每个簇的扇区数以及FAT表中所包含的FAT表项的个数。因此对BPB的记录信息进行完整解析以后,就可以对整个exFAT文件系统的整体结构及其在硬盘上的位置有了很清楚的理解。

FAT表

与FAT32不同的是,exFAT只有一个FAT表,没有备份FAT表。所以这个FAT表的安全性非常重要,一旦丢失这个分区的数据记录就没办法恢复了。
FAT表及其FAT表项在exFAT文件系统中的作用和结构也基本上与FAT32文件系统中类似。数据区的每一个簇对应于FAT表中的一条记录,这个记录按照簇编号进行排列,每个记录的长度固定为4个字节。
与FAT32的FAT相同,exFAT文件系统的FAT表中FAT表项也是从0开始编号,但是0号和1号FAT表项保留为特殊用途(因此簇是从2开始编号的),0号FAT表项用于存放存储介质类型,例如这个表项中使用0xFFFFFFF8表示是硬盘,1号FAT表项一般都是4字节的0xFF。
FAT表中的2,3,4号FAT表项以及数据区中的2,3,4号簇用于保存簇号位图,5号FAT表项以及数据区的5号簇用于保存大写字符转换表,6号FAT表项和数据区的6号簇才用来保存文件系统的根目录(FAT32是2号簇保存根目录)。这部分数据结构也是exFAT与FAT32文件系统之间另一个迥异的地方,在后续的数据区部分详细描述。

FAT表中保存的簇链对于碎片文件才有意义

在FAT32文件系统的FAT表中,不仅用FAT表项来表征数据区中各个簇的当前占用状态,而且还使用FAT表项的记录内容形成各个文件的存储簇链。但在exFAT文件系统中各个簇的占用状态不再使用FAT表项来标记,而是用位于数据区的簇号位图来标记,相当于FAT表的唯一功能就是为不连续的问题提供簇链信息。
在exFAT文件系统中,存储在连续簇中的文件在访问的时候,直接使用其目录项中包含的起始簇编号和文件大小直接读数据区进行读写,根本就不需要访问FAT表。对应连续文件的那些簇对应的FAT表项的内容根本就没有意义,在进行文件操作的时候也不会访问和更新。
而如果文件在数据区中存储的簇不是连续簇,那么就是碎片文件,此时就需要利用FAT表来保存这个文件对应的簇链。簇链在exFAT文件系统的FAT表中存储的模式与FAT32的FAT表类似,每个FAT表项中存储的是碎片文件下个簇的编号。此时针对这类非连续簇的碎片文件的访问就一定要求助于FAT表中所存储的簇链,对应于这些簇的FAT表项中也就需要写入正确的簇链信息。
  • 这一点可以结合一下数据区中每个文件的属性2目录项来进行理解。
  • 连续文件中簇对应的FAT表项没有意义,不保证有正确的设置值,这些表项为0也并不能说明其是否已经被占用。在exFAT文件系统在决定一个簇是否被占用应该是访问簇号位图,而不是解析FAT表项的记录。

数据区

簇号位图

簇号位图区域处于数据区的开头,包含其开头的2,3,4共计三个簇。这三个簇中的每一个数据位,都代表数据区一个簇的占用状态,0表示这个簇处于尚未分配/使用的状态,1则表示已被占用。因此,exFAT的簇号位图实际上起到了FAT32里面FAT表项的部分作用。
数据区中每个簇是否被占用都通过查询簇号位图来决定。

大写字符转换表

在文件系统结构上,紧接着位于簇号位图之后的区域是大写字符转换表。
exFAT文件系统的文件名是大小写不敏感的,而且文件名称字符串是Unicode字符串。那么在进行文件查询的时候,需要把文件名格式先转换为Unicode格式,然后通过查这个大写字符转换表转换为全部为大写字符的字符串,转换完成后再进行比较。所以这个大写字符转换表只是用于对字符串中的字符进行查表和替换而已。

目录

与FAT32的长文件名目录项和短文件名目录项不同,exFAT的每个子目录和普通文件至少要包含三个目录项。每个目录项都是一个完整的结构体,用于描述与这个文件或者子目录对应的各种属性信息,当然还包括这个文件和目录在数据区保存的起始簇的编号。
每个目录项的第一个字节用于标记这个目录项的属性,因此文件系统中的每个文件至少需要有三个用目录项来标记的属性。
属性1目录项:固定长度32字节,以0x85目录项类型作为属性特征值,主要包含有这个文件的访问属性、各种创建/访问/修改时间等信息。
notion image
属性2目录项:固定长度32字节,以0xC0目录项类型作为属性特征值,主要包含有这个文件在数据区是否连续保存、文件大小、起始簇的编号、文件名的长度及其hash等。
notion image
  • 注意这里的文件碎片标志,用于标记该文件在数据区是否是以连续簇的方式保存的。如果该文件是以连续簇保存,也就是没有碎片化,那么对于这个文件的访问就不需要借助FAT表了,直接取出起始簇号,然后根据文件大小计算出连续簇的数据就可以把完整的文件读出来。但是如果文件在数据区是以碎片化形式保存的,就需要类似FAT32,取出起始簇号结合FAT表中的簇链把文件内容还原出来。
属性3目录项:这个属性结构体的长度由文件名长度决定,以0xC0目录项类型作为属性特征值,以unicode字符串(每个字符2个字节)包含有这个文件的文件名。
notion image

参考文档

  • 《固态存储:原理、架构与网络安全》 夏鲁宁,贾世杰,陈波 6.5 exFAT
 

© Pavel Han 2020 - 2024