文件系统1:FAT

2022/4/18 23:13:05

本文主要是介绍文件系统1:FAT,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

在磁盘及分区介绍了如何分区,现在到达第三阶段,如何格式化这些分区,本节介绍FAT格式
FAT格式主要有三种:FAT2,FAT16,FAT32
FAT 文件系统之所以有 12,16,32 不同的版本之分,其根本在于FAT表用来记录任意一簇链接的二进制位数,这里主要介绍FAT16和FAT32

当把一部分磁盘空间格式化为FAT文件系统时,FAT文件系统就将这个分区当成整块可分配的区域进行规划,以便于数据的存储。FAT将磁盘空间按一定数目的扇区为单位进行划分,这样的单位称为簇。通常情况下,每扇区512字节的原则是不变的。簇的大小一般是\(2^n\)个扇区的大小,像512B,1K,2K,4K,8K,16K,32K,64K。实际中通常不超过32K。之所以簇为单位而不以扇区为单位进行磁盘的分配,是因为当分区容量较大时,采用大小为512b的扇区管理会增加FAT表的项数,对大文件存取增加消耗,文件系统效率不高。所以分区的大小和簇的取值是有关系的。

注:在文件系统内说的扇区数,并不是物理磁盘上的扇区数,两者不一样,这里的是逻辑上磁盘的扇区数,物理上是磁道,盘面,扇区(扇区是从1开始计数),而逻辑上只有扇区(从0开始计数)

FAT16

FAT16文件系统从根目录所占的32个扇区之后的第一个扇区开始以簇为单位进行数据的处理

分为5个部分:DBR区,FAT1表,FAT2表,根目录区和数据区

DBR区

即操作系统引导记录区(引导扇区),共512个字节,也就是相对于分区H的第一个扇区

偏移 意义
0x00-0x02 跳转指令,为了跳过之后不可执行的数据(跳到引导程序代码)
0x03-0x0A 厂商名称和版本号
0x0B-0x0C 一个扇区字节数
0x0D 每簇的扇区数量
0x0E-0x0F FAT表的起始扇区号(相对于分区)
0x10 FAT表的个数
0x11-0x12 根目录项数
0x13 该分区上的扇区数,如果扇区数大于65536,该字段为零,寻要用大扇区数表示
0x15 介质描述符,F8表示硬盘
0x16 每个FAT表的扇区数
0x18-0x19 每磁道扇区数
0x1A-0x1B 磁道数
0x1C-0x1F 隐含扇区,该分区之前的扇区数,该分区的起始扇区号
0x20-0x23 该分区的总扇区数,如果扇区数小于65536,该字段为零,寻要用小扇区数表示
0x24 物理驱动器号,80表示硬盘
0x26 扩展引导标签,值必须为28或29
0x27 随机序号,有助于区分磁盘
0x36 文件系统类型
0x5E-0X3D 引导程序代码
0x1FE-0x1FF 有效结束标志55AA

这里使用该磁盘2为例,它采用MBR分区,格式化为FAT16,只有一个分区H

这里就不直接点击软件DiskGenius找分区H了,通过查找磁盘MBR中的分区表来找(如下图),在磁盘2的0扇区的MBR分区表中的第一个16个字节中的8-11个字节为11 00 00 00(小端)表示分区起始扇区号,为17,所以转到17扇区,就为分区H的数据

该分区的第一个扇区也就是DBR区,该扇区的数据如下图,其中红色划线为跳转指令,红色框处为厂商名称和版本号,黑色框处为结束标志,紫色为引导代码,没有颜色为一些参数信息

FAT表

FAT1表与FAT2表同步更新,内容一样

前两个字节(这里16比特位一个字节)表示FAT表的标识F8FFFFFF
之后每1个字节表示一个FAT表项,簇号起始的编号就为2,每个FAT表项记录下一个簇号
第2簇存储根目录文件
FFFF表示文件或目录的结束簇号
FFF7表示坏簇

