文件分配表(FAT),是一种由微软发明并拥有部分专利 的文件系统,供MS-DOS使用,也是所有非NT核心的Windows系统使用的文件系统。FAT文件系统考虑当时电脑性能有限,所以未被复杂化,因此几乎所有个人电脑的操作系统都支持。
文件分配表(File Allocation Table,FAT),是一种由微软发明并拥有部分专利 的文件系统,供 MS-DOS 使用,也是所有非 NT 核心的 Windows 系统使用的文件系统。
FAT 文件系统考虑当时电脑性能有限,所以未被复杂化,因此几乎所有个人电脑的操作系统都支持。这特性使它成为理想的软盘和存储卡文件系统,也适合用作不同操作系统中的资料交流。
但 FAT 有一个严重的缺点:当文件删除后写入新资料,FAT 不会将文件整理成完整片段再写入,长期使用后会使文件资料变得逐渐分散,而减慢了读写速度。碎片整理是一种解决方法,但必须经常磁盘碎片整理来保持 FAT 文件系统的效率。
历史
FAT 文件系统遵行已用了多年的软件方法来进行规范。它在 1977 年由比尔·盖茨和马斯·麦当劳为了管理磁盘而发明,并在 1980 年被添·彼得逊的 86-DOS 操作系统采用。这也是 86-DOS 操作系统与 CP/M 操作系统最大的不同点,若非此项差异,86-DOS 操作系统与 CP/M 操作系统几乎可说完全相同。
FAT12
初期的 FAT 就是现在俗称的 FAT12。作为软盘的文件系统,它有几项限制:不支持分层性结构,簇寻址只有 12 位(这使得控制 FAT 有些棘手)而且只支持最多 32M(216)的分区。
当时入门级的磁盘是 5.25″、单面、40 磁道、每个磁道 8 个扇区、容量略少于 160KB。上面的限制超过了这个容量一个或几个数量级,同时允许将所有的控制结构放在第一个磁道,这样在读写操作时移动磁头。这些限制在随后的几年时间里被逐步增大。
由于唯一的根目录也必须放在第一个磁道,能够存放的文件个数就限制在几十个。
目录
MS-DOS 2.0 为了支持以内置 10MB 硬盘为特色的 IBM PC XT,因此几乎与该计算机同时在 1983 年初发布。它引进了层次目录结构,除了允许更有效率地组织文件外,目录允许在硬盘上存储更多的文件,这是因为最大文件个数不再受制于(仍然是固定且有限的)根目录大小。这个数目现在能够等同于簇的数目(甚至更大,这是考虑到长度为 0 的文件并不占据任何 FAT 簇)。
FAT 本身的格式并没有改变。PC XT 的 10MB 的硬盘有 4KB 大小的簇。如果后来安装了一个 20MB 的硬盘,并且使用 MS-DOS 2.0 格式化,最后的簇大小将变为 8KB,硬盘容量将变为 15.9MB。
FAT16 的开始
在 1984 年,IBM 发布 PC AT,内含一个 20MB 的硬盘。微软公司也同步发布了 MS-DOS 3.0。簇集地址增加至 16 位,允许更大数量的簇(最大 65,517),所以有更大的文件系统大小。但是,最大数量扇区及最大分区(相当于磁盘)的大小仍是 32MB。所以,尽管技术上已经是“FAT16”,这种格式并不是我们今天常见到的这个名字所代表的格式。在 MS-DOS 3.0 格式化一个 20 MB 的硬盘,这硬盘将不能被 MS-DOS 2.0 或之前的版本所访问。当然,MS-DOS 3.0 仍然可访问 MS-DOS 2.0 的格式(8KB 簇的分区)。
MS-DOS 3.0 也开始支持高密度 1.2MB 5.25″磁盘,最著名的是每个磁道有 15 个扇区,这样就允许 FAT 有更大的空间。这或许促进了一个对于簇大小的不确定的优化,簇大小从 2 个扇区减到 1 个。这样做的最后结果是高密度磁盘比旧的双密度磁盘的速度大幅度降低。
扩展分区和逻辑驱动器
除了改进 FAT 文件系统本身的结构之外,另一个提高 FAT 存储空间的方式是支持多个磁盘分区。最初,受限于主引导记录中文件分配表的固定结构一个硬盘最多只能切出多达 4 个分区。然而,由于 DOS 设计要求只能有一个分区标识为“活动的(Active)”,它也是主引导代码启动所用的分区。使用 DOS 工具不可能创建几个“主”DOS 分区,并且第三方的工具也至少会警告这样一个机制将与 DOS 不兼容。
为了用一种兼容的方式使用更多的分区,一种新的分区类型被开发出来(1986 年 1 月的 MS-DOS 3.2),扩展分区它实际上是另外称为逻辑分区的一个容器。最初它里面只允许有一个逻辑分区、支持最大 64MB 的硬盘。在 MS-DOS 3.3(1987 年 8 月)这个限制更改到 24 个分区;它可能来自于强制性的 C:-Z:的磁盘命名规则。逻辑分区表使用盘上的数据结构来描述,可能是为了简化编码它与主引导记录非常相似,并且它们组织成类似于俄罗斯套娃那样的结构。一颗硬盘中只能有一个扩展分区。
在扩展分区观念导入之前,一些硬盘控制器(当时采用独立的硬盘控制卡,IDE 标准尚未出现)能够将大硬盘显示为两个独立的硬盘。
最终的 FAT16
1987 年 11 月,我们今天称之为 FAT 的格式最终到来,它在康柏 DOS 3.31 中去掉了磁盘扇区的 16 位计数器。这个结果曾经一度被称为 DOS 3.31 大文件系统。尽管看起来磁盘上的变动很小,这个 DOS 的磁盘代码都必须检查并转换到 32 位的扇区数,由于它完全是 16 位的汇编语言这样一个现实,这项工作就变得非常复杂。
1988 年,这项改进通过 MS-DOS 4.0 得到广泛应用。现在分区大小受限于每个簇的 8 位有符号扇区计数,它最大能达到 2 的 64 次方,对于一个常用的有 32KB 个簇每扇区 512 字节的硬盘来说,将 FAT16 分区大小的“明显”限制扩充到 2GB。在磁光盘媒体上,它能使用 1 或者 2KB 的扇区,这样大小限制也就成比例地增大。
后来,Windows NT 通过将每个簇的扇区数当作无符号数将最大的簇大小增加到 64KB。然而这个格式与当时其它任何格式的 FAT 都不兼容,并且这样的操作会产生大量的内部碎片。Windows 98 也支持这种格式的读写操作,但是它的磁盘管理工具不支持这种格式。
长文件名(VFAT, LFN)
Windows 95 设计人员的一个用户体验目标就是:除了传统的 8.3 文件名以外,在新操作系统中使用长文件名(LFN)。长文件名通过在目录条目排列时,使用一个工作区来实现(参见下面)。按照 Windows 95VxD 设备驱动程序的命名规则,这个新扩充的文件系统通常称为 VFAT。
有意思的是,VFAT 驱动在早于 Windows 95 的 Windows for Groups 3.11 中就已经出现,但它仅仅用于实现 32 位文件访问,一个绕过 DOS 的视窗自带高性能保护模式文件管理系统,它能够直接使用 BIOS 或者更好的 32 位磁盘访问,如 Windows 自带的保护模式磁盘驱动程序。它是一个后门;微软为 Windows for Groups 3.11 所作的广告说 32 位文件访问基于“芝加哥项目的 32 位文件系统”。
在 Windows NT 中,FAT 文件系统对于长文件名的支持从 3.5 版就已经开始了。在 MS-DOS 7.0 以后的版本中,则可使用类似 DOSLFN 这样的软件使得 DIR 等命令显示出长文件名。
FAT32
为了解决 FAT16 对于卷大小的限制同时让 DOS 的实模式在非必要情况下不减少可用常规内存状况下处理这种格式,微软公司决定实施新一代的 FAT,它被称为 FAT32,带有 32 位的簇数,目前用了其中的 28 位。
理论上,这将支持总数达 268,435,438(<228)的簇,允许磁盘容量达到 8TB。
FAT32 随着 Windows 95 OSR2 发布,尽管需要重新格式化才能使用这种格式并且 DriveSpace 3(Windows 95 OSR2 和 Windows 98 所带版本)从来都不支持这种格式。Windows 98 提供了一个工具用来在不丢失数据的情况下将现有的硬盘从 FAT16 转到 FAT32 格式。在 NT 产品线上对于它的支持从 Windows 2000 开始。
Windows 2000 和 Windows XP 能够读写任何大小的 FAT32 文件系统,但是这些平台上的格式化程序只能创建最大 32GB 的 FAT32 文件系统。Thompson and Thompson(2003)写道“奇怪的是微软公司说这种现象是故意设计的” 微软公司知识库文章 184006 的确是这么说的,但是没有提出任何关于这个限制的合理解释。Peter Norton 的观点是“微软公司在有意地削弱 FAT32 文件系统”。
exFAT
在 Windows Embedded CE 6.0 中引入,Windows XP SP3 以及 Windows Vista SP1 也引入了 exFAT 的支持。在很多方面 exFAT 有了相当大的改进,特别适合用于闪存。
第三方支持
其它 IBM PC 的可选操作系统,如 Linux、FreeBSD 和 BeOS 都支持 FAT 格式,并且大部分都在相应的 Windows 版本发布以后很快就支持 VFAT 和 FAT32 格式。早期的 Linux 发布版本还包括称为 UMSDOS 的格式,它是保存在一个独立的称为–linux-.——的带有 Unix 文件属性(如长文件名和访问许可)的 FAT。UMSDOS 在 VFAT 发布以后就不再使用。Linux 内核从 2.5.7 开始就禁止了这项功能。Mac OS X 操作系统在除启动盘之外的其它卷上也支持 FAT 文件系统。
FAT 和其它数据流
FAT 文件系统本身不是为支持 ADS 而设计的,但是一些高度依赖它们的操作系统创造出了不同的方法以在 FAT 驱动器上处理它们。这些方法或者在额外的文件或路径中存储附加的信息(Mac OS),或者给那些磁盘数据结构中以前没有使用的变量赋予新的含义(OS/2 和 Windows NT)。第二种设计,尽管想像起来会更有效率,但是它们不能被不认识这种格式的工具复制或者备份;使用不能识别这种格式的磁盘工具(如碎片整理或 CHKDSK)操控这些磁盘时可能会破坏这些信息。
Mac OS 使用 PC Exchange 存储不同的数据,文件属性和文件名存在一个名为 FINDER.DAT 的隐藏文件中,资源分支(ADS)存在名为 RESSOURCE.FRK 的子目录中,这些数据都存在使用它们的每个目录中。从 PC Exchange 2.1 开始,它们将 Mac OS 的长文件名保存为标准的 FAT 长文件名,并且将超过 31 个字符的 FAT 长文件名转换为唯一的 31 字符能够被 Macintosh 应用程序识别的文件名。
Mac OS X 将元数据(资源分支、不同的 ADS、文件属性)保存在与所有人相同并以“._”开始的名字的隐藏文件中,并且 Finder 将一些文件夹和文件元数据存在名为“.DS Store”的隐藏文件中。
OS/2 高度依赖于扩展属性(EA)并且将它们存在位于 FAT12 或 FAT16 的根目录下名为“EA DATA. SF”的隐藏文件中。这个文件使用以前文件(或者目录)的目录清单中的两个保留字节索引。在 FAT32 格式中,这些字节中存有文件或者目录开始簇号的高 16 位,这样就使它难于在 FAT32 上保存 EA。扩展属性可以通过 Workplace Shell 桌面、REXX 脚本、许多系统图形用户接口和命令行工具(如 4OS2)来访问。
Windows NT 支持 HPFS、NTFS 和 FAT 中所有扩展属性的处理(所用处理机制完全类似于 OS/2),但是不能处理其它一些存于 NTFS 驱动器的 ADS 数据。试图从复制带有与 NTFS 驱动器属性不同扩展属性的 ADS 到 FAT 驱动器将报告一个警告信息提示 ADS 将会丢失。
Windows 2000 以后产品的处理类似于 Windows NT 但复制到 FAT32 时它们没有显示任何警告信息直接丢弃扩展属性(但报告其他像“Macintosh Finder Info”和“Macintosh Resource Fork”这些 ADS 引起的警告)。
前景
微软公司最近获得了 VFAT 和 FAT32 的专利(但没有得到最初的 FAT 的专利),这引起了人们对于微软将会对 Linux OS 发布和初始化他们产品的媒体厂商收取专利费的担忧(参见下面的 FAT 授权协议)。尽管最初的裁定不利于微软公司,但是微软仍然获取了胜利并且得到了专利授权。
由于微软公司已经宣布不再开发基于 MS-DOS 作业系统 Windows Me 的后续版本,所以不再有可能会有新版的 FAT。对于大多数用途来说,为 Windows NT 系列开发的 NTFS 文件系统从效率、性能、安全性及可靠性来说都优于 FAT;它的主要缺点是小容量文件所占的额外空间以及除了基于 NT 的 Windows 操作系统之外的很少有其他操作系统支持。由于确切的规范是微软公司的商业秘密,这就使得使用一个 DOS 软盘用于恢复目的很困难(根据微软 MCSE 训练教材说明此点是刻意保密,以确保 NTFS 文件系统不易被盗取资料)。微软公司提供了一个恢复界面来解决这个问题,由于安全的原因它严重限制了缺省情况下它所能解决的问题。
FAT 仍然是移动媒体所常用的一种文件系统(CD 和 DVD 是例外),软碟使用的是 FAT12,其他多数活动媒体用的是 FAT32(如用于数位相机的快闪存储卡和 USBU 盘,Windows 格式化的默认选项仍为 FAT32),除非其容量超出 FAT32 的限制。出于兼容性和存储空间利用率的考虑 FAT 仍然用在这些驱动器上,同时也是由于这些活动媒体上的文件的许可更容易遇到麻烦而不是更重要这样一个事实。
Windows 2000 和 XP 支持的 FAT32 格式化的限制是 32GB,这导致使用现代硬盘的用户必须要么使用 NTFS 要么使用其它程序格式化驱动器。一个解决的办法是使用从 Linux 移植到 Windows 平台的一个工具 mkdosfs。
文章来自互联网,只做分享使用。发布者:鄂东轮机长,转载请注明出处:https://www.baoxiaoke.com/article/215748.html