预计阅读本页时间:-
4.5.2 MS-DOS文件系统
MS-DOS文件系统是第一个IBM PC系列所采用的文件系统。它也是Windows 98与Windows ME所采用的主要的文件系统。Windows 2000、Windows XP与Windows Vista上也支持它,虽然除了软盘以外,它现在已经不再是新的PC的标准了。但是,它和它的扩展(FAT-32)一直被许多嵌入式系统所广泛使用。大部分的数码相机使用它。许多MP3播放器只能使用它。流行的苹果公司的iPod使用它作为默认的文件系统,尽管知识渊博的骇客可以重新格式化iPod并安装一个不同的文件系统。使用MS-DOS文件系统的电子设备的数量现在要远远多于过去,并且当然远远多于使用更现代的NTFS文件系统的数量。因此,我们有必要看一看其中的一些细节。
要读文件时,MS-DOS程序首先要调用open系统调用,以获得文件的句柄。open系统调用识别一个路径,可以是绝对路径或者是相对于现在工作目录的路径。路径是一个分量一个分量地查找的,直到查到最终的目录并读进内存。然后开始搜索要打开的文件。
尽管MS-DOS的目录是可变大小的,但它使用固定的32字节的目录项,MS-DOS的目录项的格式如图4-31所示。它包含文件名、属性、建立日期和时间、起始块和具体的文件大小。在每个分开的域中,少于8+3个字符的文件名左对齐,在右边补空格。属性域是一个新的域,包含用来指示一个文件是只读的、存档的、隐藏的还是一个系统文件的位。不能写只读文件,这样避免了文件意外受损。存档位没有对应的操作系统的功能(即MS-DOS不检查和设置它)。存档位主要的用途是使用户级别的存档程序在存档一个文件后清理这一位,其他程序在修改了这个文件之后设置这一位。以这种方式,一个备份程序可以检查每个文件的这一位来确定是否需要备份该文件。设置隐藏位能够使一个文件在目录列表中不出现,其作用是避免初级用户被一些不熟悉的文件搞糊涂了。最后,系统位也隐藏文件。另外,系统文件不可以用del命令删除,在MS-DOS的主要组成部分中,系统位都被设置。
广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元

目录项也包含了文件建立和最后修改的日期和时间。时间只是精确到±2s,因为它只是用2个字节的域来存储,只能存储65 536个不同的值(一天包含86 400秒)。这个时间域被分为秒(5个位)、分(6个位)和小时(5个位)。以日为单位计算的日期使用三个子域:日(5个位),月(4个位),年-1980(7个位)。用7个位的数字表示年,时间的起始为1980年,最高的表示年份是2107年。所以MS-DOS有内在的2108年问题。为了避免灾难,MS-DOS的用户应该尽快开始在2108年之前转变工作。如果把MS-DOS使用组合的日期和时间域作为32位的秒计数器,它就能准确到秒,可把灾难推迟到2116年。
MS-DOS按32位的数字存储文件的大小,所以理论上文件大小能够大至4GB。尽管如此,其他的约束(下面论述)将最大文件限制在2GB或者更小。让人吃惊的是目录项中的很大一部分空间(10字节)没有使用。
MS-DOS通过内存里的文件分配表来跟踪文件块。目录表项包含了第一个文件块的编号,这个编号用作内存里有64K个目录项的FAT的索引。沿着这条链,所有的块都能找到。FAT的操作在图4-12中有描述。
FAT文件系统总共有三个版本:FAT-12,FAT-16和FAT-32,取决于磁盘地址包含有多少二进制位。其实,FAT-32只用到了地址空间中的低28位,它更应该叫FAT-28。但使用2的幂的这种表述听起来要匀整得多。
在所有的FAT中,都可以把磁盘块大小调整到512字节的倍数(不同的分区可能采用不同的倍数),合法的块大小(微软称之为簇大小)在不同的FAT中也会有所不同。第一版的MS-DOS使用块大小为512字节的FAT-12,分区大小最大为212 ×512字节(实际上只有4086×512字节,因为有10个磁盘地址被用作特殊的标记,如文件的结尾、坏块等)。根据这些参数,最大的磁盘分区大小约为2MB,而内存里的FAT表中有4096个项,每项2字节(16位)。若使用12位的目录项则会非常慢。
这个系统在软盘条件下工作得很好,但当硬盘出现时,它就出现问题了。微软通过允许其他的块大小如(1KB,2KB,4KB)来解决这个问题。这个修改保留了FAT-12表的结构和大小,但是允许可达16 MB的磁盘分区。
由于MS-DOS支持在每个磁盘驱动器中划分四个磁盘分区,所以新的FAT-12文件系统可在最大64MB的磁盘上工作。除此之外,还必须引入新的内容。于是就引进了FAT-16,它有16位的磁盘指针,而且允许8KB、16KB和32KB的块大小(32 768是用16位可以表示的2的最大幂)。FAT-16表需要占据内存128KB的空间。由于当时已经有更大的内存,所以它很快就得到了应用,并且取代了FAT-12系统。FAT-16能够支持的最大磁盘分区是2GB(64K个项,每个项32KB),支持最大8GB的磁盘,即4个分区,每个分区2GB。
对于商业信函来说,这个限制不是问题,但对于存储采用DV标准的数字视频来说,一个2GB的文件仅能保存9分钟多一点的视频。结果就是无论磁盘有多大,PC的磁盘也只能支持四个分区,能存储在磁盘中的最长的视频大约是38分钟。这一限制也意味着,能够在线编辑的最大的视频少于19分钟,因为同时需要输入和输出文件。
随着Windows 95第2版的发行,引入了FAT-32文件系统,它具有28位磁盘地址。在Windwos 95下的MS-DOS也被改造,以适应FAT-32。在这个系统中,分区理论上能达到228 ×215 字节,但实际上是限制在2TB(2048GB),因为系统在内部的512字节长的扇区中使用了一个32位的数字来记录分区的大小,这样29 ×232 是2TB。对应不同的块大小以及所有三种FAT类型的最大分区都在图4-32中表示出来。

除了支持更大的磁盘之外,FAT-32文件系统相比FAT-16文件系统有另外两个优点。首先,一个用FAT-32的8GB磁盘可以是一个分区,而使用FAT-16则必须是四个分区,对于Windows用户来说,就是“C:”、“D:”、“E:”和“F:”逻辑磁盘驱动器。用户可以自己决定哪个文件放在哪个盘以及记录的内容放在什么地方。
FAT-32相对于FAT-16的另外一个优点是,对于一个给定大小的硬盘分区,可以使用一个小一点的块大小。例如,对于一个2GB的硬盘分区,FAT-16必须使用32KB的块,否则仅有的64K个磁盘地址就不能覆盖整个分区。相反,FAT-32处理一个2GB的硬盘分区的时候就能够使用4KB的块。使用小块的好处是大部分文件都小于32KB。如果块大小是32KB,那么一个10字节的文件就占用32KB的空间,如果文件平均大小是8KB,使用32KB的块大小,3/4的磁盘空间会被浪费,这不是使用磁盘的有效方法。而8KB的文件用4KB的块没有空间的损失,却会有更多的RAM被FAT系统占用。把4KB的块应用到一个2GB的磁盘分区,会有512K个块,所以FAT系统必须在内存里包含512K个项(占用了2MB的RAM)。
MS-DOS使用FAT来跟踪空闲磁盘块。当前没有分配的任何块都会标上一个特殊的代码。当MS-DOS需要一个新的磁盘块时,它会搜索FAT以找到一个包含这个代码的项。所以不需要位图或者空闲表。