文件分配表是用来表示磁盘文件的空间分配信息的,它不对引导区、文件目录 表的信息进行表示,也不真正存储文件内容.
文件占用磁盘空间时,基本单位不是字节而是簇。簇的大小与磁盘的规格有关,一般情况下,软盘每簇是1个扇区,硬盘每簇的扇区数与硬盘的总容量大小有关,为2的n次方,可能是4、8、16、32、64……
由于FAT对于文件管理 的重要性,所以FAT有一个备份,即在原FAT的后面再建一个同样的FAT。初形成的FAT中所有项都标明为"未占用",但如果磁盘有局部损坏,那幺格式化程序会检测出损坏的簇,在相应的项中标为"坏簇",以后存文件时就不会再使用这个簇了。FAT的项数与硬盘上的总簇数相当,每一项占用的字节数也要与总簇数相适应,因为其中需要存放簇号。FAT的格式有多种,最为常见和为读者所熟悉的是FAT16和FAT32,其中FAT16是指文件分配表使用16位数字,由于16位分配表最多能管理65536(即2的16次方)个簇,也就是所规定的一个硬盘分区。
由于每个簇的存储空间 最大只有32KB,所以在使用FAT16管理硬盘时,每个分区的最大存储容量只有(65536×32 KB)即2048MB,也就是我们 常说的2G。现在的硬盘容量是越来越大,由于FAT16对硬盘分区的容量限制,所以当硬盘容量超过2G之后,用户只能将硬盘划分成多个2G的分区后才能正常使用,为此微软公司从Windows 95 OSR2版本开始使用FAT32标准,即使用32位的文件分配表来管理硬盘文件,这样系统就能为文件分配多达4294967296(即2的32次方)个簇,所以在簇同样为32KB时每个分区容量最大可达65G以上。此外使用FAT32管理硬盘时,每个逻辑盘中的簇长度也比使用FAT16标准管理的同等容量逻辑盘小很多。由于文件存储在硬盘上占用的磁盘空间以簇为最小单位,所以某一文件即使只有几十个字节也必须占用整个簇,因此逻辑盘的簇单位容量越小越能合理利用存储空间。所以FAT32更适于大硬盘。
文件占用磁盘空间时,基本单位不是字节而是簇。簇的大小与磁盘的规格有关,一般情况下,软盘每簇是1个扇区.
硬盘每簇的扇区数与硬盘的总容量大小有关,其值见下表:
分区大小 FAT16 (扇区数/簇) FAT32 (扇区数/簇)
16MB-127MB 4 1
128MB-255MB 8 1
256MB-259MB 16 1
260MB-511MB 16 8
512MB-1023MB 32 8
1024MB-2047MB 64 8
2048MB-8GB 不支持 8
8GB-16GB 不支持 16
16GB-32GB 不支持 32
32GB以上 不支持 64
FAT16及FAT32相關特定值意義如下:
FAT16
1.DBR 第0扇区开始,使用一个扇区,没有保留扇区.
2.FAT表长 在DBR第16H处的2字节(表示占用扇区数),FAT1從第1扇區開始
3.FAT簇 每簇用16位二进制数表示FAT表中每簇地址占2Bytes
4.可用簇号 0002H - FFEFH ( <= FFEDH[65518]个簇)
5.特定簇号 0000H、0001H两簇号不使用,其对应DWORD位置:F8 FF FF 7F
簇值意义 不要把FAT表项内的数字误认为表示当前簇号,而应是该文件的下一个簇的簇号
高字节在后低字节在前是存储方式,读出时应进行调整,如两字节12H 34H,实际应为3412H
值FFF0H用来表示坏簇 值FFFFH表示文件结束簇
特定值表示坏簇,其它值表示为文件占用的下一簇的簇号
6.根目录区扇区大小,在DBR第11H的两字节(表示32字节的根目录个数)如值为00 02,则0200H=512个,即512*32字节=16384字节,等于32个扇区
7.扇区数量 在DBR第13H处2字节
FAT32
1.DBR 从第0扇区开始,使用三个扇区,保存了该逻辑盘每扇区字节数,每簇对应的扇区数等重要参数和引导记录.(佔用32扇區)
2.FAT表长 在DBR第24H处的4字节(表示FAT占用扇区数),FAT1從第32扇區開始.
3.FAT簇 FAT表中每簇地址占4Bytes
4.可用簇号 00000002H - FFFFFEFFH
5.特定簇号 0000000H、00000001H两簇号不使用,其对应的两个DWORD位置(FAT表开头的8个字节)用来存放该盘介质类型编号:F8 FF FF 0F FF FF FF 0F
值00000000H表示该簇未被分配值FFFFFF0FH表示是该簇是文件占用的最后一族
特定值表示坏簇,其它值表示为文件占用的下一簇的簇号
6.根目录区扇区大小, 不再是固定区域和固定大小
7.扇区数量 在DBR第20H处的4字节
其它:
1. FAT表按顺序依次记录了该盘各簇的使用情况,是一种位示图法.
2. 每簇所占用扇区数见上.
3. 微软建议对小于512M的逻辑盘不使用FAT32
4. 对于使用FAT16文件系统的硬盘分区时,不要将分区(逻辑盘)容量正好设为某一区间的下限.
计算公式:
每个扇区长度 = 512字节
总簇数 = 逻辑盘容量/簇容量
总簇数 = FAT表长度(字节)/每个表项长度(字节)- 2
FAT表长度=逻辑盘容量/簇容量*每个表项长度
每个有效的FAT结构区包含两个完全相同的拷贝:FAT1、FAT2
如: 2G FAT 16分区格式的HD, FAT长度为250Sectors,
则总簇数= 250 * 512 / 2 - 2 = 63998
簇容量(每簇扇区数) = 2 097 000 000 / 63998 = 32776Bytes = 64 Sectors
文件目录表FDT(File Directory Table),即根目录(DIR)区,又称为ROOT区
紧跟在FAT2的下一个扇区开始,记录着根目录下每个文件(目录)的起始单元,文件的属性等。定位文件位置时,操作系统根据DIR中的起始单元,结合FAT表就可以知道文件在硬盘中的具体位置和大小了。
如果支持长文件名,则每个表项为64个字节,其中,前32个字节为长文件链接说明;后32个字节为文件属性说明,包括文件长度、起始地址、日期、时间等。如不支持长文件名,则每个表项为32个字节的属性说明。
根目录下可包含文件和子目录,子目录下又可包含文件和下级子目录.一个子目录也占用一个文件目录项,只不过它的属性字节为10H,文件长度字节为0.一个子目录中的内容是若干个文件目录项或下级子目录项.
Start Pos. Bytes FAT16 FAT32
00-07 8 文件名 文件名
08-0A 3 文件扩展名 文件扩展名
0B 1 FAT16://表示属性: 00000000读写 00000001只写 00000010隐含 00000111系统,隐含,只读 00000100系统 00001000卷标 00010000子目录 00100000档案,只要完成写操作并已关闭即置1
FAT32://0至5位分别是只读位、隐藏位、系统位、卷标位、子目录位、归档位
最高两位保留未用
0C-0D 2 保留未用 存储短文件名字节校验和
0E-0F 2 保留未用 文件创建时间
10-11 2 保留未用 文件创建日期
12-13 2 保留未用 最新访问日期
14-15 2 保留未用 文件存放的起始簇号的高16位
16-17 2 文件创建时间(hhhhhmmmmmmsssss) 文件最新修改时间
18-19 2 文件创建日期(yyyyyyymmmmddddd) 文件最新修改日期
1A-1B 2 文件存放的起始簇号(低字节在前) 文件存放的起始簇号的低16位
1C-1F 4 文件长度 文件长度
注:目录项中第0~7字节为文件名(若有剩余字节则用空白字符20H填充).
其中,第1字节又表明了该文件的状态 ,它有如下四种取值方式:
a. 00H--目录项的空目录。
b. E5H--表示该目录项曾经使用过,但文件已被删除。
c. 2EH--表示子目录下的两个特殊 文件"."或".."目录项
d. 其它任何字符--表示一个文件名(或目录名)的第一个字符的ASCII码值.
数据(DATA)区
数据区是真正意义上的数据存储的地方,位于DIR区之后,占据硬盘上的大部分数据空间。
文件数据起始地址(扇区号) = 保留扇区数(DBR) + 每FAT扇区数 * 2 + 根目录项数/32 (FDT扇区数) + 每簇扇区数 * (起始簇号 - 2)
当一个程序对操作系统要求提供 某一个文件的内容时,操作系统会到此文件的目录记录表去寻找它的第一个簇号码, 然后再到FAT记录表里去找在此一链结(Chain)里的下一个簇。 此动作不断的重复直到找到文件的最后一个簇为止,操作系统可以精确的计算那些簇属于这个文件及其先后顺序。经由此方式,操作系统可以提供程序所要求之文件的任何部分。这种组织文件的方式称 为FAT链(FAT Chain).
在FAT文件系统下,文件永远被分配到整数单位的簇。 在一个每一簇大小为32K的1.2GB磁盘中,一个只包含"Hello,World!"这几个字符的大小为12个 字节文件仍要在磁盘中占32K的空间。在簇中没有用到的部分称为耗损(Slack),小文件的耗损几乎与整个簇相当,平均来说,一个文件会有一半左右的耗损。
文件的读取: 操作系统从目录区中读取文件信息 (包括文件名、后缀名、文件大小、修改日期和文件在数据区保存的第一个簇的簇号),我们这里假设第一个簇号是0023。操作系统从0023簇读取相应的数据,然后再找到FAT的0023单元,如果内容是文件结束标志(FF),则表示文件结束,否则内容保存数据的下一个簇的簇号,这样重复下去直到遇到文件结束标志。
文件的写入:当我们要保存文件时,操作系统首先在DIR区中找到空区写入文件名、大小和创建时间等相应信息,然后在Data区找到闲置空间将文件保存,并将Data区的第一个簇写入DIR区,其余的动作和上边的读取动作差不多。
DOS删除文件时只是把文件目录表中的该文件的表项第0个字节改为E5h,表此表项已被删除,并在文件分配表中把该文件占用各簇的表项清0,以释放空间。其实文件的内容仍在盘上,并没有被真正删除,这就是undelete.exe、unerase.exe等一类恢复删除工具能起作用的原因。
文件占用磁盘空间时,基本单位不是字节而是簇。簇的大小与磁盘的规格有关,一般情况下,软盘每簇是1个扇区,硬盘每簇的扇区数与硬盘的总容量大小有关,为2的n次方,可能是4、8、16、32、64……
文件占用磁盘空间时,基本单位不是字节而是簇。簇的大小与磁盘的规格有关,一般情况下,软盘每簇是1个扇区.
硬盘每簇的扇区数与硬盘的总容量大小有关,其值见下表:
分区大小 FAT16 (扇区数/簇) FAT32 (扇区数/簇)
16MB-127MB 4 1
128MB-255MB 8 1
256MB-259MB 16 1
260MB-511MB 16 8
512MB-1023MB 32 8
1024MB-2047MB 64 8
2048MB-8GB 不支持 8
8GB-16GB 不支持 16
16GB-32GB 不支持 32
32GB以上 不支持 64
FAT16及FAT32相關特定值意義如下:
FAT16
1.DBR 第0扇区开始,使用一个扇区,没有保留扇区.
2.FAT表长 在DBR第16H处的2字节(表示占用扇区数),FAT1從第1扇區開始
3.FAT簇 每簇用16位二进制数表示FAT表中每簇地址占2Bytes
4.可用簇号 0002H - FFEFH ( <= FFEDH[65518]个簇)
5.特定簇号 0000H、0001H两簇号不使用,其对应DWORD位置:F8 FF FF 7F
簇值意义 不要把FAT表项内的数字误认为表示当前簇号,而应是该文件的下一个簇的簇号
高字节在后低字节在前是存储方式,读出时应进行调整,如两字节12H 34H,实际应为3412H
值FFF0H用来表示坏簇 值FFFFH表示文件结束簇
特定值表示坏簇,其它值表示为文件占用的下一簇的簇号
6.根目录区扇区大小,在DBR第11H的两字节(表示32字节的根目录个数)如值为00 02,则0200H=512个,即512*32字节=16384字节,等于32个扇区
7.扇区数量 在DBR第13H处2字节
FAT32
1.DBR 从第0扇区开始,使用三个扇区,保存了该逻辑盘每扇区字节数,每簇对应的扇区数等重要参数和引导记录.(佔用32扇區)
2.FAT表长 在DBR第24H处的4字节(表示FAT占用扇区数),FAT1從第32扇區開始.
3.FAT簇 FAT表中每簇地址占4Bytes
4.可用簇号 00000002H - FFFFFEFFH
5.特定簇号 0000000H、00000001H两簇号不使用,其对应的两个DWORD位置(FAT表开头的8个字节)用来存放该盘介质类型编号:F8 FF FF 0F FF FF FF 0F
值00000000H表示该簇未被分配值FFFFFF0FH表示是该簇是文件占用的最后一族
特定值表示坏簇,其它值表示为文件占用的下一簇的簇号
6.根目录区扇区大小, 不再是固定区域和固定大小
7.扇区数量 在DBR第20H处的4字节
其它:
1. FAT表按顺序依次记录了该盘各簇的使用情况,是一种位示图法.
2. 每簇所占用扇区数见上.
3. 微软建议对小于512M的逻辑盘不使用FAT32
4. 对于使用FAT16文件系统的硬盘分区时,不要将分区(逻辑盘)容量正好设为某一区间的下限.
计算公式:
每个扇区长度 = 512字节
总簇数 = 逻辑盘容量/簇容量
总簇数 = FAT表长度(字节)/每个表项长度(字节)- 2
FAT表长度=逻辑盘容量/簇容量*每个表项长度
每个有效的FAT结构区包含两个完全相同的拷贝:FAT1、FAT2
如: 2G FAT 16分区格式的HD, FAT长度为250Sectors,
则总簇数= 250 * 512 / 2 - 2 = 63998
簇容量(每簇扇区数) = 2 097 000 000 / 63998 = 32776Bytes = 64 Sectors
文件目录表FDT(File Directory Table),即根目录(DIR)区,又称为ROOT区
紧跟在FAT2的下一个扇区开始,记录着根目录下每个文件(目录)的起始单元,文件的属性等。定位文件位置时,操作系统根据DIR中的起始单元,结合FAT表就可以知道文件在硬盘中的具体位置和大小了。
如果支持长文件名,则每个表项为64个字节,其中,前32个字节为长文件链接说明;后32个字节为文件属性说明,包括文件长度、起始地址、日期、时间等。如不支持长文件名,则每个表项为32个字节的属性说明。
根目录下可包含文件和子目录,子目录下又可包含文件和下级子目录.一个子目录也占用一个文件目录项,只不过它的属性字节为10H,文件长度字节为0.一个子目录中的内容是若干个文件目录项或下级子目录项.
Start Pos. Bytes FAT16 FAT32
00-07 8 文件名 文件名
08-0A 3 文件扩展名 文件扩展名
0B 1 FAT16://表示属性: 00000000读写 00000001只写 00000010隐含 00000111系统,隐含,只读 00000100系统 00001000卷标 00010000子目录 00100000档案,只要完成写操作并已关闭即置1
FAT32://0至5位分别是只读位、隐藏位、系统位、卷标位、子目录位、归档位
最高两位保留未用
0C-0D 2 保留未用 存储短文件名字节校验和
0E-0F 2 保留未用 文件创建时间
10-11 2 保留未用 文件创建日期
12-13 2 保留未用 最新访问日期
14-15 2 保留未用 文件存放的起始簇号的高16位
16-17 2 文件创建时间(hhhhhmmmmmmsssss) 文件最新修改时间
18-19 2 文件创建日期(yyyyyyymmmmddddd) 文件最新修改日期
1A-1B 2 文件存放的起始簇号(低字节在前) 文件存放的起始簇号的低16位
1C-1F 4 文件长度 文件长度
注:目录项中第0~7字节为文件名(若有剩余字节则用空白字符20H填充).
a. 00H--目录项的空目录。
b. E5H--表示该目录项曾经使用过,但文件已被删除。
d. 其它任何字符--表示一个文件名(或目录名)的第一个字符的ASCII码值.
数据(DATA)区
数据区是真正意义上的数据存储的地方,位于DIR区之后,占据硬盘上的大部分数据空间。
文件数据起始地址(扇区号) = 保留扇区数(DBR) + 每FAT扇区数 * 2 + 根目录项数/32 (FDT扇区数) + 每簇扇区数 * (起始簇号 - 2)
在FAT文件系统下,文件永远被分配到整数单位的簇。 在一个每一簇大小为32K的1.2GB磁盘中,一个只包含"Hello,World!"这几个字符的大小为12个 字节文件仍要在磁盘中占32K的空间。在簇中没有用到的部分称为耗损(Slack),小文件的耗损几乎与整个簇相当,平均来说,一个文件会有一半左右的耗损。
文件的写入:当我们要保存文件时,操作系统首先在DIR区中找到空区写入文件名、大小和创建时间等相应信息,然后在Data区找到闲置空间将文件保存,并将Data区的第一个簇写入DIR区,其余的动作和上边的读取动作差不多。
DOS删除文件时只是把文件目录表中的该文件的表项第0个字节改为E5h,表此表项已被删除,并在文件分配表中把该文件占用各簇的表项清0,以释放空间。其实文件的内容仍在盘上,并没有被真正删除,这就是undelete.exe、unerase.exe等一类恢复删除工具能起作用的原因。