文章总结: 本文详细解析FAT文件系统的技术架构与演进历程,涵盖FAT12/16/32/exFAT四代版本的核心差异,重点阐述其簇化管理与链表式分配两大设计思想。关键发现包括FAT表结构对取证分析的价值(如删除文件恢复、碎片化分析),并提供版本选择与簇大小配置的实践建议。文档通过历史时间线与对比表格系统梳理技术演进路径,具备较高工程参考价值。 综合评分: 82 文章分类: 技术标准,数据安全,应用安全,安全工具,其他
FAT文件系统-1.FAT文件系统概述
原创
李北辰 李北辰
SPEEDCoding
2026年5月11日 13:24 山西
在小说阅读器读本章
去阅读
1.1 什么是FAT文件系统
定义
FAT(File Allocation Table,文件分配表) 是一种由微软开发的文件系统,其核心思想是通过一张”分配表”来追踪存储介质上每个簇(Cluster)的分配状态和使用情况。FAT文件系统最早诞生于1977年,是个人计算机历史上最成功、最广泛使用的文件系统之一。
历史起源
| 时间 | 里程碑事件 | | — | — | | 1976年 | 微软购买86-DOS(原名为QDOS)的授权 | | 1977年 | FAT文件系统诞生 — 由 Marc McDonald 在微软设计实现,最初用于Microsoft Standalone Disk BASIC-86 | | 1981年 | MS-DOS 1.0发布,采用FAT12,支持5.25英寸160KB软盘 | | 1984年 | MS-DOS 2.0发布,引入子目录结构,支持硬盘分区 | | 1984年 | FAT16 随PC DOS 3.0和IBM PC/AT一同发布,支持更大容量 | | 1988年 | MS-DOS 4.0支持超过32MB的分区 | | 1996年 | Windows 95 OSR2 引入 FAT32,突破2GB容量限制 | | 2006年 | exFAT 随Windows CE 6.0发布,专为闪存设备优化 |
💡 类比理解:想象你搬进了一栋没有门牌号的公寓楼(空白磁盘)。FAT就像是在前台放置的住户登记表——每一行对应一个房间(簇),记录着这个房间是否空闲、住了谁、下一间房间在哪里。没有这个登记表,你就无法知道哪个房间有人住、哪个是空的。
设计者
FAT文件系统的原始设计者是 Marc McDonald,他是微软的第1号员工(Bill Gates和Paul Allen分别是第2号和第3号)。
1.2 FAT的版本演进
从FAT12到exFAT的演进之路
FAT家族每个版本都是为了解决前一代的容量限制而诞生的:
FAT家族演进树
1977 1984 1996 2006
| | | |
FAT12 ──────▶ FAT16 ──────▶ FAT32 ──────▶ exFAT
(8位时代) (16位时代) (32位时代) (64位时代)
| | | |
软盘时代 硬盘时代 大容量时代 闪存时代
最大16MB 最大2GB 最大2TB 最大128PB
└─────────────┴─────────────┴─────────────┘
|
向下兼容
四代FAT版本详细对比
| 特性 | FAT12 | FAT16 | FAT32 | exFAT | | — | — | — | — | — | | 诞生年份 | 1977 | 1984 | 1996 | 2006 | | 簇地址位数 | 12位 | 16位 | 28位* | 32位 | | 最大分区容量 | 16 MB | 2 GB (或4 GB) | 2 TB (理论8 TB) | 128 PB | | 最大文件大小 | 16 MB | 2 GB | 4 GB | 16 EB | | 每簇最大扇区数 | 64 | 256 | 64 | 2^25 | | 最小簇大小 | 512 B | 512 B | 512 B | 4 KB | | 最大簇大小 | 32 KB | 64 KB | 32 KB (通常) | 32 MB | | 最大簇数量 | 4,084 | 65,524 | ~268,435,456 | ~4,294,967,296 | | 根目录 | 固定512项 | 固定512项 (默认) | 动态大小 | 动态大小 | | 长文件名(LFN) | 不支持 | 支持 (Win95+) | 支持 | 原生支持 | | 文件时间戳精度 | 2秒 | 2秒 | 2秒 | 10毫秒 | | 引导扇区备份 | 无 | 无 | 有 (扇区6) | 有 (12个备份扇区) | | 可用簇计数 | 需扫描 | 需扫描 | FSInfo记录 | 启动扇区记录 | | 操作系统兼容性 | 几乎所有系统 | 几乎所有系统 | Win95+ / 现代OS | Win XP+ / 现代OS |
注:FAT32实际使用28位存储簇号,高4位保留,因此最大可用簇号为0x0FFFFFF7(约2.68亿个簇)。
各版本关键差异解析
FAT12 → FAT16 的跨越
核心变化:簇地址从12位扩展到16位。
- 12位的问题:最多只能寻址 2^12 = 4096 个簇。去掉保留值后,实际可用约4,084个簇。
- 实际影响:在360KB软盘上没问题(每簇512字节),但当硬盘容量超过32MB时,4,084个簇意味着每个簇必须大于8KB,造成严重的空间浪费。
- 解决方案:16位地址可以寻址 2^16 = 65,536 个簇,大幅提升了容量上限。
FAT12簇地址示意(1.5字节 = 12位)
字节0: 0x23 = 0010 0011
字节1: 0xF1 = 1111 0001
组合后的12位簇号 = 0x123 (第291号簇)
FAT16 → FAT32 的跨越
核心变化:簇地址从16位扩展到32位(实际使用28位),并取消了固定根目录区。
- 16位的问题:最大65,524个可用簇。对于2GB分区,每簇必须至少32KB,小文件浪费严重。
- 关键创新:
- 根目录不再是固定区域——根目录变成数据区中的一个普通簇链,可以像子目录一样动态增长。
- 引入FSInfo结构——专门记录空闲簇数量和下一个可用簇的位置,大幅优化了簇分配速度。
- 引导扇区有备份——FAT32在扇区6保存引导扇区的备份,提高了可靠性。
FAT32 → exFAT 的跨越
核心变化:全新设计,专为闪存优化,突破了4GB文件大小限制。
- exFAT虽然名字里还有”FAT”,但内部结构已与FAT12/16/32有很大不同。
- 引入了位图分配表(Allocation Bitmap),更适合闪存的写入特性。
- 原生支持长文件名、扩展时间戳精度、访问控制列表(ACL)。
取证价值:不同FAT版本的取证分析方法有细微但重要的差异。例如,FAT12需要处理1.5字节对齐的簇号解析,FAT32需要处理动态根目录和FSInfo结构。如果在取证分析中混淆了版本,可能导致文件定位错误。我们将在后续章节详细讲解每种版本的解析方法。
1.3 FAT文件系统的核心设计思想
两大支柱:链表式分配 + 簇化管理
FAT文件系统的全部设计可以归结为两个核心思想(链表式分配+簇化管理)。理解这两个思想,就等于掌握了FAT的精髓。
支柱一:簇(Cluster)作为最小分配单元
什么是簇?
簇是FAT文件系统管理磁盘空间的最小单位。一个簇由一个或多个连续的扇区组成(扇区通常是512字节)。
为什么要用簇而不是直接用扇区?
想象你在管理一个巨大的图书馆:
- 用扇区管理(逐本书管理):每本书(每个扇区)都需要一条记录。一个500GB的硬盘有约10亿个扇区,需要一个10亿行的表格。表格本身就占用了巨大空间,查询速度也极慢。
- 用簇管理(按书架管理):把相邻的书捆成一捆(簇),只需要记录每捆书的位置。如果每簇8扇区(4KB),表格行数减少到约1.25亿行——表格缩小了8倍。
簇大小与分区的关系:
| 分区容量 | FAT12 簇大小 | FAT16 簇大小 | FAT32 簇大小 | | — | — | — | — | | 0 – 16 MB | 512 B – 4 KB | — | — | | 16 MB – 128 MB | — | 2 KB | — | | 128 MB – 256 MB | — | 4 KB | — | | 256 MB – 512 MB | — | 8 KB | — | | 512 MB – 1 GB | — | 16 KB | — | | 1 GB – 2 GB | — | 32 KB | — | | 2 GB – 8 GB | — | 64 KB* | 4 KB | | 8 GB – 16 GB | — | — | 8 KB | | 16 GB – 32 GB | — | — | 16 KB | | 32 GB – 2 TB | — | — | 32 KB |
注:FAT16在Windows中最大支持32KB簇,但某些系统允许64KB簇,这会导致与一些工具的兼容性问题。
簇的编号规则:
簇0和簇1是保留簇,不用于存储数据。
- 数据从簇2开始。
- 簇号存储在FAT表中,每个簇号对应一个FAT表项。
支柱二:链表式文件分配
FAT的核心数据结构——文件分配表(File Allocation Table)
FAT表本质上就是一个巨大的数组,数组的索引就是簇号,数组的值就是下一个簇的簇号(或特殊标记)。
文件A (3个簇): 簇2 → 簇3 → 簇5 → 簇6 (EOF,文件结束)
文件B (1个簇): 簇4 (EOF)
文件C (2个簇): 簇8 → 簇10 → ...
空闲簇: 簇7 (FAT值为0x00000000)
FAT表中的特殊值:
| 值 (FAT12) | 值 (FAT16) | 值 (FAT32) | 含义 | | — | — | — | — | | 0x000 | 0x0000 | 0x00000000 | 空闲簇(未分配) | | 0x001 | 0x0001 | 0x00000001 | 保留值(不应出现) | | 0x002-0xFEF | 0x0002-0xFFEF | 0x00000002-0x0FFFFFEF | 已分配簇,值为下一个簇号 | | 0xFF0-0xFF6 | 0xFFF0-0xFFF6 | 0x0FFFFFF0-0x0FFFFFF6 | 保留值 | | 0xFF7 | 0xFFF7 | 0x0FFFFFF7 | 坏簇(标记为损坏) | | 0xFF8-0xFFF | 0xFFF8-0xFFFF | 0x0FFFFFF8-0x0FFFFFFF | 文件结束(EOF) |
目录项与FAT表的协作:
目录项(Directory Entry)记录文件的元数据(文件名、大小、时间戳等),以及文件内容的第一个簇号。FAT表则负责追踪从这个首簇开始的完整簇链。
步骤:
1. 在目录区找到 report.doc 的目录项 → 得知首簇是簇2
2. 查FAT表 FAT[2] → 值是5,表示下一个簇是簇5
3. 查FAT表 FAT[5] → 值是7,表示下一个簇是簇7
4. 查FAT表 FAT[7] → 值是EOF (0xFFFFFFFF),文件结束
5. 按顺序读取簇2、簇5、簇7的内容,组合成完整文件
取证价值:链表式分配的设计对取证分析有深远影响:
- 文件删除后的簇链残留:当文件被删除时,目录项的首字节被标记为0xE5,但FAT表中的簇链可能不会立即被清零(取决于操作系统)。这意味着即使文件已被删除,我们仍有可能通过残留的簇链恢复文件。
- 碎片化文件分析:文件的簇链揭示了文件在磁盘上的实际物理分布。通过分析簇链的模式,可以推断文件的写入历史——如果簇号连续,文件可能是在空闲磁盘上一次性写入的;如果簇号跳跃,说明磁盘在写入时已有大量碎片。
- 时间线分析:FAT表本身没有时间戳,但结合目录项的时间戳和簇的分配顺序,可以构建文件操作的时间线。
- 坏簇中的隐藏数据:标记为坏簇(0xFFFFFF7)的区域被操作系统忽略,但数据仍然存在于磁盘上。恶意用户可能故意将数据写入”坏簇”来隐藏证据。
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:SPEEDCoding 李北辰 李北辰《FAT文件系统-1.FAT文件系统概述》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。








评论