Hiyou1 2010.10
FAT文件系统分为三种类型:FAT12、FAT16、FAT32,FAT12和FAT16基本相同,FAT32与其稍有不同,所以下面在介绍中将主要以FAT16和FAT32为例,FAT12不同的地方会另外说明。
●簇
簇的大小是2^n个扇区(2^表示2的n次方),扇区通常为512字节(可以是2^nBytes)。有资料上说簇在大小要在32K之内,因为虽然有些版本的操作系统支持K的簇,但很多应用程序的安装程序无法在这样的文件系统上正常运行。
簇是文件存储在基本单位。哪怕文件只有一个字节它也要占一个簇。所以在可表示的总容量允许的情况下,我们尽量要将簇设得小一些,以此来减少浪费的空间。
FAT文件系统后面的数字即与簇相关,它表示簇号所占的bit位数。如FAT16表示一个簇号占16位,这样它可表示的最大簇数是2^16。由此我们可以由 簇数*字节/簇得到该分区的文件系统所支持的最大分区容量。
●结构
FAT16
| 保留区 | FAT区 | 根目录区 | 文件和目录数据区 |
| 保留区 | FAT区 | 文件和目录数据区(根目录在其中) |
保留区(Reserved Region),是分区内位于FAT区前的区域,至少有1个Sector。FAT16一般为1,FAT32一般为32。
操作系统引导记录DBR即位于保留区的第一个Sector(即为什么保留区至少有1个sector)。
●DBR
DBR(Dos Boot Record)是分区的第一个扇区,又称启动扇区,以0xAA55为结束标志。操作系统即以此标志判断DBR,进而读取磁盘参数和进行其它操作。
DBR中有两个重要结构:BPB(BIOS Parameter Block)和BS(Boot Sector),其成员分别以BPB_和BS_开头,描述了分区的各个信息如:
跳转指令、每扇区字节数、每簇扇区数、
保留扇区数、FAT表数、FAT所占扇区数、
根目录文件数、逻辑扇区总数、磁头数、隐藏扇区数、
每磁道扇区数、媒体描述符、文件系统标识……
具体请参阅有关资料。
FS系统标识占8个字节,形如"FAT16 ",但MS操作系统并非依此判定FS类型,即使把此处的记号表示为其它甚至为宽,MS OS仍能根据其它判断OS类型,但你还是严格来写此区域,因为一些其它的OS据此判定FS。
从偏移36开始,FAT16和FAT32的DBR开始有所区别。
注意:文件系统的数据存储形式是小端方式(Little-endian)我们所写的0XAA55,在小端方式存储的机器上是低字节55在前。哈佛架构的计算机是小端方式存储的。我们在写入时只要指定所写数据的类型(决定了数据所占字节)即可。下面不再说明
●FAT区
FAT(File Allocation Table)文件分配表,是FAT文件系统的得名。FAT表一般为两个,第二个用于备份。
FAT表以链式存储的形式,记录了文件所在的簇号,OS即以根目录中存储的文件首簇号及FAT表中存储的簇号,实现对文件的读写。
下面以FAT16说明簇号所代表的含义:
FFF8 磁盘标识字 FFFF 第一簇已经被占用 0000 可用 0002-FFEF 已用簇
FFF0-FFF6 保留簇 FFF7 坏簇 FFF8-FFFF 文件的最后一簇
FAT12和FAT32与此类似,只不过用12和32位表示,前面加上或减去F即可。这些标识一般由OS在存储文件时自动完成
FAT表的前两个簇号为标识信息,
FAT12为0XFFFFF8 占3个字节
FAT16为0xFFFFFFF8, 占4个字节
FAT32为FFFFFFFFFFFFFFF8,占8个字节
(最低字节与DBR偏移21处的磁盘介质描述符要保持一致,F8表示可移动盘,F0表示软盘)
●根目录区
Root Directory Region.存储了该分区文件所在的首簇号和文件的基本信息,如文件名、文件长度、文件属性等。每个文件信息占32字节。
FAT12和FAT16固定为32个sector。以每个sector为512字节计算,它们支持的最大目录项数是512。
FAT32没有此区域,它的根目录在文件和目录数据区,它将根目录等同于普通的文件,这样就没有了FAT12/16中512个目录项的,不够时增加簇链即可。
卷标在根目录区的前几个字节。
●长文件名
FAT12和FAT16文件名和后缀名共11Bytes,它支持长文件名,但这种支持是以目录项的减少为代价的,就是说如果文件使用的是长文件名,那么此分区所支持的最大文件数就会变少。
FAT32完全支持长文件名。这正是因为其目录项在文件和数据区而可以增加的缘故。
文件是长文件名时,系统会自动产生一个短文件名,用于其它较低版本的OS正确识别文件。
●文件和目录数据区
File And Directory Data Region 存储的是文件或目录的内容,文件在此区域不是连续存储的,而是由FAT表中的簇号确定的。
●文件的存取
文件的存取是操作系统完成的。
写文件时,OS在根目录区与入文件首簇号和基本信息,在FAT表中写入文件所占的簇号,在数据区写入文件的内容。
读文件时,操作系统首先从根目录区取得文件的首簇号x,再去FAT表的x簇号处取得文件的下一个簇号a,再到a号处读取下个簇号,直到读到的簇号为FFFFFFFF表示文件结束。这样就知道了整个文件所占的簇号,再到磁盘中簇号所代表的区域读取文件。
●我们要做的工作
那么我们在写一个文件系统时要做些什么呢?其实很简单
首先是根据容量,确定要写的合适文件系统。
再就是计算DBR、FAT表、跟目录所占扇区数并将这些扇区擦“0”,可以发命令实现,如果不知道命令我们也可以在这些直接写“0”。
然后写DBR,在FAT表中的前两个簇号所占的字节写相应文件系统及介质标志,在目录项写卷标。
●MBR
如果我们只是把磁盘作为存储介质,那么上面的工作已经够了。
如果磁盘有大于一个分区或作为启动盘等,我们还要写MBR(Main Boot Sector)。
MBR也占512字节,也是以0xAA55(55在前)作为结束标志。
结束标志前面的个字节用来表示磁盘分区,每个分区占16字节,描述了分区的大小,分区开始和结束位置,分区文件系统类型等信息。具体请参阅有关资料,这里不再做详细介绍。
最前面的448个字节保留。
MBR所在区域称为隐藏扇区(Hidden Sector),隐藏扇区是第一个分区的DBR之前的部分,MBR即隐藏扇区的第一个扇区。所以隐藏扇区的大小至少为1.下载本文