文件系统的存储组织

以FAT32为例,对文件系统的存储组织原理进行介绍,了解其基本工作原理


1 内容概述

以FAT文件系统为例子,重点介绍文件系统下的存储空间组织与数据结构。


2 基础概念

2.1 存储基本单元

  1. 扇区:扇区是最小寻址单位,一般为512 bytes。
  2. 簇:一个“簇”由一组连续的扇区组成,簇所包含的扇区个数必须是 2 的整数次幂, 如: 1、2、4、8、16、32 或 64 。 “簇” 的最大值为64个扇区,即32kb。

为什么使用“扇区”与“簇”的概念而不直接使用byte为单位的地址寻址,我个人感觉主要是32位地址表达式下,最多4G空间,但是通过“扇区”与“簇”的扩展后可表示4G以上的空间范围。比如:FAT 文件系统之所以有12,16,32 不同的版本之分,其根本在于FAT 表用来记录任意一簇链接的二进制位数。以FAT16 为例,每一簇在FAT 表中占据2字节(二进制16 位)。所以,FAT16 最大可以表示的簇号为0xFFFF(十进制的65535),以32K 为簇的大小的话,FAT32 可以管理的最大磁盘空间为:32KB×65535=2048MB,这就是为什么FAT16 不支持超过2GB 分区的原因。
但是使用“扇区”与“簇”会导致存储空间的浪费,按照FAT文件系统的存储分配机制,文件内容不满一个“簇”时同样会分配一个“簇”。

2.2 整体存储结构

总体来讲FAT 文件系统可以分为三个部分:保留区(DBR)、FAT区和数据区。这三个区在建立文件系统(格式化)时即被创建,且在文件系统存续期间不可改变。
这里写图片描述
保留区: 保留区中包含一个重要的数据结构–系统引导扇区(DBR),DBR 位于文件系统的“0”号扇区,引导扇区中存储了其所在文件系统有关的重要信息。FAT12 和 FAT16 的保留区通常为1个扇区,也就是“引导扇区”本身;FAT32 的“保留区”则要多一些,并且除0号扇区的引导扇区外,还为其保留了一个“引导扇区”备份。
FAT区: 如上图所示整体结构中的“FAT 区” 由文件分区所具有的两个“(大小、结构内容相同的)FAT 表”组成,“FAT 区”紧跟在“保留区”之后。 “FAT 表” 用以描述“数据区”中的数据存储单元的分配状态以及为文件或目录内容分配的存储单元的前后连接关系。FAT 文件系统就是根据分区的相关DBR参数与DBR 中存放的已经计算好的FAT 表(2 份)的大小来确定的。格式化以后,跟目录的大小和位置其实都已经确定下来了。FAT表记录了磁盘数据文件的存储链表,对于数据的读取而言是极其重要的,以至于Microsoft为其开发的FAT文件系统中的FAT表创建了一份备份,就是我们看到的FAT2。FAT2 与FAT1 的内容通常是即时同步的,也就是说如果通过正常的系统读写对FAT1 做了更改,那么FAT2 也同样被更新。
FAT数据区: “FAT区” 结束后紧跟着的就是“数据区”,数据区被划分为一个个的“簇”,用于存储用户数据。“FAT数据区”使用“簇”进行管理,而FAT文件系统中非“数据区”的部分均使用“扇区地址”进行管理,而不能使用“簇”进行管理。


3 数据结构

FAT中有以下几类重要数据结构。

3.1 DBR信息

DBR区(DOS BOOT RECORD)即操作系统引导记录区的意思,通常占用分区的第0扇区共512个字节(特殊情况也要占用其它保留扇区,我们先说第0扇)。在这512个字节中,其实又是由跳转指令,厂商标志和操作系统版本号,BPB(BIOS Parameter Block),扩展BPB,OS引导程序,结束标志几部分组成。记录着文件系统在磁盘上的起始位置、大小、FAT 表的数量及大小等相关信息。这一部分按照规定的格式直接解析即可,具体参考对应的介绍资料。

3.2 文件分配表

