文件系统(五):exFAT 文件系统原理详解

exfat · 浏览次数 : 0

小编点评

**exFAT 文件系统介绍** exFAT 是一个轻量级和高兼容性的文件系统,它可以兼容 Windows、Linux 和 macOS 等多个操作系统。它比 FAT32 文件系统更加高效,因为它采用簇号位图 + 簇号链表的方式来管理簇号,比 FAT32 只使用簇号链表的方式。 **主要特点:** * 支持大文件和大容量卷 * 支持元数据校验 * 采用簇号位图 + 簇号链表的方式提高效率 * 减少碎片问题 **优缺点:** * 只能使用 Hash 值进行文件查找,效率可能不如 FAT32 * 缺乏日志功能 **其他:** * exFAT 目录项上有校验和参数,当目录项内容损坏或是被篡改的时候,可以通过校验和进行检测。 * exFAT 文件系统可以兼容 FAT32 文件系统,但需要在创建或读取文件时设置一些额外参数。

正文

前言

exFAT是微软2006年推出的一种文件系统,距今已快二十年,相比于FAT16和FAT32,exFAT还是算年轻。exFAT一直是微软的一个专用文件系统,直到2019年微软发布它的规范,目前微软拥有exFAT多个元素的专利,如果产品上使用exFAT,需要微软授权,否则有可能侵权。

exFAT被SD协会采用作为大于32GB SDXC卡的默认文件系统,在win11系统上,SDXC卡默认格式化选项已经没有FAT32选项,exFAT文件系统的使用范围正逐渐扩大。

为啥微软要用exFAT来代替FAT32呢?

因为exFAT数据结构开销比NTFS低,但它又可以突破FAT32 单个文件大小和分区大小的限制。

文件系统(一):存储介质、原理与架构

文件系统(二):分区、格式化数据结构

文件系统(三):嵌入式、计算机系统启动流程与步骤

文件系统(四):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---------------------------
如需获取更多内容
请关注 liwen01 公众号

与文件系统(五):exFAT 文件系统原理详解相似的内容:

文件系统(五):exFAT 文件系统原理详解

前言 exFAT是微软2006年推出的一种文件系统,距今已快二十年,相比于FAT16和FAT32,exFAT还是算年轻。exFAT一直是微软的一个专用文件系统,直到2019年微软发布它的规范,目前微软拥有exFAT多个元素的专利,如果产品上使用exFAT,需要微软授权,否则有可能侵权。 exFAT被

2023年最新版Apollo保姆级使用手册(超级详尽版本)

目录Apollo操作说明前言Apollo环境部署一、环境构建二、官方地址三、数据库脚本使用四、配置Apollo文件五、启动Apollo六、访问ApolloApollo产品使用一、修改部门二、应用操作三、用户操作四、系统权限管理1、创建应用权限配置2、创建应用权限配置3、与旧版比对五、系统参数1、Po

XTTS系列之五:警惕大文件表空间

在上篇《[XTTS系列之四:迷迷糊糊的并行度](https://www.cnblogs.com/jyzhao/p/17525723.html)》验证之后,就让测试组在RMAN配置中设置好正确的并行。然后重新将备份任务执行,平均速度直接由之前的150MB/s提升为1200MB/s。优化效果非常明显,速

【23种设计模式】原型模式(五)

## 前言 在软件系统中,当创建一个类的实例的过程很昂贵或很复杂,并且我们需要创建多个这样类的实例时,如果我们用new操作符去创建这样的类实例,这就会增加创建类的复杂度和创建过程与客户代码复杂的耦合度。如果采用工厂模式来创建这样的实例对象的话,随着产品类的不断增加,导致子类的数量不断增多,也导致了相

Velero系列文章(五):基于 Velero 的 Kubernetes 集群备份容灾生产最佳实践

| 考量维度 | 基于CSI 快照 | 基于Restic 文件复制 | | | | | | 应用性能影响 | 低,CSI 接口调用存储系统快照 | 取决于数据量,占用额外资源 | | 数据可用性 | 依赖于存储系统 | 对象存储和生产环境隔离,独立可用性,支持跨站点可用性 | | 数据一致性 | 支

从原理聊 JVM(五):JVM 的编译过程和优化手段

# **一、前端编译** 前端编译就是将Java源码文件编译成Class文件的过程,编译过程分为4步: ## **1 准备** 初始化插入式注解处理器(Annotation Processing Tool)。 ## **2 解析与填充符号表** 将源代码的字符流转变为标记(Token)集合,构造出`

Vue源码学习(五):渲染第四步,生成虚拟dom并将其转换为真实dom

好家伙, 前情提要: 在上一篇我们已经成功将ast语法树转换为渲染函数 现在我们继续 1.项目目录 代码已开源https://github.com/Fattiger4399/analytic-vue.git手动调试一遍, 胜过我解释给你听一万遍 新增文件:vnode/index.js vnode/p

[转帖]构建自定义镜像并优化dockerfile文件

https://www.cnblogs.com/renshengdezheli/p/16645144.html 目录 一.系统环境 二.前言 三.镜像构建步骤 四.dockerfile文件常用指令 4.1 dockerfile文件常用指令 4.2 RUN、CMD、ENTRYPOINT的区别 五.构建

[转帖]查看堆内对象的工具:jmap

文章目录 用途命令格式示例一,no option二,heap三,histo[:live]四,clstats五,finalizerinfo六,dump: 用途 jmap 可以查看堆内对象的信息,生成 java 程序的 dump 文件,甚至可以查看 ClassLoader 的

[转帖]玄铁C910微架构学习(2)——指令高速缓存

https://www.zhihu.com/people/kent-35-40/posts ​ 目录 收起 一、指令提取单元简介 二、指令高速缓存源码的文件结构 三、指令高速缓存的组成 data_array tag_array predecd_array 四、指令高速缓存的回填 五、扩展的指令缓存操