文件系统(四):FAT32文件系统实现原理
FAT32是从FAT12、FAT16发展而来,目前主要应用在移动存储设备中,比如SD卡、TF卡。隐藏的FAT文件系统现在也有被大量使用在UEFI启动分区中。
为使文章简单易读,下面内容特意隐藏了很多实现细节,关于分区、格式化等相关的内容,可以查看之前的文章:
(一)FAT32 磁盘布局

拿一个FAT32文件系统的存储设备,我们可以看到,它整个存储设备大概可以分为5个部分:引导、保留扇区、FAT表、目录和文件、备份。
(1)引导与保留扇区
引导和保留扇区部分,会因为分区方式的不同(MBR与GPT)而不同,同时也会因为存储设备分区个数的不同也会有差异。
下面这个是使用GPT方式将存储设备分为1个分区并格式化为FAT32文件系统格式的数据分布示意图。

(2)备份
在磁盘末尾的备份区域,主要是使用GPT方式分区的时候,会将分区表信息备份到存储设备的最后区域。对于MBR分区方式,并没有这部分。
(3)FAT表与目录项
在FAT32文件系统的使用过程中,FAT表和目录项是其核心部分,将在下面介绍
(二)文件在哪里?
将一个存储设备格式化成FAT32格式文件系统,然后再在上面创建几个文件夹和文件,那么这些文件和文件夹的名字信息是存储在什么位置?文件里面的数据又是存储在哪?要怎样才能找到这些文件?

上面在一个TF卡中创建了test1、test2、test3、test4 四个文件夹和一个0000.media媒体文件。
System Volume Information 目录及其下面的文件是在Windows系统格式化的时候系统写入的系统文件。
目录项
FAT表后面的区域,是根目录的存储区域,目录和文件以及文件中的实际数据都存储在这个一个大的区域。根目录是在该区域最开始的位置。
从根文件所在扇区的数据我们可以看到根目录的目录项信息:

从WinHex工具上,根目录所在位置的还有4个“新建文件夹”项。这个是因为在Windows创建文件夹的时候,开始的名字是“新建文件夹”,后面被我重命名成了test1~4
目录项分为长文件名和短文件名
如果一个文件它的名字大于11个字节,那它就至少有两个目录项,一个短文件名项和一个长文件名项。
文件名长度小于等于11个字节的话,就只有一个短文件名项。短文件名目录项长度为32个字节,各字节的定义如下:

根据上面定义可以对根目录下的目录项进行解析:

以test2目录项举例,我们可以看到:
- 文件名为test2 (短文件名)
- 文件属性为10 (子目录 )
- 这里时间需要转换,2字节用不同的位表示年月日和时分秒
- 起始簇号为07号
如果目录项是以E5开头,那表示该项是无效的或是已经删除了的目录项,比如上面的四个"新建文件夹"目录项
通过目录项,我们可以知道存储设备上都有哪些文件和目录,相应的子目录也是一样的实现,只不过子目录下面的目录项是在子目录所在的簇中记录。
(三)文件磁盘空间分配
在FAT32文件系统中,它是以簇为单位进行空间分配和管理。一般一个簇的大小为4KB(下面均以4KB做参考)。
一个文件或是一个目录,它是通过目录项知道它在存储设备上存放的的开始位置,也就是开始簇号,而簇号信息,是存储在FAT表上,
一个FAT32文件系统有两个FAT表,一个正常使用,另外一个为备份FAT表
通过分区上的DBR和FSINFO信息可以知道FAT表的大小和所在位置等信息。

FAT32 是以32位(4Byte)来定义一个FAT表项,也就是一个簇的状态,下表是FAT表项中值的含义:

对于FAT表,第0号簇是固定的0x0FFFFFF8,第1号簇项0xFFFFFFFF是被系统使用
第3号簇是根目录的开始簇,如果其值是0x0FFFFFFF,表示根目录只占用一个簇的空间,也就是4KB大小空间,如果其值是0x00000002~0x0FFFFFFE,表示根目录的下一个簇号,直到出现文件结束簇0x0FFFFFFF,也就是根目录大于4KB的大小。
下面是对FAT表现的一个解析。

