2010.3.25
刚刚闲下来,就看了看FAT文件系统的白皮书,既然看了就总结下心得咯。
下面这段话是网上摘录的,感觉总结的非常简单明了:
“文件占用磁盘空间时,基本单位不是字节而是簇。簇的大小与磁盘的规格有关,一般情况下,软盘每簇是1个扇区,硬盘每簇的扇区数与硬盘的总容量大小有关,可能是4、8、16、32、64……
通常在Windows平台下使用的3种文件系统是FAT(文件分区表),FAT32(32位文件分区表)和NTFS(NT文件系统)。在FAT文件系统下,每一个磁盘被分成固定大小的簇。簇最少为512个字节,其大小可以成倍增长,最大为32K。每个簇都是由唯一的索引号——一个16位二进制数来标识。因为16位二进制数最大为65536,所以FAT分区所拥有的簇的数量不可能超过65536个。簇的数量和大小的限制,就是FAT分区为什么不能超过2GB的原因。
FAT中的入口连接着组成一个文件的各个簇,文件的目录入口包含其第一个簇的索引号,而该簇在FAT中的入口又包含着下一个簇的索引号,依此类推。一个文件的最后一簇对应的FAT入口则包含着一个特殊的文件终止符,未使用的簇和损坏的簇也会用特殊代码标识出来。FAT32文件的原理几乎与此相同,但它的簇更小,而且由于FAT32入口是32位,所以其容量理论上可以超过40亿个字节。
NTFS是一个相当高级的文件系统。它的主文件表(MFT)是一个非常完整的数据库,它负责对磁盘上的每个文件进行索引。每个MFT的入口通常为1K大小,其中记录了大量的文件信息。NTFS可以在文件的MFT入口中存储非常小的文件的全部内容;对于大一些的文件,这些入口会标识出包含文件数据的簇。
簇的大小大于扇区的大小。扇区是存储介质上可由硬件寻址的基本单位,x86系统几乎总是定义512字节的扇区大小;簇是许多文件系统格式使用的可寻址数据块,簇的大小总是扇区大小的整数倍,且不同文件系统对于不同大小的卷(分区)会有不同的默认簇大小,比如FAT32对于8GB以下的分区,默认簇大小为4KB,对于8GB~16GB的分区,默认簇大小为16个扇区(8KB),NTFS对于大于2GB的分区,默认簇大小为8个扇区(4KB)。”
首先,针对上面的话我需要指出和补充的是第一段中cluster是由sector构成的,是sector的2的倍数,上面写到4、8、16、32、64……其实这里很容易让人产生误解,以后还可以128,256个,这是不对的,从FAT白皮书中我们可以看到一个Cluster由几个sector组成是由BPB_SecPerClus位来表示,这个位只占一个Byte,所以最大只能有128个sector。
这里我还是有个疑问:一个sector最小512字节,如果一个cluster有128个sector,也就是说它的容量是64K,这个值已经大于cluster得最大值32K咯,那128个sector到底有没有这样的方式喃?
然后,我们来确定下FAT12,FAT16,和FAT32的最本质的区别,这里同样有个容易让人误解的地方在启动扇区中同样有一位标志位用来表示介质类型BS_FilSysType,这只是一个字符串OS并不会真的去判别这个位的类型,所以如果要区分是那种类型的FAT只有一个办法就是:cluster的数量。
FAT12一定是小于4086, FAT16一定是小于65536, FAT32一定大于65536
现在来总结下关于白皮书主要说了什么:
一, FAT肯定是以“little_endian”方式存储,所以要注意“Big_endian”和“Little_endian”的转化。
二, 启动扇区和BPB注意事项
1) DOS 2.X之后才加入了BPB的结构,之中第一个字节用以区分存储介质
2) 偏移量为0的位置是BS_jmpBoot,3个Byte,后两个表示要跳转的启动代码地址
3) FAT12,FAT16和FAT32之间的区别是在偏移量36之后,BPB_ToSet32区域以前完全一样,主要是用于系统的兼容性。
4) FAT表数目BPB_NumFATs肯定为2,一个为备份,如果只有一个FAT表可能引起一些OS不认。
5) 扇区的结束位[510][511]存储的一定是0x55和0xAA,但是?
6) 最后注意假设我们错把BPB_ToSec16/32的sector的总数填的小于实际的数量会有什么问题吗? 答案是只要不是小的离谱就不会有问题,因为只会造成空间资源的浪费,但是如果设置的比实际数量要大,就可能造成数据溢出FAT卷被破坏,丢失数据等一系列反应。
三, FAT表(FAT数据结构)
文件是按cluster来存储的,即使一个字节也要占一个cluster,同样一个大文件可能存储在多个不连续的cluster上,FAT表就是指出cluster的下一个,有无后续,是否已经占用,是否为坏等等。如下表
如果cluster越多,FAT表就越大,如果是FAT16,最多有0xFFFF个sector,即最大FAT表是 2G*1024*1024/16*1024 = 128K,而FAT12则被限制在6K的范围。
针对这种,FAT32的FAT表就有可能非常之大。
四, FAT类型判别
上面已经说了是由cluster的数量来决定的,具体计算公式参考 FAT32白皮书
五, 之后的关于目录结构,扇区结构,目录等就没有细看了。
PS:
硬盘最基本的组成部分是由坚硬金属材料制成的涂以磁性介质的盘片,不同容量硬盘的盘片数不等。每个盘片有两面,都可记录信息。盘片被分成许多扇形的区域,每个区域叫一个扇区,每个扇区可存储128×2的N次方(N=0.1.2.3)字节信息。在DOS中每扇区是128×2的2次方=512字节,盘片表面上以盘片中心为圆心,不同半径的同心圆称为磁道。硬盘中,不同盘片相同半径的磁道所组成的圆柱称为柱面。磁道与柱面都是表示不同半径的圆,在许多场合,磁道和柱面可以互换使用,我们知道,每个磁盘有两个面,每个面都有一个磁头,习惯用磁头号来区分。扇区,磁道(或柱面)和磁头数构成了硬盘结构的基本参数,帮这些参数可以得到硬盘的容量,基计算公式为:
存储容量=磁头数×磁道(柱面)数×每道扇区数×每扇区字节数
要点:
(1)硬盘有数个盘片,每盘片两个面,每个面一个磁头
(2)盘片被划分为多个扇形区域即扇区
(3)同一盘片不同半径的同心圆为磁道
(4)不同盘片相同半径构成的圆柱面即柱面
(5)公式: 存储容量=磁头数×磁道(柱面)数×每道扇区数×每扇区字节数
(6)信息记录可表示为:××磁道(柱面),××磁头,××扇区