认识FAT32
版权所有,禁止转载。
FAT32文件系统是一个比较重要的文件系统,并且,设计思路比较简单。在windows操作系统,以及嵌入式平台上有广泛的用途。对于一个没有安装操作系统的普通FAT32分区的磁盘,主要的结构有:DBR,FAT表,备份FAT表,以及数据区。注意与FAT16和FAT12区分,FAT32是没有单独的根目录区的,因为单独的根目录区,对根目录下面的文件数量是有限制的。对于一个划分了FAT32分区的磁盘来说,在DBR里面包含有重要的磁盘分区信息。操作系统读取磁盘的时候,按照DBR和FAT表来读取和寻找文件的。
在DBR中,最重要的数据结构是BPB块,BPB表里面包含了很多有用的信息。
Q:BPB表保存在哪里?
A:保存在DBR区中,而DBR区,在FAT32格式的磁盘分区中一般位于0磁头1柱面1扇区的位置。0磁头0柱面留给MBR以及保留扇区。如果没有安装操作系统,那么就在0磁头0柱面上第1个扇区。本文的实验没有安装操作系统的SDCARD。
知道了BPB保存在哪里后,要掌握FAT32分区情况,就需要知道一些关键的信息:
1。DBR后面有多少的保留扇区?
2。FAT表保存在哪里?
3。一个FAT占多少扇区?
4。在FAT32里面已经没有了根目录区的概念了,那么根目录在哪个扇区?
了解了这些以后,我们就能够大概跟踪到各个文件了。
DBR截图
对照以上截图,以及FAT手册,我们就可以回答上面的这几个问题。
Q:DBR后面有多少保留扇区?
A:0X0E
2个字节。0020个扇区,也就是加上DBR一共32个扇区
Q:FAT表保存在哪里?
A:第一个柱面DBR+保留扇区之后。第32个扇区之后,保存着FAT表
Q:1个FAT表占用多少扇区?
A:0X24
4个字节。01fc个扇区
Q:根目录在哪个扇区?
A:位于的簇号记录于DBR
0X2C 4个字节。不过,一般是在FAT表之后DBR+2*FAT表扇区之后。0X0002扇区
Q:FAT表是以簇为单位来管理的,一个簇有多少扇区?
A:DBR里面偏移0x0D一个字节。01个扇区(32MB)
Q:根目录数据在哪个扇区?
A:保留扇区+FAT*2扇区看一下
32+0x01fc*2=32+1016=1048扇区数.1048*512=536576B
由于在FAT32分区格式中,根目录区的特殊性已经取消了。因此保留扇区(保留扇区包括DBR)+FAT1+FAT2后,便是根目录数据区的位置。根目录本身的目录项是没有的,在数据区开始位置放置的就是根目录的内容(也就是根目录的数据)。所以,如果我们去查找根目录下的某个文件,或者目录,直接异步到数据区的开始处,就可以查找了。我们可能会有疑问,那如果根目录区内的文件名很多,于是根目录的数据大小超过了一个簇的大小,咋办哩?当然有办法了,想想FAT表的作用吧,呵呵。FAT表便是一个数据区的链表,按照FAT表来索冀,我们就能够得到一个大小超过一个簇的文件了。
用一个例子来说明吧。
首先,用android下面的工具:mksdcard来制作一个FAT32的img镜像。
看到了,已经生成了一个32MB的MY_SD的fat32镜像。
接着,我们把MY_SD挂在到/mnt/t分区,并且往上面放两个文件:
然后,经过前面我们对FAT32的分析,第一个分区是DBR分区,然后是31个保留分区,接下来是FAT分区。根据DBR分区中BPB相关字段,FAT分区一共占0x01FC(508)个扇区,再加上备份FAT表,一共是1016个FAT分区。这样子,数据区就在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个簇号里面放着,在32MB的fat32中,每一个簇占1个扇区,因此river.txt所在的数据扇区的位置:1048+2=1050个扇区,1050*512B=537600B。我们找一下:
看到了吧。强化一下,我们继续找mountain.txt.
1048+3=1051扇区,1051*512B=538112B。我们来找一下:
呵呵,找到了。以上就是对FAT32的文件系统的认识。
讨论地址:http://linux.chinaunix.net/bbs/viewthread.php?tid=1171438&page=1&extra=#pid7301790
评论
发表评论