Windows 98操作系统引入了FAT32文件系统,它彻底解决了FAT16文件系统存在的诸多问题。所谓FAT32文件系统实际上就是用32位数据来描述磁盘簇的分配,而传统的磁盘管理是用16个二进制位(2个字节)来描述一个簇。从操作系统的结构上进行分析,可以知道FAT32文件系统并非仅仅简单地将FAT表转换成32位(即用4个字节来描述一个簇),而是带来了磁盘I/O参数、分区和FDT表及文件系统其它方面的变化。为了彻底了解FAT32文件系统对磁盘I/O参数的修改,本文对FAT32文件系统的结构进行了深入分析,揭示了FAT32文件系统存储和管理文件的算法。读懂FAT32文件系统的磁盘I/O参数,不但可以掌握直接访问磁盘文件的方法,而且可以在更高层次上发挥操作系统的功能。
FAT32文件系统对主引导扇区的改变
主引导扇区是硬盘独有的一个磁盘控制数据存储区域,其首要功能是存储有关硬盘分区的数据,它通常位于硬盘的0磁头0柱面1扇区。由于主引导扇区存放硬盘分区的有关数据,因此又称为分区扇区。分区数据对硬盘是至关重要的,分区数据的丢失或破坏将导致硬盘上的逻辑磁盘不能被系统识别,当然也就无法访问磁盘上存储的文件和数据。
根据对FAT32文件系统主引导扇区的分析可知,FAT32文件系统的主引导扇区在保持与FAT16文件系统主引导扇区兼容的基础上,针对FAT32文件系统的特点作了适当扩展。
FAT32文件系统主引导扇区对分区表数据结构的扩展仅限于增加了3个标识32位分区的类型标志,这3个增加的分区类型标志分别为0BH、0CH和0EH,用于描述FAT32文件系统的三种分区情况。对于扩展分区,则增加了一个类型标志0FH,表示Windows
98操作系统扩展分区。类型标志为0BH表示分区是FAT32分区,最大分区容量可以达到2047GB;为0CH表示的意义与0BH相同,但是对于INT13H指令使用扩展的逻辑块地址(LBA)方式;为0EH表示的意义与06H相同,但是对于INT 13H指令使用扩展的逻辑块地址(LBA)方式;为0FH表示的意义与05H相同(扩展分区),但是同样对于INT
13H指令使用扩展的逻辑块地址方式。使用扩展的逻辑块地址方式是为了支持容量超过8GB的大容量硬盘。
由于文件系统转化为FAT32后,分区的类型标志变化为0BH、0CH和0EH,这些新的类型标志是原来FAT16文件系统所不能识别的,所以当用户使用MS-DOS操作系统的软盘启动系统后,机器不能识别硬盘的分区数据,当然也不能对硬盘的数据进行访问。
FAT32文件系统的分区引导扇区
在Windows 98操作系统中,当文件系统从FAT16转化为FAT32后,分区引导扇区的功能和作用并没有改变,但是考虑到FAT32文件系统的特性和为了解决FAT16文件系统存在的问题,操作系统对FAT32文件系统的分区引导扇区进行了扩展。
1.分区引导扇区所占的扇区数从1个扇区扩展为6个扇区
分区引导扇区的核心功能是通过磁盘读写参数加载启动操作系统的文件,为了使加载文件的操作更加灵活,加上FAT32文件系统采用"活动"的FDT表,需要对分区引导扇区的引导程序代码进行重新的设计,同时考虑到引导程序的代码量和为今后发展保留适当的余量,FAT32文件系统将分区引导扇区所占的扇区数从1个扇区扩展为6个扇区,Windows 98使用前3个扇区作为系统的分区引导扇区,其余3个扇区保留暂未使用。
2.采用双重分区引导扇区
根据对分区引导扇区功能和作用的研究,我们知道分区引导扇区对于操作系统的启动和磁盘文件的访问具有至关重要的作用。引导程序代码的损坏将导致操作系统不能正常启动,磁盘读写参数的破坏将造成存储在磁盘上的文件不能正常读写。
由于分区引导扇区的重要性,FAT32文件系统借鉴了操作系统处理FAT表的经验,在磁盘上保留了两份分区引导扇区,并且在启动时操作系统可以对两份引导扇区进行比较,以便选择正确的引导扇区来引导系统。由于在磁盘正常工作过程中系统不再对引导扇区的程序和数据进行修改,因此备份的分区引导扇区损坏的可能性非常小。
FAT32文件系统对磁盘I/O参数的扩展
FAT32文件系统的磁盘读写参数在部分保持与FAT16文件系统磁盘读写参数兼容的基础上,为了适应FAT32文件系统的需要,对磁盘读写参数作了适当扩展,所使用的字节数也从FAT16文件系统的58个字节扩展为87个字节,FAT32文件系统的磁盘读写参数占用扇区偏移地址03H至59H的空间,各参数的具体意义如表1所示。
另外,分区引导扇区的第2个扇区作为文件系统相关参数存储标识扇区,除了保存扇区的标识信息(RraA和rrAa)外,还在偏移地址1E8H处存储了文件系统有关的信息。其中扇区偏移地址1E8H~1EBH的4个字节存储了逻辑磁盘中未使用的簇数,通常用于快速计算逻辑磁盘的剩余空间(典型的操作是在资源管理器状态栏上列出的"可用磁盘空间"参数),而1ECH~1EFH
4个字节给出了逻辑盘中下一个可以分配给文件使用的空闲簇的簇号,这样操作系统可以不访问FAT表就直接获得磁盘剩余空间和可以分配的簇号。
分区引导扇区的第3个扇区则存储了引导扇区的后一部分引导系统的程序代码。
表1 FAT32文件系统磁盘读写参数表
编 号 |
起始偏移地址 |
占字节数 |
意 义 |
1 |
03H |
8 |
操作系统的版本号。 |
2 |
0BH |
2 |
每个扇区的字节数。 |
3 |
0DH |
1 |
每簇扇区数。 |
4 |
0EH |
2 |
为操作系统保留的扇区数。 |
5 |
10H |
1 |
FAT表的个数。 |
6 |
11H |
2 |
在FAT16中存放系统根目录中允许登记的目录项个数,FAT32中用于标注系统采用的是否为FAT32文件系统。其值为0000H表示磁盘使用FAT32文件系统。 |
7 |
13H |
2 |
值为00H,为保持兼容性而保留,未使用。 |
8 |
15H |
1 |
磁盘介质标志,硬盘为F8。 |
9 |
16 |
2 |
未使用,值为00H。 |
10 |
18H |
2 |
每个磁道的扇区数。 |
11 |
1AH |
2 |
磁盘的磁头个。 |
12 |
1CH |
4 |
分区前隐藏扇区的个数。 |
13 |
20H |
4 |
逻辑磁盘中的扇区总数。 |
14 |
24H |
4 |
每个FAT表所占的扇区数。 |
15 |
28H |
2 |
FAT表镜像标志,值为0表示系统保存2份互为备份的FAT表,值为1表示系统仅保存1份FAT表。 |
16 |
2AH |
2 |
文件系统的主次版本(保留)。 |
17 |
2CH |
4 |
磁盘根目录的起始簇号。 |
18 |
30H |
2 |
文件系统参数的扇区号,通常位于引导扇区的下一个扇区。 |
19 |
32H |
2 |
备份分区引导扇区的逻辑扇区号。 |
20 |
34H |
12 |
保留,未使用。 |
21 |
40H |
2 |
磁盘的物理驱动器号。 |
22 |
42H |
1 |
磁盘读写参数扩展标志,其值为29H。 |
23 |
43H |
4 |
磁盘卷的序列号。 |
24 |
47H |
11 |
磁盘卷标号。 |
25 |
52H |
8 |
文件系统的标识号(FAT32)。 |
FAT32文件系统磁盘I/O参数实例
图1列出了一个FAT32文件系统的磁盘读写参数实例,结合表1列出的I/O参数意义可以知道:该逻辑磁盘总共有2076417(1FAF01H)个扇区,为操作系统保留了51(33H)个扇区,每簇由8个扇区构成,每个磁道有63(003FH)个扇区,系统有两个互为镜像的FAT表,每个FAT表占用2028(07ECH)个扇区,FDT表的起始簇号为第2个簇(00000002H),备份的分区引导扇区存储在第6个逻辑扇区开始的存储空间,磁盘文件系统的标识号为FAT32。
图1 FAT32文件系统I/O参数实例
-------基础概念
数据存储
数据存储在硬盘的时候都以簇位单位,所以无论文件大小是多少,除非正好是簇大小的倍数,否则文件所占用的最后一个簇或多或少都会产生一些剩余的空间.且这些空间又不能给其它文件使用。
比如在一个簇大小为64KB的分区中,如果存储的正好是64KB大小的文件,那么这个簇就能够完全被利用,如果这个文件只有63KB,它也要占用一个簇,这时就浪费了1KB的空间。要是需要存储的文件为65KB,则需要2个簇才可以保存,这时浪费的空间就是63KB了。但是当一个分区的簇大小为4KB时,存储65KB的文件只会浪费3KB的空间。可见,簇的大小越小,浪费的空间也就越少,硬盘空间的利用率也就越高。
数据存储在硬盘的时候都以簇位单位
簇的配置
Windows 9x/Me系统中常用的文件簇通常为FAT16或者FAT32格式
比如一个256M的硬盘空间可以有数种配置簇的方式:
簇大小=4KB:256MB/4KB=655356个簇
簇大小=8KB:256MB/8KB=32768个簇
簇大小=16KB:256MB/16KB=16384个簇
簇大小=32KB:256MB/32KB=8192个簇
对于Windows NT/2000/XP特有的NTFS文件系统来说,虽然也是采用簇方式来存储数据,但它却和FAT16/FAT32有着明显的不同。当分区空间大于2GB的时候,无论硬盘有多大,簇的大小一律维持在4KB。由于簇容量小,所以无论存储何种类型的文件都不会浪费太多的硬盘空间,这也使得整个硬盘的空间利用率得到了极大的提高
什么是簇?
文件系统是操作系统与驱动器之间的接口,当操作系统请求从硬盘里读取一个文件时,会请求相应的文件系统(FAT16/32/NTFS)打开文件。扇区是磁盘最小的物理存储单元,但由于操作系统无法对数目众多的扇区进行寻址,所以操作系统就将相邻的扇区组合在一起,形成一个簇,然后再对簇进行管理。每个簇可以包括2、4、8、16、32或64个扇区。显然,簇是操作系统所使用的逻辑概念,而非磁盘的物理特性。
为了更好地管理磁盘空间和更高效地从硬盘读取数据,操作系统规定一个簇中只能放置一个文件的内容,因此文件所占用的空间,只能是簇的整数倍;而如果文件实际大小小于一簇,它也要占一簇的空间。所以,一般情况下文件所占空间要略大于文件的实际大小,只有在少数情况下,即文件的实际大小恰好是簇的整数倍时,文件的实际大小才会与所占空间完全一致。