关注+星标公众号,不错过精彩内容
来源 | liwen01
前言
exFAT是微软2006年推出的一种文件系统,距今已快二十年,相比于FAT16和FAT32,exFAT还是算年轻。
exFAT一直是微软的一个专用文件系统,直到2019年微软发布它的规范,目前微软拥有exFAT多个元素的专利,如果产品上使用exFAT,需要微软授权,否则有可能侵权。
exFAT被SD协会采用作为大于32GB SDXC卡的默认文件系统,在win11系统上,SDXC卡默认格式化选项已经没有FAT32选项,exFAT文件系统的使用范围正逐渐扩大。
为啥微软要用exFAT来代替FAT32呢?
因为exFAT数据结构开销比NTFS低,但它又可以突破FAT32 单个文件大小和分区大小的限制。
(一)磁盘布局

在Windows系统上将一张TF卡格式化成exFAT文件系统,发现它是将整个TF格式化成了exFAT文件系统,没有前面介绍的MBR和GPT分区表信息。
整体分为5个部分:
DBR及其保留扇区
FAT 文件分配表
簇号位图
大写字符
目录和文件(根目录在该区最开始位置)
(1) DBR

DBR 中主要有:跳转指令,OEM代号、BPB参数、引导程序、结束标志组成。这里只介绍BPB(BIOS Parameter Block,BIOS参数块),其它部分在前面其它文章中已经有介绍过了。
根据上面第0扇区的DBR信息,可以解析exFAT的BPB参数如下:

从上面解析的数据我们可以知道:
FAT表在第2048扇区
簇位号图在第4096扇区=首簇起始扇区号=第2号簇
大写字符在第4160扇区=簇位号图的下一个簇=4096 + 64 = =第3号簇
根目录在第4224扇区=首簇起始扇区号 + 根目录首簇号 - 2 = 4096 +(4-2)*64 = 第4号簇
(2) FAT表
与FAT32不同,exFAT只有一个FAT表,没有备份

表项里的内容与FAT32的类似:4个字节表示一个簇,每个簇都有自己的编号,F8 表示介质类型为硬盘,写入4个FF,表示结束标志。具体可查看上一篇文件系统(四):FAT32文件系统实现原理
与FAT32不同的是:exFAT文件系统中FAT表中记录的是不连续存储文件的簇链,如果是连续的簇链,在FAT表中不会体现。
上面exFAT文件系统FAT表中为0的簇,并不能表示该簇是未使用,也有可能它是连续簇
exFAT文件系统的簇使用情况,是通过簇位号图来实现的
(3) 簇号位图
簇位图中的每一个位,实际映射到数据区中的每一个簇。
如果对应簇已经被使用,簇位图上对应该簇的位值就是1,否则就为0

上面我们看,簇位图上的值为:FF FF FF FF FF FF FF FF FF FF FF 03
FF = 11111111b = 8个簇,11个FF表示88个簇,03的二进制位11b,表示2个簇
FF FF FF FF FF FF FF FF FF FF FF 03
表示从第2号簇到92号簇的90个簇号已经被使用了。
为什么这里是从第2号簇开始呢?
因为0号和1号FAT项有特殊用途,无法与数据区中的簇形成映射,只能从2号FAT项开始与数据区中的第一个簇映射,所以数据区中的第一个簇也就编号为2号簇。
(4)大写字符元文件

exFAT是一个大小写不敏感的文件系统
大写字符元文件(UPCASE file)里面存储的是一个全局字符映射表,包含了所有可能字符的大小写映射。
它主要作用是:大小写转换、文件名比较、国际化支持(跨语言)
(5) 目录项

exFAT 包含4种目录项
卷标目录项(32字节)
簇位图文件的目录项(32字节)
大写字符文件的目录项(32字节)
用户文件的目录项(至少3个目录项)
前面三个是系统目录项我们就不分析了,简单介绍一下用户文件的目录项 以上图中test3目录为例进行分析:

用户目录项的三个目录项被称为三个属性,
第一个目录项称为“属性1”,目录项首字节的特征值为“85H”;
第二个目录项称为“属性2”,目录项首字节的特征值为“C0H”;
第三个目录项称为“属性3”,目录项首字节的特征值为“C1H”。
第一目录项

与FAT32 文件系统相比多了附属目录项数,校验和,这里重点介绍一下校验和的作用。
校验和
校验和是用来确保目录项数据的完整性和可靠性,防止和检测目录项数据损坏。
在目录项读取的时候,可以通过校验和确定目录项数据是否损坏或是被篡改。
第二目录项

