FAT是一种用数组实现的磁盘空间映射机制,以簇为单位通过值表示空闲、下一簇、EOF或坏簇;支持双备份、位图加速,但不存权限等元数据,以简单性与可预测性见长。

文件分配表(FAT)本质上是一种用数组结构实现的磁盘空间映射机制。它不依赖复杂索引或树结构,而是用一个连续的整数数组——每个元素对应一个簇(cluster),值则表示该簇的后续链接关系。这种设计让 FAT 在嵌入式设备、U 盘、SD 卡等资源受限场景中依然高效可靠。
FAT 数组如何表示磁盘空间状态
FAT 的核心是一张“簇链表数组”,索引是簇号,内容是下一个簇号或特殊标记:
- 值为 0:该簇空闲,尚未被任何文件占用
- 值为非零正整数(如 5):该簇数据后紧接着簇 5,构成文件的数据链
- 值为 EOF 标记(如 FAT16 中的 0xFFF8–0xFFFF):当前簇是文件最后一个簇
- 值为坏簇标记(如 0xFF7):该簇物理损坏,不可用
用编程语言模拟 FAT 数组的典型操作
以 Python 列表模拟一个 16 簇的小型 FAT16 表(简化版):
fat = [0] * 16 # 初始化全空闲fat[0] = 0xFF8 # 根目录起始簇 0,且是末尾簇
fat[1] = 2 # 文件从簇 1 开始,下一个是簇 2
fat[2] = 3 # 簇 2 后是簇 3
fat[3] = 0xFF8 # 簇 3 是该文件结尾
这样就构建出一条长度为 4 簇的文件链(1→2→3→EOF)。遍历只需从起始簇出发,持续查表直到遇到 EOF。
元数据管理中的关键约束与应对
FAT 数组虽简单,但实际元数据管理需兼顾一致性与效率:
- 双 FAT 备份:为防损坏,FAT 区域通常保留两份相同副本,写入时需同步更新
- 簇位图辅助定位:仅靠 FAT 查找空闲簇较慢,系统常另维护一个位图数组(如 bitmap[16]),快速扫描 0 值位置
- 不支持硬链接和权限字段:FAT 数组只管“哪里连到哪里”,文件名、时间戳、读写属性等由目录项单独存储,不在 FAT 数组中体现
与现代文件系统元数据结构的对比启示
FAT 的数组模型凸显了元数据设计的核心取舍:
- Ext4 使用 inode 表 + 块位图 + 日志,支持权限、扩展属性、日志恢复,但结构复杂、开销大
- exFAT 改用 FAT 表 + 额外的簇分配位图 + 时间戳扩展区,在保持 FAT 易实现优势的同时,支持大于 4GB 单文件和 UTC 时间
- 数组式 FAT 的真正价值不在功能丰富,而在于可预测性:内存占用固定、查找路径确定、无碎片整理依赖

















