1.1 组织结构
1.1.1 FAT12/16与FAT32相同处
(1) FAT1/FAT2紧挨保留扇区之后
(2) FAT1/FAT2 中内容都是关于文件/目录的簇号连接。
(3) 数据区中文件和目录的属性。文件为用户的数据集。目录为文件和子目录的目录项集。
1.1.2 FAT12/16与FAT32不同处
(1) 保留扇区 FAT12/16 通常为1扇区 ,FAT32通常为32扇区
(2) DBR FAT12/16 只有一个 ,损坏不能恢复;FAT32有两个,损坏可以恢复
(3) FAT表项(簇号表示) FAT12 为 1.5个字节,FAT16 为 2个字节,FAT32 为 4个字节
(4) 尺寸,FAT12/16的FAT表扇区数,分区总扇区数通常用2个字节的数字表示,FAT32可用4个字节的数字表示。
(5) 根目录 FAT12/16 的根目录不属于数据区,通常由BPB中的RootEntCnt(根目录项数)决定尺寸大小(根目录尺寸固定,不可变化);FAT32属于数据区,通常由BPB中的RootClus (根目录起始簇号)决定,(根目录尺寸不固定,可变化)。
1.2 DBR
FAT12/16
1.3 FAT表
FAT1
1.4 目录项
1.4.1 Sector(目录项 (32 bytes))
1.4.2 短名目录项结构
1.4.3 长名目录项结构
1.4.4 短名目录项结构与长名目录项结构组合方式
连续,目录项间没用间隔其他项
Sample:
1.5 操作示意图
1.5.1 文件与目录的区别:
(1)目录项中属性不同,文件有文档属性(0x20),目录有目录属性(0x10);文件一般有尺寸属性,目录没有尺寸属性,该项为0
(2)数据区不同,文件的数据区为文件数据;目录的数据区为子目录和文件的目录项(包括已用、未用、删除),没有数据信息。
1.5.2 文件/目录搜索
无论打开、创建、删除 文件或目录,都有针对层级目录的匹配项的搜索;然后再对最低一层的对象(文件或目录的目录项)的搜索。
举个例子 例如要 打开 E:/Sdio/filesys/FileSystem_0811_Doc0.5/SourceCode_v0.5_/UcFs.doc
(1) 首先根据E:的BPB参数计算出根目录的物理扇区号,扇区数(FAT12/16)或根目录起始簇号,通过搜索FAT表得出簇数,转换成物理扇区号,扇区数(FAT32)。
(2) 在根目录的扇区尺寸内,搜索第一级目录项Sdio。如果没有匹配目录项(FAT格式名字一致,属性一致--文档或目录属性),表示文件或目录不存在,搜索失败。如果有匹配目录项,取出Sdio目录项的首簇号,通搜索FAT表得出Sdio占用的簇数,转换成物理扇区号,扇区数。
(3) 在目录Sdio的扇区尺寸内,搜索第二级目录项filesys。如果没有匹配目录项(FAT格式名字一致,属性一致--文档或目录属性),表示文件或目录不存在,搜索失败。如果有匹配目录项,取出filesys目录项的首簇号,通搜索FAT表得出filesys占用的簇数,转换成物理扇区号,扇区数。依此类推,直到SourceCode_v0.5_级目录。
(4) 在目录SourceCode_v0.5_的扇区尺寸内,搜索最后一级的目录项UcFs.doc。如果没有匹配目录项(FAT格式名字一致,属性一致--文档或目录属性),表示文件或目录不存在,搜索失败。如果有匹配目录项,搜索成功。
1.6 文件操作:
1.6.1 创建
(1) 搜索上级目录(递归),通过上级目录的目录项的首簇号在搜索FAT表,得出上级目录的尺寸。
(2) 在上级目录的数据区寻找有无该文件的目录项,如果有,到2.6.2删除之
(3) 在上级目录的数据区寻找空闲的目录项,如果已饱和(目录项都已用完),给上级目录增加一个空闲簇(通过搜索FAT)。目录项的文件名设为文件名;属性设为包含文档的属性(0x20),其余可选; 文件尺寸属性设为0。
(4) 从FAT表搜索一个可用空闲簇,作为文件的首簇号,首簇号对应的标志设为文件结束。首簇号填入文件的目录项。
1.6.2 删除
(1) 搜索上级目录(递归),通过上级目录的目录项的首簇号在搜索FAT表,得出上级目录的尺寸。
(2) 搜索文件在上级目录的目录项,将目录项第一个字节设为0xe5
(3) 通过首簇号搜索FAT表簇链,依次将各个簇的簇号设为0
1.6.3 打开
(1) 搜索上级目录(递归),通过上级目录的目录项的首簇号在搜索FAT表,得出上级目录的尺寸。
(2) 搜索文件在上级目录的目录项,找到文件的首簇号,和文件尺寸。
1.6.4 读
(1) 根据文件位置指针和要读的字节数,确定要读的簇数。
(2) 根据文件的首簇号, 搜索FAT表,到文件位置所在的簇,如果文件指针不在簇的扇区起始处,将该簇对应的数据读出,取部分数据反馈给用户的buffer,其余按扇区读出,直到一簇读完。簇数减1。
(3) 搜索下一簇号,将下一簇对应的数据读出,簇数减1,如果最后一簇的数据不满一个扇区,取部分数据反馈给用户的buffer。
(4) 重复(3)直到簇数为0 或文件结束。更新文件内位置指针。
1.6.5 写
(1) 根据文件位置指针和要写的字节数,确定要写的簇数。
(2) 文件的首簇号,搜索FAT表,到文件位置所在的簇,如果文件指针不在簇的扇区起始处, 先将该扇区对应的数据读出, 将部分数据填入,写入该扇区, 其余按扇区写入,直到一簇写入。簇数减1
簇数减1
(3) 搜索下一簇号,将下一簇对应的数据写入,簇数减1,如果最后一簇的数据不满一个扇区,先将该扇区对应的数据读出, 将部分数据填入,写入该扇区。
(4) 重复(3)直到簇数为0。更新文件内位置指针及文件尺寸。
1.6.6 设置文件位置指针
1.7 目录操作:
1.7.1 创建
(1) 搜索上级目录(递归),通过上级目录的目录项的首簇号在搜索FAT表,得出上级目录的尺寸。
(2) 在上级目录的数据区寻找空闲的目录项,如果已饱和(目录项都已用完),给上级目录增加一个空闲簇(通过搜索FAT)。目录项的文件名设为目录名;属性设为包含目录的属性(0x10),其余可选; 文件尺寸属性设为0。
(3) 从FAT表搜索一个可用空闲簇,作为目录的首簇号。首簇号填入目录的目录项。
(4) 清空该簇下所得目录项。(和文件不同)
1.7.2 删除
(1) 搜索上级目录(递归),通过上级目录的目录项的首簇号在搜索FAT表,得出上级目录的尺寸。
(2) 搜索文件在上级目录的目录项,将目录项第一个字节设为0xe5
(3) 通过首簇号搜索FAT表簇链,依次将各个簇的簇号设为0
1.7.3 打开
(1) 搜索上级目录(递归),通过上级目录的目录项的首簇号在搜索FAT表,得出上级目录的尺寸。
(2) 搜索目录在上级目录的目录项,找到文件的首簇号
(3) 搜索FAT表,得出该目录的尺寸
1.7.4 读目录项
(1) 根据子目录项索引,搜索已占用的目录项,找到相应的目录项
(2) 读出目录名和各属性。
1.7.5 写目录项 (rename)
(1) 根据子目录项索引,搜索已占用的目录项,找到相应的目录项
(2) 写入目录项目录名和各属性。
1.7.6 设置子目录项位置指针
1.8 杂项
1.8.1 格式化分区