实践过程中对文件系统代码的理解

📅 2026/8/15 10:56:32
实践过程中对文件系统代码的理解
创建文件在 exFAT 文件系统中当根目录簇已满时创建文件的过程如下生成文件名后执行pf_open(path, lfn, fat_file, mode)函数。调用dir_register(dj, lfn)创建文件目录项。对于 exFAT 文件系统需要确定文件名所需的目录项数量。通过dir_register_exfat - dir_alloc - dir_next - create_chain寻找空闲簇将其作为根目录簇链的新簇尾。接着dir_register_exfat - dir_alloc - dir_next将新分配的根目录簇尾数据区清零。pf_open执行完毕文件目录结构创建完成。写入数据时fs_write - pf_write - create_chain为待写入数据寻找空闲簇并在簇位图和 FAT 表中进行标记。随后fs_write - pf_write - disk_writep将数据写入已分配的簇。最后调用fs_close结束文件写入操作至此文件创建全部完成。以下是exFAT文件系统在根目录簇已满时创建文件的完整流程图是否生成文件名执行 pf_open(path, lfn, fat_file, mode)调用 dir_register(dj, lfn) 创建文件目录项是否为 exFAT 文件系统?确定文件名所需目录项数量dir_register_exfat - dir_alloc - dir_next - create_chain寻找空闲簇作为根目录簇链新簇尾dir_register_exfat - dir_alloc - dir_next将新分配的根目录簇尾数据区清零其他文件系统处理流程pf_open 执行完毕文件目录结构创建完成写入数据: fs_write - pf_write - create_chain为数据寻找空闲簇标记簇位图和 FAT 表fs_write - pf_write - disk_writep将数据写入已分配的簇调用 fs_close结束文件写入操作文件创建全部完成重要函数功能介绍以下是对 FAT/exFAT 文件系统中关键函数的简要说明put_fat(簇号, 值)修改 FAT 表中指定簇号对应的值。当某个簇被占用后需要调用此函数更新 FAT 表。对于 exFAT 文件系统还需要同步修改簇位图Bitmap。get_fat(簇号)获取 FAT 表中指定簇号位置记录的值。pf_unlink(DIR *目录)通过文件的首目录项删除文件。DIR结构体解析DIR结构体用于存储文件目录项信息。其关键字段包括sect文件目录项所在的扇区号。index文件目录项在扇区中的起始地址偏移量。dir_next(DIR *dj, int stretch)获取相邻的下一个目录项。sync_window(fs)将缓存中尚未写入扇区的数据同步写入磁盘。remove_chain(fs, 簇号, 长度)删除指定长度的簇链。此函数会修改 FAT 表对于 exFAT 还会修改簇位图从而实现释放簇空间的作用。get_clust(BYTE *dir)从目录项中解析并获取文件数据的起始簇号。pf_readdir(DIR *dj, FILINFO *fno)通过目录项信息获取文件信息例如文件名、文件属性是文件还是文件夹、文件的首目录项信息等。调用后dj会指向相邻的下一个文件目录项。利用这一特性可以循环调用pf_readdir来遍历当前目录下的所有文件。pf_opendir_exist(DIR *dj, FILINFO *fno)打开一个已存在的文件夹dj将存储该文件夹中第一个文件的首目录项。pf_rootdir(DIR *dj)打开根目录dj将存储根目录的第一个目录项。move_window(fs, 扇区)将指定扇区的数据读取到文件系统对象fs的win缓存数组中。与disk_read的区别在于move_window会先检查缓存中是否有未写入的数据如果有则先将其写入磁盘然后再读取新数据。CLUST get_next_free(u32 scl)参数scl是簇链的末尾簇号。此函数的作用是寻找一个空闲簇并返回其簇号。DWORD create_chain(fs, 簇号)通过调用get_next_free寻找一个空闲簇然后使用put_fat将该空闲簇设置为簇链的新簇尾并更新原簇尾指向这个新簇从而扩展簇链。文件属性时间属性存储位置FAT32 文件系统文件的修改时间属性存储在第一个短文件名目录项的0x16-0x19偏移处占用四个字节。exFAT 文件系统文件的修改时间属性存储在第一目录项的0x0C偏移处同样占用四个字节。文件结构数据与目录项一个文件在文件系统中主要分为两部分文件数据和目录项。以下是工作中常用的关键信息exFAT 文件系统的目录项结构第一个目录项32字节存储时间类属性如创建、修改时间以及附属目录项的数量。第二个目录项32字节存储文件碎片标志、起始簇号和文件长度。通过此目录项可以定位到文件数据在磁盘上的具体位置。第三个及后续目录项存储文件名。簇的管理机制exFAT 文件系统第一个簇的编号为2用于存储簇位图Bitmap。通过FAT 表和簇位图共同管理簇的分配状态。簇位图中每一个 bit 位代表一个簇1表示该簇已被占用0表示空闲。FAT 表中记录0xFFFFFFFF表示该簇是簇链的结尾。记录0时如果在连续的簇链范围内则表示下一个簇是物理上相邻的簇在其他上下文中0也可能代表空闲簇。根目录的位置可以在DBRDOS Boot Record信息中查到。结合 FAT 表可以确定存储根目录的簇。根目录本身也是通过簇链存储的。当根目录下的文件过多一个簇存储不下时系统会申请一个空闲簇组成簇链来存储目录项。FAT32 文件系统第一个簇的编号为0根目录位于簇 2。同样当根目录下的文件过多一个簇存储不下时系统会申请一个空闲簇组成簇链来存储目录项。文件夹结构文件夹由目录项和数据区两部分组成。文件夹的数据区存储的是该文件夹下所有文件的目录项。删除文件操作删除文件的具体操作是修改文件目录项的首字符通常标记为删除状态。修改FAT 表释放该文件所占用的簇链。