FAT32基础知识

1.FAT简介
1.1文件系统的来源
文件系统是操作系统用于明确存储设备或分区上的文件的方法和数据结构,即在存储设备上组织文件的方法。
文件系统的作用是,为用户建立文件、读出、修改,控制文件的读取,格式化硬盘是指写入文件系统。

1.2文件系统组成
FAT32文件系统由DBR及其保留扇区,FAT1,FAT2和DATA四个部分组成(MBR是主引导记录,不一定每个磁盘都有)。
在这里插入图片描述

1.3区域划分
在这里插入图片描述
DBR及保留区
FAT区
数据区

1.3.1DBR及保留区
DBR(DOS Boot Recorder——DOS引导记录)扇区,DBR中记录着文件系统的起始位置、大小、FAT表个数及大小等相关信息。

FAT32文件系统的开始部分有一个由若干个扇区组成的保留区,保留区的大小会记录在系统引导扇区(DBR)扇区中,比较常见的大小为32、34或38个扇区。
除0号扇区外,还有其他一些扇区,其中包括了DBR的备份扇区。

1.3.1.1 0扇区——引导扇区
0号扇区的0~89字节。
在这里插入图片描述
在这里插入图片描述

1.3.1.1.1跳转指令
在这里插入图片描述
在这里插入图片描述
本身占2字节它将程序执行流程跳转到引导程序处。

1.3.1.1.2OEM代号
在这里插入图片描述
在这里插入图片描述
这部分占8字节,其内容由创建该文件系统的OEM厂商具体安排。

1.3.1.1.3BPB
在这里插入图片描述

FAT32的BPB从DBR的第12个字节开始,占用79字节,记录了有关该文件系统的重要信息。
在这里插入图片描述

1.3.1.1.4引导代码
0x5A~0x1FD
在这里插入图片描述

1.3.1.1.5结束标志
在这里插入图片描述
0x1FE~0x1FF为两个字节的签名值“55 AA”组成。

1.3.1.2 1扇区——文件系统信息区
FAT32文件系统在DBR的保留扇区中安排了一个文件系统信息扇区,用以记录数据区中空闲簇的数量及下一个空闲簇的簇号,该扇区一般在分区的1号扇区,也就是紧跟着DBR后的一个扇区。(文件系统信息扇区包含在保留扇区中)
在这里插入图片描述

1.3.1.2.1空闲簇数
在这里插入图片描述

1.3.1.2.2下一个空闲簇的簇号
在这里插入图片描述

1.3.1.3引导代码
FAT 文件系统将引导代码与文件形同数据结构融合在一起,而不像 Unix 文件系统那样各自存在,引导 扇区的前三个字节为一个由机器代码构成的跳转指令,以使 CPU 越过跟在后面的配置数据跳转到配置数据 后面的引导代码处。

FAT32 文件系统引导扇区的 512 字节中,90~509 字节为引导代码(即在0扇区除了引导扇区的剩余部分)。
在这里插入图片描述

1.3.1.4FSINFO 信息扇区
FAT32 在保留区中增加了一个 FSINFO 扇区,用以记录文件系统中空闲簇的数量以及下一可用簇的簇号 等信息,以供操作系统作为参考。 1. FSINFO 信息扇区结构 大多数的 FSINFO 信息扇区一般位于文件系统的 1 号扇区,结构非常简单。
在这里插入图片描述
0x00~0x03:4个字节,扩展引导标志“52526141”。
0x04~0x1E3:480 个字节,未使用,全部置 0。
0x1E4~0x1E7: 4 个字节,FSINFO 签名“72724161”。
0x1E8~0x1EB: 4 个字节,文件系统的空簇数,4294967295(0xFF FF FF FF)。
0x1EC~0x1EF: 4 个字节,下一可用簇号,2(0x 00 00 00 02)。
0x1F0~0x1FD: 14 个字节,未使用。
0x1FE~0x1FF: 2 个字节,“55 AA”标志。

1.3.2FAT区
FAT,File Allocation Table,文件分配表。

1.对于文件系统来说,FAT 表有两个重要作用:描述簇的分配状态以及标明文件或目录的下一簇的簇号。
2.通常情况下,一个FAT把文件系统会有两个FAT表,但有时也允许只有一个 FAT 表,FAT表的具体个数记录在引导扇区的偏移 0x10 字节处。
3.由于 FAT 区紧跟在文件系统保留区后,所以 FAT1 在文件系统中的位置可以通过引导记录中偏移0x0E~0x0F字节处的“保留扇区数”得到。
4.FAT2紧跟在FAT1之后,它的位置可以通过FAT1的位置加上FAT表的大小扇区数计算出来。

1.3.2.1 FAT表位置
分区起始扇区:0
RsvdSecCnt(DBR保留扇区):0x084E。
在这里插入图片描述
FATSz32(单个FAT表大小扇区数):0x00003BD9
在这里插入图片描述

FAT1
FAT1 = 分区起始扇区 + DBR保留扇区
FAT1 = 0 + 0x084E = 0x084E(扇区) = 0x084E * 512 (Byte) = 0x00109C00 (Byte)
在这里插入图片描述

FAT2
FAT2 = 分区起始扇区 + DBR保留扇区 + 单个FAT表大小扇区数
FAT2 = 0 + 0x084E + 0x3BD9= 0x4427(扇区) = 0x884E00 (Byte)
在这里插入图片描述

1.3.2.2 FAT表项
FAT 表有两个重要作用:描述簇的分配状态以及标明文件或目录的下一簇的簇号。
FAT32中每个簇的簇地址,是有32bit(4个字节)记录在FAT表中。
在这里插入图片描述
1.3.2.2.10号表项
FAT32的0号表项值总是“F8FFFF0F”。

1.3.2.2.21号表项
1号表项可能被用于记录脏标志,以说明文件系统没有被正常卸载或者磁盘表面存在错误。不过 这个值并不重要。正常情况下1号表项的值为“FFFFFFFF”或“FFFFFF0F”。

1.3.2.2.3其他表项
未分配使用
如果某个簇未被分配使用,它所对应的FAT表项内的FAT表项值即用0进行填充,表示该FAT表项所对应的簇未被分配。

分配使用
当某个簇已被分配使用时,则它对应的 FAT 表项内的 FAT 表项值也就是该文件的下一个存储位置的簇号。如果该文件结束于该簇,则在它的FAT表项中记录的是一个文件结束标记,对于FAT32而言,代表文件结束的FAT表项值为0x0FFFFFFF。

坏簇
如果某个簇存在坏扇区,则整个簇会用FAT表项值0xFFFFFF7标记为坏簇,不再使用,这个坏簇标记就记录在它所对应的FAT表项中。

1.3.3数据区
FAT文件系统用“簇”作为数据单元。
一个“簇”由一组连续的扇区组成,簇所含的扇区数必须是2的整数次幂。簇的最大值为64个扇区,即32KB。所有簇从2开始进行编号,每个簇都有一个自己的地址编号。
用户文件和目录都存储在簇中。

1.3.3.1根目录(数据区起始位置)
虽然原则上FAT32允许根目录位于数据去的任何位置,但通常情况下它都位于2号簇。
在FAT文件系统中,寻找第一簇(即2号簇)的位置也就是寻找数据区的开始位置,这并不是一件容易的事,因为它不是位于文件系统开始处,而是位于数据区。在数据区前面是保留区域和FAT区域,这两个区域都不使用FAT表进行管理。因此,数据区以前的区域只能使用扇区地址(逻辑卷地址),而无法使用簇地址。要想定位一个FAT32文件系统的数据起始处,可以通过引导扇区的相关参数计算出来。

1.从引导扇区的偏移0x0E~0x0F字节处得到保留扇区。
RsvdSecCnt(DBR保留扇区):0x084E

2.从偏移 0x10 字节处得到FAT表的个数。
NumFATs(FAT表个数):0x02

3.从偏移0x24~0x27字节处得到每个FAT表的大小扇区数。
FATSz32(单个FAT表大小扇区数):0x00003BD9

4.利用如下公式计算:
数据区起始扇区号 = 保留扇区数 + 每个FAT表大小扇区数 * FAT 表个数
= RsvdSecCnt + FATSz32 *NumFATs
= 0x084E + 0x00003BD9 * 0x02
= 0x8000(扇区)
= 0x01000000(Byte)

FAT表根目录(2号簇)
在这里插入图片描述
在这里插入图片描述
要想计算其他已知簇号的扇区号,还要由引导扇区的偏移 0x0D 字节处查找到每个簇大小扇区数,并 使用如下公式计算:
某簇起始扇区号 = 保留扇区数 + 每个 FAT 表大小扇区数 * FAT 表个数 + (该簇簇号 - 2) * 每簇扇区数

1.3.3.2文件或子目录
FAT表子目录(3号簇)
在这里插入图片描述

数据区子目录(3号簇)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
0x1C~0x1F 4 文件内容大小字节数,只对文件有效,子目录的目录项此处全部设置为0。

1.3.3.2.1短文件名目录项
在这里插入图片描述
短文件名目录项:所谓短文件名既文件名的“8.3”格式,此格式支持主文件名不能超过8字节,扩展名不能超过3字节。短文件名目录始终存放在一个目录项中。

1.3.3.2.2长文件名目录项
在这里插入图片描述
长文件名目录项:由于短文件名“8.3”的格式远远不能满足现实中的需求,所以就出现了长文件名,长文件名其实就是将文件名进行分段,分成若干个短文件名进行存储。

长文件名在进行分段存储的时候,遵循一下三个处理原则:

1、系统取长文件名的前6个字符加上“~1”形成短文件名,其扩展名不变;

2、如果已存在这个名字的文件,则符号“~”后的数字自动增加;

3、如果文件名内存在windows非法的字符,则以下划线“_”代替;

4、长文件名目录项采用倒叙的方式进行记录,如上图。
在这里插入图片描述
序列号
在这里插入图片描述

注意:顺序是从1开始编号直到13,倘若到了结尾的地方,除了要按照规则的编号还需要将0x0地址的第6位置1。

文件名
长文件名文件目录项的unicode编码:无论是英文字符,还是中文字符都占用2个字节。

文件的属性
0xB位段的取值如果是0FH代表是长目录项,反之就是短目录项。

1.3.4例子
1.3.4.1查找子目录
根目录(起始位置:0x01000000)
在这里插入图片描述
遍历
以32字节为周期,从起始位置轮询遍历根目录下的子目录。

匹配
查看每次轮询的0x1B位置的值,如果为0x10,表示子目录。

查看每次轮询的0x00~0x0A位置的值,如果为“31 31 31 31 20 20 …”,则为需要查找的“1111”子目录。

1.3.4.2查找文件
根目录(起始位置:0x01000000)
在这里插入图片描述
遍历
以32字节为周期,从起始位置轮询依次遍历根目录下的子目录。

匹配文件名
查看每次轮询的0x1B位置的值,如果为0x20,表示文件。

查看每次轮询的0x00~0x0A位置的值,如果为“54 45 53 54 20 20 …”,则为需要查找的“test.txt”文件。
为啥文件名变成大写???
FAT32根据文件目录项判断文件名大小写的方法(仅限8.3命名规则):

文件目录项0x0C字节的值:

  1. 此值为18H时,文件名和扩展名都小写。
  2. 此值为10H时,文件名大写而扩展名小写。
  3. 此值为08H时,文件名小写而扩展名大写。
  4. 此值为00H时,文件名和扩展名都大写。
    所以,0x0C位置值为0x18,即文件名和扩展名都小写。
    在表示时,需要转换显示。

查看文件内容
查询0x140x15、0x1A0x1B的值。
字节位置 长度 描述 值
0x14~0x15 2 文件起始簇号的高两个字节
0x1A~0x1B 2 文件内容起始簇号的低两个字节,与0x14~0x15字节处的高两个字节组成文件内容起始簇号。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
组合值为:0x00000008号簇

SecPerClus:每簇扇区数 = 0x08
某簇起始扇区号 = 保留扇区数 + 每个 FAT 表大小扇区数 * FAT 表个数 + (该簇簇号 - 2) * 每簇扇区数

8号簇扇区号 = RsvdSecCnt + FATSz32 NumFATs +(8 - 2) * SecPerClus
= 0x084E + 0x00003BD9 * 0x02 + (8 - 2)
0x08
= 0x8030(扇区)
= 0x01006000(Byte)
在这里插入图片描述
查看文件大小
查询0x1C~0x1F的值。
在这里插入图片描述
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值