还是以磁盘2的分区H为例,DBR区中0E-0F偏移处值为8,在加上分区从17扇区开始,所以FAT1开始扇区为25,以下为扇区25的数据
可以看到偏移3204-3205处为2号簇,值为FFFF,说明此文件就占一个簇,之后的3,4,5,6号簇都如此,在7号簇,值为0008,表示下一个簇为8号簇,在8号簇,值为0009,表示下一个簇为9号簇,然后依次下去。
这里看起来好像是顺序存放的,但其实是链式结构,即一个文件的存储是靠当前簇链接到下一簇,存放不一定按顺序,比如该文件存在5号簇和7号簇,而5号簇是指向7号簇的。

根目录区

根目录区由多个目录项组成,共512个目录项,占32个扇区,分为短文件名目录项和长文件名目录项
如果文件名不超过8个字符,用0x20填充,再加扩展名,此时使用短文件名目录项来存储
如果文件名超过8个字符则会被截断,取前六个字符加“~1”,再加扩展名,如果有重名的“~1”中的1加1,此时会使用短文件名目录项和长文件名目录项来存储

开始的时候FAT16不支持长文件名目录项,后来FAT32支持,所以FAT16的短文件名目录项与FAT32不同,但长文件名目录项完全相同

短文件名目录项

偏移 意义
00-07 文件名的ASCII码(字母的大写),如果文件被删除,第一个字节被修改为E5
08-0A 扩展名
0B 文件属性,01只读,00读写,02隐藏,04系统,08卷标,10目录,20存档,0F长文件名
0C-15 保留
16-17 最后修改时间
18-19 最后修改日期
1A-1B 文件起始簇
1C-1F 文件的大小字节数

长文件名目录项

偏移 意义
00 状态,E5表删除,01,02等表示序号,如果0变为4,表示这是最后一个目录项(一个长文件名目录项有多个目录项)
01-0A 长文件名的第1-5个字符
0B 值为0F,长文件名目录项标志
0D 校验和
0E-19 文件名第6-11个字符
1C-1F 文件名的第12-13个字符

还是以磁盘2的分区H为例,FAT1开始扇区为25,DBR区中0x16偏移处值为60(FAT表含有扇区数)所以根目录区从25+60*2=145(有两个FAT表)开始

先从第二个目录项看,起始值为42,看到4就知道这是一个长目录项的最后一个目录项,2表示这个长目录项只有两个目录项,它是第2个(绿框),蓝框为第一个长目录项。再看短目录项。

00-07为53 59 53 54 45 4D 7E 31
20 20 20:这是个目录,没有类型
0B为16:隐藏的系统子目录
16-17为45 A0:最后修改时间
18-19为8D 54:最后修改日期
1A-1B为02 00:也就是起始簇为第2个簇
1C-1F为00 00 00 00:文件的大小字节数

数据区

所有文件,目录数据都在此处,数据区以簇为单位进行管理,第一个簇称为“2号簇”,根目录文件在“2号簇”。由上知根目录区从145扇区开始,加上32个扇区,为177扇区,这就是数据区的开始扇区,也就是2号簇的起始。
上面举例的那个位于第2个簇的文件其实就是一个位于根目录的缓存文件,也就是在177扇区,数据如下

但是这个文件是一个目录,对于文件夹的数据,其前面也存在两个目录项,一个是子目录本身,一个是父目录
其00-0A偏移的值分别为2E 20 20 20 20 20 20 20 20 20 20 和2E 2E 20 20 20 20 20 20 20 20 20 ,即分别表示 . 和 ..
根目录下的文件夹,父目录簇号是0,别的文件夹下的文件夹,其父目录就是父目录所在的簇号。所以上图中子目录本身的簇号为00 00 00 02就是2簇,父目录簇号为00 00 00 00(最下面两个黑框)就是0,其父目录就是根目录

FAT32

分为6个部分:DBR区,保留区,FAT1表,FAT2表,根目录区和数据区
FAT32相对于FAT16区别不大,DBR有些许不同,增加了保留区,FAT表是32位表示一项

DBR区