从上面可以看出:
- 如果文件或是目录小于4K(一个簇),那它所占用的空间就是目录项中起始簇号所分配的空间,该簇号的值为结束簇号的值(0x0FFFFFFF)
- 如果一个文件大于4K(一个簇),目录项中的起始簇号所在位置的值,就是下一个位置存储的簇号值,比如0000.media 文件,它的起始簇号是10,第10簇号(0x0000000B)->第11簇号(0x0000000C)->......第241簇号(0x0x00000F2)->第242簇号(0x0FFFFFFF 结束簇号)
- 上面这个0000.media文件是以连续的方式存储在磁盘中,当磁盘满了或是使用久了之后,会存在磁盘碎片,有可能就不是连续的空间了。
(四)实现原理
我们从文件的创建、数据写入、文件删除等操作流程看文件系统的基本实现原理
(1)文件创建
- 创建文件或是目录的时候,会先在当前目录所在位置的目录项中添加一个目录项
- 目录项会记录文件的起始簇号,创建、修改时间,文件属性等信息
(2)文件增删数据
- 如果起始簇空间写满了,系统会查找一个空闲簇,数据将继续写入到该空闲簇中,FAT表中该空闲簇会被标记已经被使用,同时,该文件的结束簇号也会往后移动一个簇。
- 更新该目录项中的修改时间、文件大小等信息
- 删除或是修改文件里面的数据,就是一个反向的过程
(3)文件数据读取
- 通过目录项,找需要读取文件所在的开始簇位置
- 如果文件大于一个簇,开始簇位置的值为下一个簇的位置,可以顺着这个簇链一直查找,直到结束簇出现。
(4)文件删除
- 文件删除的时候,根目录中该目录项的信息并不会被删除,而是将该目录项标记为删除状态
- FAT表中该文件所占用的簇号,会被标记为0,表示该簇为未使用的簇。
- 该文件所在簇号所对应扇区的实际文件数据不会被擦除,文件里面的数据还是存储在删除上。
文件删除,实际上也就是将该文件在FAT表中的簇信息标记为可使用,然后将目录项标记为已删除,实际数据不会做删除处理
如果要恢复被删除的文件,可以根据目录项中的信息进行恢复,前提是不要再创建新文件和写入新数据,因为新的数据容易将原来文件所在扇区的数据覆盖或是擦除。
(5)基本原理
FAT32文件系统的基本原理,是通过目录项来管理磁盘的文件目录结构,然后通过FAT表来管理磁盘文件所使用的簇(扇区)空间。
FAT32 文件系统的FAT表是通过单向链式的方法来管理扇区,这种方式在小文件和小容量的储存设备上使用比较方便,但不适合于大文件和大容量的存储设备。
目前大于32GB的SDXC卡,SD协会已采用exFAT作为默认的文件系统。
(五)优缺点
(1)优点
FAT32 文件系统现在还在被大量使用,其主要的优势在于:兼容性强和实现简单
兼容性强: 它可以同时支持Windows、Linux、Mac OS 三个操作系统,同时因为它的历史悠久,很早就已经被广泛使用,所以很多老旧电脑系统和设备都可以支持。
实现简单: 它的设计相对简单、易于实现和维护,特别是在系统资源紧张的嵌入式设备中。
(2)缺点
它的缺点主要有:不适合大文件、磁盘碎片化、安全性较差
不适合大文件:
目录项中使用4个字节表示文件大小,其最大表示的值为4GB,所以FAT32对于单个文件的最大大小限制为4GB。
安全性较差:
相比一些现代文件系统(如NTFS、exFAT等),FAT32的安全性较差。它缺乏对文件和文件夹的访问控制、加密、日志记录等高级功能,因此不适合用于存储敏感数据或需要更高安全性的场景。
(3)磁盘碎片化
磁盘碎片化这里描述详细一些,因为它会影响到文件系统的性能。
静态分配簇:
FAT32使用固定大小的簇(cluster)来管理存储空间。每个文件都被分配到一个或多个簇来存储,这些簇在存储设备上连续地排列。当文件大小超过一个簇的容量时,系统会分配额外的簇给文件。但是,如果在磁盘上没有足够的连续空闲簇来容纳整个文件,文件就会被分割成多个片段并存储在不同的地方,导致碎片化。
文件删除和大小改变:
FAT32文件系统的碎片化还会因为文件的删除和大小的改变而产生。当文件被删除时,它占用的簇会被标记为空闲,可以被其他文件使用。如果其他文件需要的空间无法与原文件的簇连续,新文件就会分配到磁盘上的不同位置,造成碎片化。同样地,当文件的大小发生改变时,如果新的大小需要的簇数超过了原文件所占用的连续簇数,文件也会发生碎片化。
碎片化的影响:
碎片化会影响文件的读取和写入性能。当文件被分割成多个片段时,系统需要花费更多的时间来定位和读取这些片段,从而降低了文件的读取速度。另外,由于文件存储不连续,存储设备上可能会出现许多小的空闲碎片,导致存储空间的浪费。
结尾
上面内容是以比较概况的方式来介绍FAT32文件系统的实现原理和它的优缺点,至于FAT32文件系统的详细实现细节,可以通过官方文档进行了解(晦涩难懂),也可以找张TF卡,通过winhex等工具,自己动手查看它的实现细节。
---------------------------End---------------------------如需获取更多内容请关注 liwen01 公众号
文件系统(四):FAT32文件系统实现原理的更多相关文章
- 【转载】FAT32文件系统详解
硬盘是用来存储数据的,为了使用和管理方便,这些数据以文件的形式存储在硬盘上.任何操作系统都有自己的文件管理系统,不同的文件系统又有各自不同的逻辑组织方式.例如:常见的文件系统有FAT,NTFS,EXT ...
- FAT和FAT32文件系统的原理
[转自] http://www.sjhf.net/Article/sjhfdoc/200404/1.html 一.硬盘的物理结构: 硬盘存储数据是根据电.磁转换原理实现的.硬盘由一个或几个表面 ...
- U盘FAT32文件系统
一.FAT文件系统分为四个部分 参考别人的博客 1.http://blog.163.com/ourhappines@126/blog/static/121363154201311811495492/ ...
- SD卡FAT32文件系统格式
一.声明 1.本文来源和主旨 2.本文测试环境 二.SD卡FAT文件系统 1.SD卡FAT32文件系统的整体布局 2.FAT文件系统简介 ① 文件分配表 ② 目录项 三.DBR(DOS BOOT RE ...
- 使用hexdump追踪FAT32文件系统中的一个文件
最近在看文件系统基础结构等知识,本来重点是想看EXT4文件系统,但是目前没有找到比较详细说明EXT4文件系统详细结构的,用EXT3的对应着找结果有点出入,在想是不是我用hexdump的参数有问题,于是 ...
- FAT32文件系统
- FAT32文件系统学习(3) —— 数据区(DATA区)
FAT32文件系统学习(3) —— 数据区(DATA区) 今天继续学习FAT32文件系统的数据区部分(Data区).其实这一篇应该是最有意思的,我们可以通过在U盘内放入一些文件,然后在程序中读取出来: ...
- 入门级:理解FAT32文件系统(转载翻译)
FAT(File Allocation Table ) 这个网页的目的是帮助你理解怎么样在微软FAT32文件系统下取得数据,处理的硬盘的大小通常在500M到几百G之间.FAT是一个相对简单和纯净的文件 ...
- FAT32文件系统--For TF卡
1. TF卡空间是如何分配的? 下面以4GB TF卡为例,通过WinHex工具进行分析,其空间分配如下图所示: FAT32把目录当做文件来管理,所以没有独立的目录区,所有的文件目录项都是在数据区里面的 ...
- 移动存储卡仍然用FAT32文件系统的真相
微软在2001年就为自家的XP系统的本地磁盘默认使用了NTFS文件系统,但是12年之后,市面上的USB可移动设备和SD卡等外置存储器仍然在用着FAT32文件格式,这是什么理由让硬件厂商选择过时的文件系 ...
随机推荐
- 选择适合您网站的 SQL 托管:MS SQL Server、Oracle、MySQL
SQL托管 如果您希望您的网站能够存储和检索数据,您的Web服务器应该能够访问使用SQL语言的数据库系统.以下是一些常见的SQL托管选项: MS SQL Server Microsoft的SQL Se ...
- 5. Determinant
5.1 The Properties of Determinants The determinant of the n by n identity matrix is 1 : \(det I = 1\ ...
- HarmonyOS课程尝鲜计划,优享特权大礼包
报名入口:https://developer.huawei.com/consumer/cn/activity/901689042385499023
- Python 潮流周刊第 46 期(摘要)+ 赠书 7 本
本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...
- This version of Android Studio cannot open this project, please retry with Android Studio 4.0 or newer.
前言 遇到的问题,This version of Android Studio cannot open this project, please retry with Android Studio 4 ...
- ASP.NET MVC5.0 筑基到炼气大圆满一篇就搞定
一.ASP.NET MVC 过滤器 ASP.NET MVC框架支持四种不同类型的过滤器: 授权过滤器 - 实现IAuthorizationFilter属性. 动作过滤器 - 实现IActionFilt ...
- Oracle nullif函数使用
nullif函数使用 简单来说,就是表达式1的值和表达式2的值进行对比 可以使用''字符 select nullif('','1111') from dual 输出为空 不可以使用null字符 sel ...
- SpringCloud 应用在 Kubernetes 上的最佳实践 — 线上发布(可监控)
简介: 本篇是"SpringCloud 应用在 Kubernetes 上的最佳实践"系列文章的第六篇,主要介绍了如何保障生产环境服务稳定,做到随时发布,从而加快业务的迭代和上线速度 ...
- DLF +DDI 一站式数据湖构建与分析最佳实践
简介: 本文由阿里云数据湖构建 DLF 团队和 Databricks 数据洞察团队联合撰写,旨在帮助您更深入地了解阿里云数据湖构建(DLF)+Databricks 数据洞察(DDI)构建一站式云上数据 ...
- IDA动态调试快捷键
1. F2下断点2. F7进入函数,F8单步调试,F9跳到下一个断点,F2下断点,G调到函数地址3. N重名4. g跳到地址和函数名5. u取消把函数汇编变成机器码6. c就是把机器码变成汇编7. F ...