FAT 文件系统设计思想

1.1    组织结构

 

1.1.1   FAT12/16FAT32相同处

(1)       FAT1/FAT2紧挨保留扇区之后

(2)       FAT1/FAT2 中内容都是关于文件/目录的簇号连接。

(3)       数据区中文件和目录的属性。文件为用户的数据集。目录为文件和子目录的目录项集。

1.1.2   FAT12/16FAT32不同处

(1)       保留扇区   FAT12/16 通常为1扇区 FAT32通常为32扇区

(2)       DBR   FAT12/16 只有一个 ,损坏不能恢复;FAT32有两个,损坏可以恢复

(3)       FAT表项(簇号表示)  FAT12 1.5个字节,FAT16 2个字节,FAT32 4个字节

(4)       尺寸,FAT12/16FAT表扇区数,分区总扇区数通常用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   格式化分区

 

1.8.2   查看可用数据区总量

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值