这里需要注意文件碎片标志和文件名Hash值两个参数,这是FAT32文件系统不具有的功能。
文件碎片标志
文件碎片是用来标记文件是否连续存储。
如果值为0x03,表示文件是连续的,没有碎片,在FAT表中不会有记录。在文件读取的时候,可以直接根据文件所在的起始簇号,直接进行数据连续读取,而不需要去查找FAT表的中FAT项。
如果值为0x01,表示文件是不连续的,有碎片,在FAT表中会记录该文件簇链,在文件读取的时候,除了文件的起始簇号,还需要根据FAT表中的信息去寻找下一个簇号。
因为有了文件碎片标记,exFAT文件读写效率要比FAT32高。
文件名Hash值
文件名Hash值是用来加速文件查找过程,通过快速匹配Hash值减少详细比较的次数。
在目录查找过程中,通过先比较Hash值,可以减少实际需要比较完整文件名的次数。
如果Hash值不匹配,则文件名一定不匹配;如果Hash值匹配,再进行文件名的详细比较。
第三目录项
在exFAT 中没有长文件名和短文件名的区分,统一记录到文件名位置,如果文件名超出了第三目录项空间,就继续写入到下一个目录项中,
比如上面第一个文件 System Volume Information
的目录项
(二)实现原理
这里从文件创建、写入、读取、删除、查找的角度来介绍一下exFAT文件系统的实现原理
(1)文件创建
根据簇号位图查找空闲簇号
将簇号位图中该簇号标记为已使用
目录项中添加一个新的目录条目,记录新文件的元数据,包括文件名、文件大小、创建时间、起始簇号、HASH值、校验和等信息
(2)文件写入
通过目录项找到文件的起始簇号
如果数据超过了一个簇大小,通过簇号位图查找下一个可写入的簇
如果下一个簇与当前簇不连续,则将簇号信息同步到FAT表中,同时目录项文件碎片标志设置为0x01
如果一下簇与当前簇是连续的,FAT表信息就不需要修改
更新目录项的其它信息,比如文件大小和最后修改时间
(3)文件读取
通过目录项找到文件的起始簇号,通过件碎片标志判断文件是否连续
如果文件连读,可根据起始簇号直接按序读取
如果文件不连续,还需要根据FAT表查找下一个数据所在的簇号
(4)文件删除
文件删除是文件创建的一个逆过程
(5)文件查找
通过BPB(BIOS参数块)定位到根目录或是起始目录位置
读取目录簇数据
计算目标文件名的Hash值
遍历目录,逐个比较目录项的Hash值,如果Hash值相同,则进行文件名比较
文件名比较,使用UPCASE表(大写字符元文件)进行大小写无关的比较
检查匹配结果,如果匹配,则读取该目录项的详细信息并进行校验
如果未找到匹配项且当前目录有子目录,递归进入子目录继续查找
(三)优缺点
优点
(1)支持大文件和大容量卷
FAT32 支持最大文件4GB、最大卷2TB、每子目录最大支持65534个文件
exFAT 支持最大文件16EB、最大卷128PB、每子目录最大支持2796202个文件
(2)轻量级和高兼容性
exFAT与FAT32类似,文件系统的元数据比较小,适用于内存空间有限的嵌入式设备
同时,exFAT也可以兼容Windows、Linux、macOS 这几个常用操作系统
(3)支持元数据校验
exFAT 目录项上有校验和参数,当目录项内容损坏或是被篡改的时候,可以通过校验和进行检测
(4)效率比FAT32高
exFAT 采用簇号位图+簇号链表的方式来管理簇号,比FAT32只能通过簇号链表的方式效率高
exFAT 文件查找的时候,首先是根据Hash值查找,在匹配文件名,比FAT32只能比较文件名效率高
缺点
(1)专利和授权限制
微软拥有exFAT的多项专利,使用exFAT在某些情况下可能会涉及专利和授权问题,尤其是对于商业产品。
(2)缺乏日志功能
与NTFS相比,exFAT缺乏日志功能,这意味着在突然断电或系统崩溃时,数据损坏的风险更高。
(3)碎片问题:
虽然exFAT在一定程度上减轻了文件碎片的问题,但它依然没有NTFS那么高效地管理碎片。
结尾
以上就是关于exFAT文件系统的介绍,如有错误,欢迎在下面评论区批评指正,不胜感激。下一篇将介绍ext4 或是ntfs 文件系统。
---------------------------End---------------------------