fat文件系统如何写入数据,FAT 目录项 写入流程

题图来自Unsplash,基于CC0协议
导读
首先选择一个FAT文件系统格式化的存储设备,该设备可能包含FAT表(File Allocation Table)、目录项和数据区等结构。写入数据时遵循以下步骤
- 文件定位:通过宿主操作系统API或底层驱动,告知文件系统需要写入的数据长度和起始目录。文件系统通过目录项找到目标目录结构,其结构包含该目录下所有文件/目录的首簇编号和元数据。
- 块分配:文件系统管理FAT表和可能存在的簇链管理结构(如FAT12/FAT16的空闲簇表或FAT32的FAT32保留区/LCN表)。它确定需要多少簇来存储文件数据,通过标志哪些簇已被占用或从空闲簇列表中分配连续簇链(根据FAT类型不同采用不同分配策略,如FAT32支持分配非连续簇链)。
- 首簇计算:根据分配的簇链信息,计算数据存储的起始簇地址。
- 数据填充:应用程序提供数据块,文件系统将数据写入到数据区的指定簇中。
- FAT更新:完成数据写入后,必须更新将被本次操作使用的FAT表项。如果数据跨簇存储,还需将描述簇间连接的FAT项更新为指向下一个数据簇的编号(在FAT表中名为"运行簇号")。
- 目录项修改:文件系统必须将新文件的目录项(位于数据区之前的一张逻辑表)进行更新。在该目录项中写出计算得到的首簇簇号,并更新文件大小、创建/修改时间等元数据。
- 标志簇:对于文件末尾,需要在最后一个数据簇的位置写入一个特殊的FAT条目(如FAT12/FAT16中的0xFFF或0x800FFFF等,对FAT32是0xFF...FFFF,具体值取决于FAT类型),表示该簇之后没有更多数据。
FAT文件系统的更新机制依赖读写时直接操作其核心元数据:
- 文件分配表 (FAT):FAT是FAT文件系统的核心,其每个表项表示一个簇的分配状态和下一簇链接关系(若文件未结束)。
- 更新时机:主要在文件写入(分配簇、修改数据)、删除文件(标记簇为空闲)、格式化、物理扇区重组(磁盘碎片整理)等场景更新。
- 更新方法:
- 分配:当需要写入文件时,创建目录项并分配簇链,通过遍历空闲簇表或直接在FAT表中查找可用簇号,标记已分配的簇。
- 修改:将写入的数据保存,并修改对应的目录项中的文件大小和物理地址(首簇)信息。
- FAT项更新:分配簇后,写入数据簇的同时,将FAT中对应簇前一项的运行簇号更新为新簇或数据末尾的结束标志,更新新簇自身的FAT项指向下一簇或结束标志。
- 文件删除:将文件对应的目录项标记为"删除"(只修改部分字段,不立即擦除数据,依赖时间推移被回收)。严重的是,删除文件会导致其占用的簇链上的FAT项未被重置,标志着簇被占用但文件已删除,形成了垃圾簇。数据虽可能被新文件覆盖但仍有残留。
簇链是FAT文件系统存放实际数据的载体。其修改方法主要是:
- 数据块写入:应用数据块写入到集群所代表的扇区中。
- 修改FAT:在每个数据簇(除最后一个)所在的FAT条目中,记录下一个簇的簇号,从而构建起逻辑上的连续关系,即簇链。最后一个数据簇对应的FAT条目则被设置为结束标志。
目录项是FAT文件系统中描述文件的基础信息单元,其写入流程包括:
- 选择目标目录:确定文件存放的目录。
- 分配空间:为目录项本身及其空闲的小簇(如果使用了小簇文件分配)在数据区中分配空间。
- 创建结构:初始化目录项结构,按特定顺序(例如基于ASCII顺序)记录文件名(根据FAT类型支持8.3名或Unicode)以及文件属性(只读、隐藏、系统、存档等)、创建时间、访问时间、控制属性(只读/隐藏/系统、存档位控制)和文件大小等。
- 设置首簇:在目录项中填入通过上述分配过程得到的起始簇簇号。
- 写入:将新创建的目录项和可能关联的数据(如图标信息)及对应的数据簇写入到数据区。同时,要更新这些新簇在FAT表中对应的项,构建正确的位置,并在目录项中更新文件大小。
FAT文件系统存在多个变种(FAT12, FAT16, FAT32),它们在处理写入过程的本质机制上(如都需要目录项、数据簇、FAT表)相似,但关键区别在于:
- 簇号宽度:FAT12用12位表示簇号,适用于小存储器如软盘;FAT16用16位,适用于硬盘,支持更大容量但仍有限制(2GB文件和8GB磁盘);FAT32用32位表示簇号,允许支持更大的磁盘分区和文件。
- 写入过程差异:簇链的长度和分布方式会根据磁盘容量和FAT类型的不同而变化。FAT32采用更加复杂的分配策略,如支持非连续分配或使用簇链列表。数据在扇区内存放位置的选择也取决于FAT类型和底层逻辑。
- 簇号表示:在FAT表中,簇号需根据FAT类型进行位截断或定位(如FAT12的12位需从高位截断至16位字段)。FAT32的32位需要对齐到块大小可能导致非连续写入,增加扇出操作。这些差异反映在簇的选择、FAT项更新方式和可能使用的高级功能的实现上。
FAT文件系统底层写入数据的过程是基础但关键的数据存储机制。简单说来,它涉及在正确的位置存放数据块,并通过修改FAT表和目录项来记录数据的位置、文件大小以及如何读取。理解这个过程对于深入理解文件系统底层逻辑以及进行嵌入式系统开发或底层存储操作非常有帮助。
© 版权声明
本文由盾科技原创,版权归 盾科技所有,未经允许禁止任何形式的转载。转载请联系candieraddenipc92@gmail.com