您的位置:首页 > 其它

FAT16 FAT32 文件系统

2015-06-27 10:50 302 查看
FAT,英文为File Allocation Table,文档分配表。

先要记住几个概念:

扇区:一般扇区为512个字节。

簇:由若干个扇区组成。

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


FAT16, FAT32的区别

FAT16是用16位即2个字节来表示一个簇,这2个字节有两重意思。第一,它本身所在的位置对应一个特定位置的簇。第二,它的内容指向的是下一个2个字节。

而FAT32是用32位即4个字节来表示一个簇。这4个字节的意思和FAT16中2个字节的意思相同。

2个字节取值范围是0x0000-0xFFFF。4个字节的取值范围是0x00000000-0xFFFFFFFF。但是它们真正的有效范围如下表:



看之前可以先详细看看下面的网址。


参考网址:

http://wenku.baidu.com/link?url=BpR7QQNeY2fOJGWg0M5AB-DTy9OlR5rJc4tn77dtObFJOUoT5laUi0ScspjsIacrx1lZIzBVnxWL7HIkyDk2nCrlkPBeVh6KfiME_4xt56u

http://wenku.baidu.com/view/c0656e1ea300a6c30c229f15.html

/article/1381062.html

http://wenku.baidu.com/view/45817b49cf84b9d528ea7a99.html

http://www.cnblogs.com/andtt/articles/2352820.html

相信看了上面网址的内容,下面的就可以忽略了。

FAT文件系统的组成一般有MBR,DBR,FAT1,FAT2,FDT和数据区组成。FAT16和FAT32差别不大。一般将DBR所处的位置称谓逻辑扇区0。既然DBR是逻辑上的扇区0,那么怎么能够找到它嘞。MBR是物理上的扇区0,即绝对地址0处。通过MBR可以获取DBR的绝对地址。

以SD卡为例简要说明FAT32:


FAT32的结构

MBR-保留扇区0-DBR-FSINFO-保留扇区1-DBR副本-FSINFO副本-保留扇区2-FAT1-FAT2-根目录FDT-数据区



通过WinHex可以以物理和逻辑两种方式来打开SD卡。在这里用物理方式打开,分别查找FAT32结构中的信息。

FAT文件系统最初是在IBM PC机上实现的,因此磁盘上的数据都是按"小端"模式"存储的。


MBR

下图是一个4G sd卡的MBR信息,图中只标出了感兴趣的内容。




保留扇区0

在MBR中可以看到此处保留扇区为0x00002000-1个扇区,因为第0x00002000个扇区是DBR。如果在没有MBR的分区中,当然也就不存在保留扇区0了。


DBR

(有时可能没有MBR。DBR的物理地址和逻辑地址相同,都是0地址。)


由MBR图可知,DBR所在的扇区在8192物理扇区处。即8192*512=4194304D=400000H=4MB处。在WinHex中跳转到此处。

在DBR中可以得出DBR之后结构的信息。



其中:

标号3保留扇区数,意为此扇区加上这么多扇区就是FAT1的扇区地址了。此处为:0x400000H+0x24H*0x200H

标号5为此扇区之前有多少个空余扇区,和MBR中指向DBR扇区地址是完全一致的。

标号6为磁盘扇区总数。关于这里的总数包括哪些扇区呢?经过观察几个U盘和SD卡,发现这里的扇区总数是从DBR开始在内的共0x760000个扇区。即此盘的最后地址为0x400000+0x760000*0x200-1=0xEC400000-1=0xEC3FFFFF。这个地址是SD的物理地址的最末尾。

标号9为FSINFO扇区地址,即此扇区加上这么多就是FSINFO的扇区地址了。此处为:0x400000H+0x200H

标号10为DBR的备份扇区相对地址。此处为:0x400000H+0x06*0x200


问题1:如果将MBR和DBR中的磁盘扇区总数修改会出现什么情况?(这个问题可以看了上面的网址和这篇博文后理解)

答:关于这一点,在上面网址中的FAT白皮书中也有说明(第6页)。现结合自己理解谈谈。

1>如果将MBR和DBR中的磁盘扇区总数同时减小,比如减小为0x3FE000,即磁盘的最后地址为0x400000+0x3FE000*0x200-1=0x80000000B-1=2GB,即磁盘变成了2G的了。就是说在FAT扇区数没有变化的情况,磁盘可以使用的FAT文件系统变小了。但是FAT表占的扇区数是不会变的。上面说扇区总数同时减小,是的,如果不同时减小,可能文件系统检测是会出异常。可知,可以减少磁盘扇区总数达到减小FAT文件系统的目的,当然磁盘扇区总数后面的地址数据将不会被刷新。

2>如果将MBR和DBR中的磁盘扇区总数同时增大,会出现什么情况呢。

针对FAT32,4个字节表示一个簇。那么一个扇区可以表示512/4=128个簇。(假设每个扇区有512字节,最好使用此值)。如果一个簇4k,那么FAT表的一个扇区可以表示512k。我们知道,FAT表是以扇区数来计算个数的。因此,FAT表的最末尾扇区中有可能有空余字节。如果增大扇区总数,那么FAT文件系统就会去寻址磁盘最大容量以外的地址(可能会出现异常),而且FAT表最末尾的空余字节就会被使用。FAT白皮书上说导致数据丢失,可能就是超出磁盘最大容量地址以外的那部分数据吧。原有的数据应该不会丢失。

DBR备份扇区和DBR扇区完全一样


FSINFO

根据DBR中的信息,可知道FSINFO的地址为0x400200



Note:

剩余簇数量:保存最新的剩余簇数量,如果为0xFFFFFFFF表示剩余簇未知,需要重新计算,除此之外其他的值都可以用,而且不要求十分精确,但必须保证其值<=磁盘所有的簇数。