位于分区的第一个扇区(再次强调:是相对于分区,不是相对于磁盘,磁盘的第一个分区,就是总体的0分区,是MBR,如果相对于磁盘,DBR是128扇区,从MBR参数中可以知道),与FAT16几乎相同

偏移 意义
0x00-0x02 跳转指令,为了跳过之后不可执行的数据(跳到引导程序代码)
0x03-0x0A 厂商名称和版本号
0x0B-0x0C 扇区字节数,这里为0x0200即512B
0x0D 每簇的扇区数量,这里为2
0x0E-0x0F FAT表的起始扇区号(相对于分区)
0x10 FAT表的个数
0x15 介质描述符
0x18-0x19 每磁道扇区数
0x1A-0x1B 磁头数
0x1C-0x1F 隐含扇区,该分区之前的扇区数,该分区的起始扇区号
0x20-0x23 文件系统的总扇区数
0x24-0x27 FAT表的大小
0x2C-0x2F 根目录所在簇号(在相对于数据区)
0x30-0x31 文件系统信息扇区号
0x32-0x33 DBR备份引导扇区号
0x40 BIOS设备80是硬盘,00是软盘
0x42 扩展引导标记
0x43-0x46 卷序列号
0x52-0x59 文件系统格式
0x5A-0x1FD 引导程序代码,操作系统的引导代码
0x01FE-0x01FF 有效结束标志

保留区

在相对于分区的第2扇区

偏移 意义
0x00-0x03 引导标志为“RRaA”
0x1E8-0x1EB 空闲簇数
0x!EE-0x1EF 下个可用簇

以该磁盘3为例,只有一个分区I,被格式化为FAT32

其DBR区数据如下

在DBR中0x0E-0x0F表示FAT表的起始扇区号(红线部分),其实也表明了保留区的扇区数量,值为6702(相对于分区),那么FAT表起始扇区号为6702(相对于分区),则保留区的扇区数为6702-2(从相对分区的2扇区才为保留区)
保留区中,在2扇区和12扇区(相对分区)可能有引导代码的扩展部分,其余部分无用,主用为了之后备份等操作

FAT表

前32位表示FAT表的标识F8FFFF0F,之后32位系统保留,再后的没32位表示一个FAT表项,从2簇表示根目录文件
每个FAT表项记录下一个簇号
FFFFFF0F表示文件或目录的结束簇号
FFFFFFF7表示坏簇

其FAT表如下,与FAT16方式几乎相同

根目录区

FAT32与FAT16不同之处在于根目录的文件化,即将根目录等同于普通的文件。这样根目录便没有了FAT16中512个目录项的限制,不够用的时候增加簇链,分配空簇即可。
所以根目录区在2簇,也就是数据区起始和根目录区起始都在2簇
还有与FAT16除了短文件名目录项不同外,其余相同。

短文件名目录项

偏移 意义
00-0A 文件名的ASCII码(字母的大写),如果文件被删除,第一个字节被修改为E5
0B 文件属性,01只读,00读写,02隐藏,04系统,08卷标,10目录,20存档,0F长文件名
0D-11 创建时间
12-13 最后访问时间
14-15 起始簇的高16位
16-17 最后修改时间
18-19 最后修改日期
1A-1B 起始簇的低16位(高16位与低16位拼在一起就是其实簇号)
1C-1F 文件的大小字节数

长文件名目录项

偏移 意义
00 状态,E5表删除,01,02等表示序号,如果0变为4,表示这是最后一个目录项(一个长文件名目录项有多个目录项)
01-0A 长文件名的第1-5个字符
0B 值为0F,长文件名目录项标志
0D 校验和
0E-19 文件名第6-11个字符
1C-1F 文件名的第12-13个字符

着重说明“根目录等同于普通的文件”这一特点,在该分区的根目录区,查看和FAT16例子中相同的位于根目录的缓存文件,将高低16位拼在一起为 00 00 00 03 ,表示这个文件在3簇,与FAT16不同

结构对比

数据区

与FAT16相同

参考:
http://www.sjhf.net/pdf/fat.pdf



这篇关于文件系统1:FAT的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程