描述文件系统内的“簇”的状态以及文件内容的前后连续关系(假若一个文件需要占用一个以上的簇,那么FAT表描述如何找到另外的“簇”);文件分配表于指明文件内容所占用的簇的前后连续关系(找到所占用的其他簇),并且说明了簇的分配状态。FAT12/16/32 三个阶段的FAT 文件系统的主要区别在于FAT 项的大小不同。文件占用“簇”的链接关系示意图(也就是文件分配表)如图2:
这里写图片描述
以FAT32为例进行说明:FAT表由一系列大小相等的FAT表项组成,它有如下特性:FAT32中每个簇的簇地址,使用32bit(4个字节)记录在FAT表中。FAT表中的所有字节位置以4个字节为单位进行划分,并对所有划分后的位置由0进行地址编号。0号地址与1号地址被系统保留并存储特殊标志内容。从2号地址开始,每个地址对应于数据区的簇号,FAT表中的地址编号与数据区中的簇号相同。我们称FAT中的这些地址为FAT表项,FAT表项中记录的值称为FAT表项值。当文件系统被创建,也就是进行格式化操作时,分配给FAT区域的空间将会被清空,在FAT1与FAT2的0号表项与1号表项写入特定值。由于创建文件系统的同时也会创建根目录,也就是为根目录分配了一个簇空间,通常为2号簇,所以2号簇所对应的2号FAT表项也会被写入一个结束标记。如果某个簇未被分配使用,它所对应的FAT表项内的FAT表项值即用0进行填充,表示该FAT表项所对应的簇未分配使用。当某个簇已被分配使用时,则它对应的FAT表项值也就是该文件的下一个存储位置的簇号。如果该文件结束于该簇,则在它的FAT表项中记录的是一个文件结束标记,对于FAT32而言,代表文件结束的FAT表项值为0x0FFFFFFF。如果某个簇存在坏扇区,则整个簇会用FAT表项值0x0FFFFFF7标记为坏簇,不再使用,这个坏簇标记就记录在它所对应的FAT表项中。一旦存储介质总体容量,扇区大小与簇大小确定后,FAT文件系统中文件分配表FAT的大小是确定的。

3.3 目录项

首先介绍根目录的概念,在FAT32文件系统中,根目录的位置不再硬性地固定,可以存储在分区内可寻址的任意簇内,不过通常根目录是最早建立的(格式化就生成了)目录表。所以,我们看到的情况基本上都是根目录的首簇紧邻FAT2,占簇区顺序上的第1个簇(即2号簇)。同时,FAT32文件系统将根目录当做普通的数据文件来看,所有没有了目录项数的限制,在需要的时候可以分配空簇,存储更多的目录项。FAT 文件系统的目录结构其实是一颗有向的从根到叶的树,这里提到的有向是指对于FAT 分区内的任一文件(包括文件夹),均需从根目录寻址来找到。可以这样认为:目录存储结构的入口就是根目录。再此声明一点:FAT32中将目录与文件同时视为文件。FAT 文件系统内的每个文件和文件夹都被分配一个目录项,这个目录项中记录了该文件或文件夹的,文件名、大小、创建时间、文件内容起始地址以及其他一些“元数据”,说明对应的文件的“起始簇号”。
从上面的描述可以知道,存储介质在FAT初始化时就已经确定了根目录的存放位置,在根目录和后续的目录或文件中存放的数据按以下的形式组成:
文件:通过该文件对应目录项中的“文件起始簇号高16位”与“文件起始簇号低16位”可以看到该文件数据的起始簇号,再结合文件分配表即可访问该文件所有数据。
目录:通过该目录对应目录项中的“文件起始簇号高16位”与“文件起始簇号低16位”可以看到该目录数据的起始簇号,而目录在FAT32中也当成文件处理,“目录文件”内的数据实际是一系列的目录项,这些目录项会枚举当前目录下所有的子目录与文件。
目录表的数据结构又分为以下两种:

3.3.1 短目录项

这里写图片描述

3.3.2 长目录项

在讲长文件目录项之前先来说一下FAT32的一个很重要的特性,支持长文件名。长文件名也是记录在目录项当中的,区别与短目录项的是,前者可能会占据好几个目录项。那么系统是如何判断当前目录项是短文件名目录项呢还是长文件名目录项,这里关键是看目录项的第12个字节的值,如果为0x0F时则系统认为是长目录项。而如果是旧版本的系统看到第12个字节是0x0F则认为是异常而忽略掉。这里可以回过头去看一下短文件名目录项,第12个字节是文件属性字节,0x0F即为全1是无效的,所以系统认为是异常。系统将长文件名以13个字符为单位进行切割,每一组占据一个目录项。所以可能一个文件需要多个目录项,这时长文件名的各个目录项按倒序排列在目录表中,以防与其他文件名混淆。
这里写图片描述


4 参考文献

《fat文件系统原理》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值