文件系统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相同