下一个可用簇:该域为FAT驱动程序提供一条有利的线索,它告诉驱动程序从哪里开始寻找剩余簇。因为FAT32的FAT表可能非常的庞大,如果已经分配的簇很多的话要从头开始查找剩余簇将耗 费大量时间。通常这个值被设定为驱动程序最后分配出去的 簇号。如果值为0xFFFFFFFF,那么驱动程序必须从簇2开始查找,除此之外其他的值都可以使用,当然前提是这个值必须合法的。


保留扇区1

此处为5个,因为第6个是DBR备份扇区。(DBR结构中已说明)


DBR副本(DBR中已说明)内容和DBR完全一致,用于DBR访问出错时,来恢复DBR。


FSINFO副本(DBR副本+FSINFO相对于DBR的位置)FSINFO的副本与FSINFO并不是完全一致


保留扇区2

在DBR结构中知道,DBR到FAT1中间有36个扇区,减去里面的FSINFO,保留扇区1,DBR副本,FSINFO副本,就是保留扇区2的数量了。

[b]FAT1[/b]

FAT1的地址在DBR中就可以看出来了,即DBR的地址加上保留扇区数就是FAT1的地址。即:0x400000+0x24*0x200=0x404800。如下图所示。



FAT32是用4个字节表示一个簇。第0簇和第1簇事先被占用。数据区是从第2簇开始的。

第2簇中的数据为结束簇,它又是根目录簇,说明了,根目录下面的文件数小于4k/32=128个文件(4k表示1个簇的大小,32表示32个字节代表1个文件或目录)。如果根目录下面的文件数大于128,那么FAT表中第2簇的位置应该存的是指向下一个根目录簇的位置。

如下图:



上图中FAT表中第2簇位置数据位0x76FA,表示根目录的下一簇在0x76FA簇处。由于数据区是由第2簇开始的,因此计算0x76FA簇的位置为,第2簇的位置+(0x76FA-2)*4k=0x0B61000+76F8000=0x8259000地址处。如上图。第2簇的位置计算下面有方法。


问题2:FAT表表示的最大空间和MBR/DBR中的最大磁盘总数相等么?

答:以FAT32举例。4个字节表示一个簇,但是第一个扇区中只能表示(512-8)/4=126个簇,之外的每个扇区可以表示128个簇。总共有0x1D72个扇区(DBR中可知)。即可以表示这么多簇:126+128*(0x1D72-1)=964862。每簇4k,964862*4k=3859448kB。即可以表示3859448kB的数据。数据区是从FDT开始的,FDT的地址为0x0B61000。那么FAT表所占扇区表示的最大地址空间是:0x0B61000+3859448kB-1=0x0EC45F000-1=0xEC45EFFF。根据DBR中扇区总数可以计算出此盘的最大地址为:[b]0xEC3FFFFF。所以FAT表表示的最大地址空间比扇区总数计算出来的最大地址多:0xEC45EFFF-[b]0xEC3FFFFF=0x5F000=389120B=380kB。因此可以得知,FAT表的最末尾扇区并没有被完全使用,准确的说最末尾扇区只用到了前面的512-380=132个字节。[/b][/b]


问题3:在不改变磁盘扇区总数的前提下,怎么减小此盘文件系统的大小,或者说超过某个地址空间以后不能写入新的数据。

答:类似于问题1。同样假如超过地址空间2GB之后的地址不写入新的数据。

我们知道,FAT表中每4个字节都代表了特别的含义。如上面的表格所示。我们可以将FAT表中某扇区之后的数据置成坏簇,那么这些置成坏簇的FAT表扇区,FAT文件系统将不会去刷新对应空间的数据。从而让FAT文件系统假象地认为对应的空间已经被占据了。

那么对应到此题,应该怎么解决呢?只要找到2GB地址对应到的FAT表扇区位置就可以了。从数据区起始地址到2GB地址处空余:0x0B61000+X=2147483648B(2GB),得出X=2135552000B=2085500kB。这个值就是FAT表要表示的最大地址空间了。那么:(126+128*(Y-1))*4kB=[b]2085500kB得出,Y=4073.2578125。即要占FAT表的前[b][b][b][b]4073.2578125扇区(包括[/b][/b][/b][/b][/b][b][b][b][b][b]FAT表的[/b][/b][/b][/b][/b][b][b][b][b][b]第一个扇区)。再准确点,FAT表的前4073个扇区被完全使用,第4074个扇区使用了0.2578125*512=132个字节。如果FAT文件系统使用FAT表第4074扇区第132个字节之后的扇区数据时,可以返回给文件系统坏簇的信息。也就意味着2GB之后的空间不能使用了。[/b][/b][/b][/b][/b]从而达到了超过某一地址空间后不能写入新的数据。


FAT2

FAT2的地址为FAT1地址+FAT所占的扇区数。从DBR中可以得知,FAT2起始地址为:0x404800+0x1D72*0x200=0x7B2C00


根目录FDT(根目录通常位于第2簇)

FDT的地址紧挨着FAT2,FDT地址就为FAT2加上FAT扇区数。即0x7B2C00+[b]0x1D72*0x200=0x0B61000[/b]

根目录占1簇,4kB,一个文件或目录占用32个字节。文件或目录的簇号就位于这32个字节之后。上面的网址有详细介绍,此处不再赘述。


数据区

其实根目录所在的位置已经是数据区了。这里的数据区是根目录后面的数据。在本例中,每簇为8个扇区,即4k。根目录所占1簇,即4k。那么此处的数据区地址为0x0B61000+4k=0x0B62000
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: