文件系统(四):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文件格式,这是什么理由让硬件厂商选择过时的文件系 ...
随机推荐
- C++ 智能指针和内存管理:使用指南和技巧
C++是一门强大的编程语言,但是在内存管理方面却存在着一些问题.手动管理内存不仅费时费力,而且容易出错.因此,C++中引入了智能指针这一概念,以更好地管理内存. 什么是智能指针? 在C++中,内存的分 ...
- 聊聊ChatGLM3多用户并发API调用的问题
转载请备注出处:https://www.cnblogs.com/zhiyong-ITNote 背景 目前在公司内部4张A10的GPU服务器上部署了ChatGLM3开源模型:然后部署了官方默认的web_ ...
- 【FAQ】HarmonyOS SDK 闭源开放能力 —Push Kit(3)
1.问题描述: 调用HarmonyOS API发送通知,能查到状态是送达终端设备,但是终端设备上没收到通知卡片. 解决方案: 通知应用大图标不能超过30kb,通知参数限制,参考如下:https://g ...
- HarmonyOS NEXT应用开发案例——列表编辑实现
介绍 本示例介绍用过使用ListItem组件属性swipeAction实现列表左滑编辑效果的功能. 该场景多用于待办事项管理.文件管理.备忘录的记录管理等. 效果图预览 使用说明: 点击添加按钮,选择 ...
- EventBridge 集成云服务实践
简介:本篇文章主要向大家分享了通过 EventBridge 如何集成云产品事件源,如何集成云产品事件目标以及通过事件流如何集成消息产品. 作者:李凯(凯易) EvenBridge 集成概述 Even ...
- Quick BI电子表格: 新手亦可表格自由
简介: 随着企业业务快速增长,单纯的表或交叉表展现的数据模式相对固定,已不能满足企业中不同角色用户.不同业务场景数据可视化分析展现的诉求.在满足业务人员可视化需求层面,Quick BI不仅提供了丰富 ...
- dotnet 谨慎在静态构造函数里使用锁
在 dotnet 的最佳实践里面,不推荐在静态构造函数里面包含复杂的逻辑,其中也就包含了本文聊的和多线程相关的锁的使用.最佳做法是尽量不要在静态构造函数里面碰到任何和锁以及多线程安全相关的逻辑.本文来 ...
- 2019-4-29-win10-uwp-使用-Border-布局
title author date CreateTime categories win10 uwp 使用 Border 布局 lindexi 2019-04-29 12:29:45 +0800 201 ...
- Prometheus+Grafana+alertmanager构建企业级监控系统(二)
二.可视化UI界面Grafana的安装和配置 2.1 Grafana介绍 Grafana 是一个跨平台的开源的度量分析和可视化工具,可以将采集的数据可视化的展示,并及时通 知给告警接收方.它主要有以下 ...
- 数据可视化之pyecharts模块
1.简介 pyecharts 是一个用于生成 Echarts 图表的类库. Echarts 是百度开源的一个数据可视化 JS 库.主要用于数据可视化. # 安装 # 安装v1版本之上的有一些报错 py ...