FAT(File Allocation Table,文件分配表) 是一种由微软在 1977 年设计的文件系统,核心思想极其简单:用一张"大表"记录每个数据块(簇)的下一个位置,把散落在存储介质上的数据块像串珠子一样链起来。
一、核心机制:三张表搞定一切
FAT 文件系统的结构可以概括为三个关键部分:
1. 引导扇区(Boot Sector)
存储介质最开头的 512 字节(或更多),包含:
- BPB(BIOS 参数块):记录分区总扇区数、每簇大小、FAT 表位置等元数据
- 启动代码:早期 PC 靠这里的一小段汇编代码加载操作系统
在嵌入式场景中,TI K3 的 BootROM 就是解析这个引导扇区,找到 FAT 表和根目录的位置。
2. FAT 表(File Allocation Table)
这是 FAT 文件系统的灵魂,本质上是一个数组,每个元素对应一个数据簇(Cluster):
- 如果值为
0xFFF7,表示这个簇坏了 - 如果值为
0xFFFF(FAT16)或0x0FFFFFFF(FAT32),表示这是文件的最后一个簇 - 其他值表示"下一个簇的编号"
举例:一个文件占用了簇 4、簇 7、簇 9
FAT[4] = 7 → 下一个簇是 7
FAT[7] = 9 → 下一个簇是 9
FAT[9] = 0xFFFF → 文件结束
3. 目录项(Directory Entry)
根目录或子目录中存放的文件"名片",每个文件/目录占 32 字节,记录:
- 文件名(8.3 格式:
TIBOOT3 BIN,或 FAT32 的长文件名扩展) - 文件大小
- 起始簇号(指向 FAT 表的入口)
- 创建/修改时间戳
读取文件的流程:
- 从目录项找到起始簇号(如簇 4)
- 到数据区读取簇 4 的内容
- 查 FAT 表,
FAT[4] = 7,跳到簇 7 - 查 FAT 表,
FAT[7] = 9,跳到簇 9 FAT[9] = 结束标记,读取完成
二、版本演进:从软盘到 SD 卡
| 版本 | 推出时间 | 簇号位数 | 最大分区 | 典型场景 |
|---|---|---|---|---|
| FAT12 | 1980 | 12 bit | 16 MB | 软盘(1.44MB) |
| FAT16 | 1984 | 16 bit | 2 GB | 早期硬盘、U 盘 |
| FAT32 | 1996 | 32 bit | 2 TB(实际 8 TB) | SD 卡、U 盘、嵌入式设备 |
| exFAT | 2006 | 64 bit | 128 PB | 大容量 SDXC 卡、闪存 |
关键区别:
- FAT12/16:根目录条目数固定(如 512 个),长文件名支持差
- FAT32:根目录可以动态扩展,支持更大分区,但单个文件不能超过 4 GB
- exFAT:微软专利(后来开源),专为闪存设计,取消了 FAT 表的固定区域概念,支持大文件和高效擦写
三、优缺点:为什么至今还在用?
优点(嵌入式场景尤其看重)
- 极简实现:BootROM 只需几百行代码就能完成 FAT 解析,不依赖复杂库
- 全平台兼容:Windows、Linux、macOS、相机、车载系统都能原生读写
- 无日志设计:写入操作直接修改 FAT 表,不需要像 ext4 那样维护复杂的日志(Journaling),代码量小
- 低内存占用:不需要在内存中维护庞大的元数据结构,适合 ROM 只有几十 KB SRAM 的场景
缺点
- 无权限管理:没有 Linux 的 rwx 权限、没有所有者概念,任何人都能读写
- 无日志保护:突然掉电时,如果正在修改 FAT 表,可能导致文件系统损坏(簇链断裂)
- 碎片化严重:文件增删频繁后,数据块散落在各处,影响大文件连续读取性能
- 空间浪费:小文件也会占用至少一个簇(通常 4KB~32KB),1 字节的文件也要占 4KB
四、为什么 BootROM 选择 FAT 而非 ext4?
回到你之前的场景------TI K3 BootROM 支持 SD 卡 FAT 启动,但不支持 ext4:
| 对比项 | FAT | ext4 |
|---|---|---|
| BootROM 代码量 | ~4 KB 可完成基础解析 | 需要几十 KB 的复杂驱动 |
| 依赖库 | 几乎零依赖 | 需要块层、VFS、日志层支持 |
| 启动速度 | 直接查表,O(1) 定位簇链 | 需要挂载、日志回放、索引节点遍历 |
| 开发便利性 | Windows 直接拖拽文件 | 需要 Linux 环境或专用工具 |
本质原因:BootROM 的 SRAM 通常只有 64 KB~256 KB,要同时放下:
- 自身代码
- 设备初始化驱动(SD/MMC 控制器)
- 文件系统解析逻辑
- 加载的启动镜像(tiboot3.bin 等)
FAT 的极简性使其成为**"在 ROM 阶段解析文件系统"的唯一现实选择**。ext4 的复杂度更适合 U-Boot 或 Linux 内核阶段去处理。
五、一句话总结
FAT 文件系统就是一张"簇链地图":目录项告诉你文件从哪个簇开始,FAT 表告诉你下一个簇在哪里,两者配合就能把散落在存储介质上的数据块按正确顺序串成一个完整文件。 它牺牲了大量高级特性(权限、日志、大文件),换来了极致的简单性和兼容性,这正是嵌入式 BootROM 选择它的根本原因。