FAT32文件系统详解

1. FAT32

FAT32磁盘是由:MBR + 分区1(保留区 + 文件分配表 + 数据区)+ 分区2 + ......

通常,所有的文件系统part 0都是MBR。

FAT32基本结构依次为:DBR及其保留扇区、FAT表1、FAT表2、根目录和数据区。

DBR及其保留扇区:DBR的含义是DOS引导记录,也称为操作系统引导记录,在DBR之后往往会有一些保留扇区。

FAT1:FAT的含义是文件分配表,FAT32一般有两份FAT,FAT1是第一份,也是主FAT。

FAT2:FAT2是FAT32的第二份文件分配表,也是FAT1的备份。

DATA:DATA也就是数据区,是FAT32文件系统的主要区域,其中包含目录区域。

扇区:硬件磁盘的最小读写单位,一般为512个字节。

簇:由若干个扇区组成,是文件系统存取数据的最小单位。如果簇大小为16K,文件大小为1字节,那也要用一个簇来存,而且该簇不用再拿来他用。

FAT文件系统就是专门管理这些簇的。一个文件可能占据一个或者多个簇,按正确的顺序去读取这些簇,就可以获取这个文件的内容了。

2. DBR

它记录着文件系统的起始位置、大小、FAT表个数及大小等相关信息。后面跟着由若干个扇区组成的保留扇区,保留扇区的大小记录在DBR中。

读取闪迪U盘 DBR

usb read 0x50000000 20 1  //0x20,即读取第33个sector,前面32个sector是part0,存放MBR,refer to: U盘分区及MBR

md 0x50000000 80

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”。

3. FSINFO

FAT32在保留区中增加了一个FSINFO扇区,用以记录文件系统中空闲簇的数量以及下一可用簇的簇号等信息,以供操作系统作为参考。

读取闪迪U盘 DBR

usb read 0x50000000 21 1  //0x21,即读取第34个sector

md 0x50000000 80

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号扇区的备份。

4. FAT表

5. 根目录(数据区)

如何得到文件位置

上述的内容已经简单的介绍了FAT32文件系统,下面根据定位某个文件来详细的了解FAT32文件系统是如何存储数据的。

1、根据磁盘0号扇区MBR的分区表得知分区的起始位置,既DBR;

2、根据DBR中BPB记录的信息,得知DBR保留扇区数,FAT的大小,FAT的个数;

3、根据上述信息可以算出数据的起始位置,数据区=分区起始扇区+DBR保留扇区+(FAT表*2);

4、计算根目录所在的绝对位置,根目录=数据区的起始扇区+(簇大小*2);

5、根据根目录中的目录项信息得知,根目录下的文件以及子目录等所对应的簇;

6、根据文件的簇号就可以找到文件内容的绝对扇区;

7、如果一个文件占用多个簇,则需要根据FAT表项得知下一个数据簇的簇号。

7、如果根目录下的目录项是子目录的话,则根据子目录中的文件目录项得知文件内容的簇号;

8、如果子目录中还有子目录的话,则根据这种方法一直找下去即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

hello-linux

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

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

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

打赏作者

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

抵扣说明:

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

余额充值