FAT文件系统:嵌入式设备的极简选择

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 表的入口)
  • 创建/修改时间戳

读取文件的流程:

  1. 从目录项找到起始簇号(如簇 4)
  2. 到数据区读取簇 4 的内容
  3. 查 FAT 表,FAT[4] = 7,跳到簇 7
  4. 查 FAT 表,FAT[7] = 9,跳到簇 9
  5. 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 表的固定区域概念,支持大文件和高效擦写

三、优缺点:为什么至今还在用?

优点(嵌入式场景尤其看重)

  1. 极简实现:BootROM 只需几百行代码就能完成 FAT 解析,不依赖复杂库
  2. 全平台兼容:Windows、Linux、macOS、相机、车载系统都能原生读写
  3. 无日志设计:写入操作直接修改 FAT 表,不需要像 ext4 那样维护复杂的日志(Journaling),代码量小
  4. 低内存占用:不需要在内存中维护庞大的元数据结构,适合 ROM 只有几十 KB SRAM 的场景

缺点

  1. 无权限管理:没有 Linux 的 rwx 权限、没有所有者概念,任何人都能读写
  2. 无日志保护:突然掉电时,如果正在修改 FAT 表,可能导致文件系统损坏(簇链断裂)
  3. 碎片化严重:文件增删频繁后,数据块散落在各处,影响大文件连续读取性能
  4. 空间浪费:小文件也会占用至少一个簇(通常 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 选择它的根本原因。

相关推荐
Rabitebla10 分钟前
【系统性学习笔记】Linux 权限篇(二):文件属性、权限修改与目录权限的底层逻辑
linux·c++·笔记·学习·算法
深圳老胡39 分钟前
STM32CubeMX 2 与 STM32CubeMX 的主要区别
笔记·stm32·单片机·代码规范
BSD_CGQ1 小时前
FSR 压力传感器 I2C 接口实战:地址规划与 MCU 软件滤波的工程取舍
嵌入式硬件·机器人·压力传感器·柔性薄膜压力传感器
゛凌乱的记忆づ2 小时前
50元从零到成品:一套AI辅助的嵌入式实战入门教程——IIC篇
人工智能·stm32·单片机·嵌入式硬件
叼烟扛炮2 小时前
Linux 学习笔记(十三):高效排错利器——GDB 调试器入门
linux·笔记·学习
创界工坊工作室3 小时前
54-基于STC89C52控制的智能运输小车设计
stm32·单片机·嵌入式硬件·51单片机·proteus
Source.Liu3 小时前
【A11】服务器数据库结构笔记
服务器·数据库·笔记
iCxhust3 小时前
NTC温度测量计算
单片机·嵌入式硬件·51单片机·热力计算
沐欣工作室_lvyiyi3 小时前
基于单片机的汽车智能座舱控制系统的设计与实现(论文+源码)
单片机·嵌入式硬件·汽车·智能座舱
1314lay_10074 小时前
ABAP 读取服务器的文件 OPEN DATASET,READ DATASET f_filepath INTO l_file.
经验分享·笔记