FAT32文件系统结构分析

        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 

 

 

  • 6
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

【ql君】qlexcel

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值