认识FAT32


版权所有,禁止转载。


FAT32文件系统是一个比较重要的文件系统,并且,设计思路比较简单。在windows操作系统,以及嵌入式平台上有广泛的用途。对于一个没有安装操作系统的普通FAT32分区的磁盘,主要的结构有:DBRFAT表,备份FAT表,以及数据区。注意与FAT16FAT12区分,FAT32是没有单独的根目录区的,因为单独的根目录区,对根目录下面的文件数量是有限制的。对于一个划分了FAT32分区的磁盘来说,在DBR里面包含有重要的磁盘分区信息。操作系统读取磁盘的时候,按照DBRFAT表来读取和寻找文件的。



DBR中,最重要的数据结构是BPB块,BPB表里面包含了很多有用的信息。


QBPB表保存在哪里?


A:保存在DBR区中,而DBR区,在FAT32格式的磁盘分区中一般位于0磁头1柱面1扇区的位置。0磁头0柱面留给MBR以及保留扇区。如果没有安装操作系统,那么就在0磁头0柱面上第1个扇区。本文的实验没有安装操作系统的SDCARD



知道了BPB保存在哪里后,要掌握FAT32分区情况,就需要知道一些关键的信息:



1DBR后面有多少的保留扇区?


2FAT表保存在哪里?


3。一个FAT占多少扇区?


4。在FAT32里面已经没有了根目录区的概念了,那么根目录在哪个扇区?


了解了这些以后,我们就能够大概跟踪到各个文件了。



DBR截图


对照以上截图,以及FAT手册,我们就可以回答上面的这几个问题。



QDBR后面有多少保留扇区?


A0X0E
2
个字节。0020个扇区,也就是加上DBR一共32个扇区



QFAT表保存在哪里?


A:第一个柱面DBR+保留扇区之后。第32个扇区之后,保存着FAT



Q1FAT表占用多少扇区?


A0X24
4
个字节。01fc个扇区



Q:根目录在哪个扇区?


A:位于的簇号记录于DBR
0X2C 4
个字节。不过,一般是在FAT表之后DBR2FAT表扇区之后。0X0002扇区



QFAT表是以簇为单位来管理的,一个簇有多少扇区?


ADBR里面偏移0x0D一个字节。01个扇区(32MB



Q:根目录数据在哪个扇区?


A:保留扇区+FAT2扇区看一下
320x01fc*2=32+1016=1048扇区数.1048*512=536576B



由于在FAT32分区格式中,根目录区的特殊性已经取消了。因此保留扇区(保留扇区包括DBR)+FAT1FAT2后,便是根目录数据区的位置。根目录本身的目录项是没有的,在数据区开始位置放置的就是根目录的内容(也就是根目录的数据)。所以,如果我们去查找根目录下的某个文件,或者目录,直接异步到数据区的开始处,就可以查找了。我们可能会有疑问,那如果根目录区内的文件名很多,于是根目录的数据大小超过了一个簇的大小,咋办哩?当然有办法了,想想FAT表的作用吧,呵呵。FAT表便是一个数据区的链表,按照FAT表来索冀,我们就能够得到一个大小超过一个簇的文件了。


用一个例子来说明吧。


首先,用android下面的工具:mksdcard来制作一个FAT32img镜像。



看到了,已经生成了一个32MBMY_SDfat32镜像。


接着,我们把MY_SD挂在到/mnt/t分区,并且往上面放两个文件:




然后,经过前面我们对FAT32的分析,第一个分区是DBR分区,然后是31个保留分区,接下来是FAT分区。根据DBR分区中BPB相关字段,FAT分区一共占0x01FC(508)个扇区,再加上备份FAT表,一共是1016FAT分区。这样子,数据区就在1016+31个分区之后的分区。我们先查找river.txt的文件分布吧:


根目录的数据区域包含了根目录下的文件及目录的相关信息。因此我们要在1048个扇区将根目录的数据读出来,从中,识别river.txt的目录名
和 数据所在的簇号:



从中我们可以看到river.txt数据区所在的位置是00000004簇,文件大小是8个字节(“huanghe”一共是7个字节,再加上\0,一共是8个字节)。另外,我们也可以看到mountain.txt所在簇号00000005,文件大小是9个字节(“ximalaya”,在加上\0)



由于river.txt数据是在第4簇号放着,而FAT规定簇号的起始记号是从2开始,因此,实际上,要找的话,就从数据区的第2个簇号里面放着,在32MBfat32中,每一个簇占1个扇区,因此river.txt所在的数据扇区的位置:104821050个扇区,1050512B537600B。我们找一下:



看到了吧。强化一下,我们继续找mountain.txt.
1048+3=1051
扇区,1051512B538112B。我们来找一下:



呵呵,找到了。以上就是对FAT32的文件系统的认识。


讨论地址:http://linux.chinaunix.net/bbs/viewthread.php?tid=1171438&page=1&extra=#pid7301790

评论

此博客中的热门博文

Linux/ARM Page Table Entry 属性设置分析

提交了30次才AC ---【附】POJ 2488解题报告

笔记