作者:张嫱的小屋_133 | 来源:互联网 | 2023-09-25 12:44
FAT,英文为File Allocation Table,文档分配表。先要记住几个概念:
扇区:一般扇区为512个字节。
簇:由若干个扇区组成,是存取数据的最小单位。如果簇大小为16K,文件大小为1字节,那也要用一个簇来存,而且该簇不用再拿来他用。
FAT文件系统就是专门管理这些簇的。一个文件可能占据一个或者多个簇,按正确的顺序去读取这些簇,就可以获取这个文件的内容了。
一、FAT32基本结构
FAT32基本结构依次为:DBR及其保留扇区、FAT表1、FAT表2、根目录和数据区。
1、DBR及其保留扇区
DBR是文件系统的引导扇区,位于第0号扇区,它记录着文件系统的起始位置、大小、FAT表个数及大小等相关信息。后面跟着由若干个扇区组成的保留扇区,保留扇区的大小记录在DBR中。
0x00~0x02:3字节,跳转指令。
0x03~0x0A:8字节,文件系统标志和版本号,这里为MSDOS5.0。
0x0B~0x0C:2字节,每扇区字节数,0x0200=512字节
0x0D~0x0D:1字节,每簇扇区数,0x08个。
0x0E~0x0F:2字节,保留扇区数,0x0C22=3106个。
0x10~0x10:1字节,FAT表个数,0x02。
0x11~0x12:2字节,FAT32必须等于0,FAT12/FAT16为根目录中目录的个数;
0x13~0x14:2字节,FAT32必须等于0,FAT12/FAT16为扇区总数。
0x15~0x15:1字节,哪种存储介质,0xF8标准值,可移动存储介质。
0x16~0x17:2字节,FAT32必须为0,FAT12/FAT16为一个FAT 表所占的扇区数。
0x18~0x19:2字节,每磁道扇区数,只对于“特殊形状”(由磁头和柱面分割为若干磁道)的存储介质有效,0x003F=63。
0x1A~0x1B:2字节,磁头数,只对特殊的介质才有效,0x00FF=255。
0x1C~0x1F:4字节,EBR分区之前所隐藏的扇区数,0x0004A800=305152又出现了呢,与MBR中地址0x1C6开始的4个字节数值相等。
0x20~0x23:4字节,文件系统总扇区数,0x00E83800=15218688
0x24~0x27:4字节,每个FAT表占用扇区数,0x000039EF=14831
0x28~0x29:2字节,标记,此域FAT32 特有。
0x2A~0x2B:2字节,FAT32版本号0.0,FAT32特有。
0x2C~0x2F:4字节,根目录所在第一个簇的簇号,0x02。(虽然在FAT32文件系统下,根目录可以存放在数据区的任何位置,但是通常情况下还是起始于2号簇)
0x30~0x31:2字节,FSINFO(文件系统信息扇区)扇区号0x01,该扇区为操作系统提供关于空簇总数及下一可用簇的信息。
0x32~0x33:2字节,备份引导扇区的位置。备份引导扇区总是位于文件系统的6号扇区。
0x34~0x3F:12字节,用于以后FAT 扩展使用。
0x40~0x40:1字节,与FAT12/16 的定义相同,只不过两者位于启动扇区不同的位置而已。
0x41~0x41:1字节,与FAT12/16 的定义相同,只不过两者位于启动扇区不同的位置而已 。
0x42~0x42:1字节,扩展引导标志,0x29。与FAT12/16 的定义相同,只不过两者位于启动扇区不同的位置而已
0x43~0x46:4字节,卷序列号。通常为一个随机值。
0x47~0x51:11字节,卷标(ASCII码),如果建立文件系统的时候指定了卷标,会保存在此。
0x52~0x59:8字节,文件系统格式的ASCII码,FAT32。
0x5A~0x1FD:共410字节,引导代码。
0x1FE~0x1FF:签名标志“55 AA”。
2、FSINFO扇区
FAT32在保留区中增加了一个FSINFO扇区,用以记录文件系统中空闲簇的数量以及下一可用簇的簇号等信息,以供操作系统作为参考。FSINFO信息扇区一般位于文件系统的1号扇区,结构非常简单。
0x200~0x203:4个字节,扩展引导标志“52 52 61 41”。
0x204~0x3E3:480个字节,未使用,全部置0。
0x3E4~0x3E7:4个字节,FSINFO签名“72 72 41 61”。
0x3E8~0x3EB:4个字节,文件系统的空簇数,FF FF FF FF,这个值感觉有问题,格式化SD卡新建一个小于4K的文件,此处的值变成1C F6 FE,所以上面的值应该为0x1FF6FF,猜测可能是由于格式化之后就会将此处置FF,新建文件后才会恢复。
0x3EC~0x3EF:4个字节,下一可用簇号(0x00000002)。
0x3F0~0x3FD:14个字节,未使用。
0x3FE~0x3FF:2个字节,“55 AA”标志。
温馨提示:通常情况下,文件系统的2号扇区结尾也会被设置“55 AA”标志。6号扇区也会有一个引导扇区的备份,相应的7号扇区应该是一个备份FSINFO信息扇区,8号扇区可以看做是2号扇区的备份。
2、FAT1:FAT的含义是文件分配表,FAT32一般有两份FAT,FAT1是第一份,也是主FAT。
FAT2:FAT2是FAT32的第二份文件分配表,也是FAT1的备份,跟在FAT1的后面。
文件系统用簇作为基本单位来存放文件的数据。对于小文件,只需要用到一个簇来保存文件的所有数据。对于大文件,就需要分配多个簇,存放同一个文件的簇不一定连续,这就需要把簇的前后关系用FAT表来存放表示。
与FAT16类似,FAT32用32bit来描述一个簇。第0、1、2、3个字节表示第0个簇,第4、5、6、7个字节表示第1个簇,第8、9、10、11个字节表示第2个簇…就这样,每个簇都有4个和它对应的字节,这4个字节里面存放的数据就是文件中下一个簇大小数据所在的簇号。
比如要读new.txt文件,从根目录中找到了它,读它的根目录信息知道它的第一个簇的簇号是5,于是把第5号簇的数据送出去,在FAT表中5号簇是第20、21、22、23字节来表示的,于是去读第20、21、22、23字节,得到00000007,知道了文件接下来的数据保存在7号簇中,把7号簇的数据送出去,又去读第28、29、30、31字节的数据,得到FFFFFFFF,说明文件到末尾了。
3、根目录和数据区:
根目录就是保存盘中有哪些文件,该文件相关信息的地方。用32字节表示一个对象。当从文件系统中读文件的时候,比如读TEST.txt文件就是先在根目录中找到该文件,然后读它的信息,得到它的起始簇号,接着把起始簇号的数据送出去,然后去FAT表得到接下来数据保存的簇号,把对于数据送出去,一直到结束。
0x00-0x07:文件名,不足8个字节0x20补全(短文件名8.3命名规则)
0x08-0x0A:扩展名
0x0B:文件属性,0x20表示归档
0x0D:创建时间的10毫秒位
0x0E-0x0F:文件创建时间
0x10-0x11:文件创建日期
0x12-0x13:文件最后访问日期
0x14-0x15:文件起始簇号的高16位 0x0000
0x16-0x17:文件最近修改时间
0x18-0x19:文件最近修改日期
0x1A-0x1B:文件起始簇号的低16位 0x0003
0x1C-0x1F:文件的长度,0x2206=8710bytes=8.5K