第 3 章
磁盘和操作系统的逻辑方法
硬盘无法自行控制其硬件,需要两个主要程序来执行其操作:BIOS(基本输入/输出系统)和 DOS(或操作系统)。磁盘的操作系统并不直接与计算机的硬件和硬盘交互,但它确实需要它们之间的 BIOS。这就是为什么 BIOS 在计算机中扮演着重要的角色。
BIOS
BIOS的主要任务是为计算机所连接的硬件或设备与DOS之间提供标准的接口。系统 BIOS 是系统硬件和在其上运行的软件之间的最低级别接口。它在管理硬盘访问方面发挥着几项重要作用,例如
- BIOS 中断例程
- 检测并配置您的硬盘
- 支持硬盘接口方式
为了实现不同硬件和软件产品之间的互操作性,系统的 BIOS 根据硬件的需求进行定制,并为软件访问硬件提供了标准方式。它们被称为 BIOS 服务,被许多操作系统和应用程序使用。它们为硬盘提供单一接口,因此应用程序不需要知道如何单独与每种类型的硬盘通信。
标准 IDE/ATA 硬盘驱动器在 BIOS 中使用各种 BIOS 设置在 BIOS 中进行配置。现代 BIOS 程序可以检测现代 IDE/ATA 驱动器、确定这些设置并自动配置它们。 BIOS 通过与主板上的系统芯片组和系统 I/O 总线协作来控制硬盘可使用哪些类型的接口模式。
INT 13H 接口和 INT 13H 扩展
BIOS 的主要接口是软件中断 13H,通常称为 INT 13H,其中 INT 代表中断,13H 是十六进制中的数字 19。
我们将在本书的编程阶段详细研究和讨论中断在编程中的使用。 Int13H 接口支持多种不同的命令,这些命令可以发送给 BIOS,然后 BIOS 将这些命令传递给硬盘。中断13H包含我们需要对磁盘执行的大多数任务,例如读取、写入、格式化等。
使用和操作 Int13H 需要调用程序知道硬盘的具体参数,并为例程提供精确的磁头、柱面和扇区寻址以访问磁盘。
BIOS 使用 BIOS 设置程序中配置的硬盘几何形状。 Int13H 接口分配 24 位来指定磁盘几何形状,分解如下:
- 10 位表示气缸号,总共 1024 个气缸。
- 8 位表示磁头编号,总共 256 个磁头。
- 6 位表示扇区号,总共 63 个扇区。
因此,磁盘上的最大可能扇区数可以是
= 1024 * 256 * 63
= 16515072
我们在这里看到的,INT 13H 接口可以支持包含最多 16515072 个扇区的驱动器,每个扇区 512 字节。因此,最大磁盘大小可以是,
= 16515072 * 512
= 8455716864 字节
~ 8,456 GB
因此,INT 13H 接口可以支持大约 8.456 GB(或 7.875 GiB)的磁盘大小。
如今,大多数计算机用户使用的硬盘容量都远大于 8 GB,因此 INT 13H 接口在现代计算机系统中终于失去了其用途,并被一种称为 INT 13H 扩展的新接口所取代。但是,INT 13H 可能仍被 DOS 和一些其他较旧的操作系统使用,或用于其他兼容性目的。
Int 13H 扩展
有趣的是,在设计 INT 13H 接口时,没有人会想到硬盘上会有 8GB 的存储空间。然而,今天我们能感觉到8GB硬盘的容量明显小了很多,即使对于家用个人电脑来说也是如此。
旧标准有一个重要的限制:它使用 24 位寻址信息,因此只能处理包含最多 16,515,072 个扇区(每个扇区 512 字节)的驱动器,最大容量为 8.456 GB(或 7.875 GiB)。
因此,问题在于将访问路径从 24 位扩展到更大的范围,但无法扩展现有的 INT13H BIOS 接口,因为如果我们尝试这样做,许多旧硬件和软件将停止工作。实际上,如果许多旧硬件和软件无法配合您的开发工作,那么您在计算机世界中就不可能获得令人尊敬的地位。
因此开发了一种新接口来替代 Int13H。这些例程称为 Int13H 扩展。这种新接口使用 64 位而不是 24 位进行寻址,允许的最大硬盘大小为 9.4 * 10 21 字节,即 9.4 万亿 GB。
我们将在本书的编程部分学习 INT 13H 和 INT 13H 扩展的用法。早期还存在许多其他大小限制。下面描述了一些常见的逻辑和物理限制:
2.1 GB 的限制
在一些较旧的 BIOS 中观察到了此大小限制,这些 BIOS 仅为 CMOS RAM 中的字段分配 12 位,该字段提供磁柱数。因此,此数字最多为 111111111111B(最大可能的 12 位二进制数),相当于 4095。这样,可以访问的具有 16 个磁头的最大磁盘大小将是:
= 4095 * 16 * 63 * 512 字节
= 2113413120 字节可供访问。
33.8 GB 的限制
1999 年初人们注意到了硬盘大小障碍。大型硬盘报告有 16 个磁头、63 个扇区/磁道和 16383 个柱面。许多 BIOS 通过将总容量除以 16*63 来计算实际的柱面数。
对于大于 33.8 GB 的磁盘,这会导致磁柱数大于 65535。在这种特殊情况下,某些版本的 Award BIOS 无法处理磁柱数超过 65,535 的驱动器。现在 BIOS 崩溃或挂起。由于硬盘参数通常使用 16 个磁头和 63 个扇区,因此在发生问题之前,容量约为 33.8 GB 或 31.5 GiB。
解决方案是升级 BIOS 或者使用跳线使磁盘看起来更小。
IDE 磁盘的 ATA 规范 - 137 GB 限制
旧版 ATA 规范不允许访问大于 137 GB 的磁盘。实际上,它仅使用 28 位来指定扇区号。但是,ATA-6 定义了具有 48 位扇区号的扩展。
磁盘大小的限制是由最多 65536 个柱面(从 0 到 65535 计数)、16 个磁头(从 0 到 15 计数)和每个磁道 255 个扇区(从 1 到 255 计数)的组合产生的,这是磁盘的最大总容量,
= 65535 * 16 * 255 个扇区
= 267386880 个部门
= 136902082560 字节(每个扇区 512 字节)
~ 137 GB
双磁盘和四磁盘 BIOS IDE 支持
如今,大多数现代 BIOS 程序都支持硬盘自动检测,这使 BIOS 能够查询每个硬盘以确定其逻辑几何形状、支持的传输模式和其他信息。这可以在设置时完成,也可以在每次启动机器时动态完成,具体取决于 BIOS。
系统 BIOS 为 IDE/ATA 硬盘提供本机支持,因此可以设置许多参数来告诉 BIOS 系统中有哪些硬盘以及如何控制它们。系统中的每个硬盘都有自己的设置,因此主硬盘有一组设置,主从硬盘有一组设置,依此类推。但是,SCSI 硬盘是通过其主机适配器和内置 SCSI BIOS 进行配置的。
由于无法使用传统 IDE/ATA BIOS 几何参数来描述超过 8 GB 的硬盘驱动器,因此动态自动检测是设置现代驱动器的标准方式,特别是在较旧的计算机系统的情况下,但用户仍可以手动设置一些驱动器参数。
以下是 BIOS 设置程序中用于配置 IDE/ATA 硬盘的常见设置。尽管在现代系统中,一些最古老的兼容性设置可能不再存在:
- 磁盘类型:它最初用于允许用户从预定义列表中选择硬盘,但现在用于控制驱动器的自动或手动参数设置。
- 大小:硬盘驱动器的大小(以十进制兆字节为单位)。它是根据其他参数(如磁柱、磁头和磁扇区等)计算得出的。
- 柱面数:磁盘上的逻辑柱面数。磁头数:磁盘上的逻辑磁头数。
- 扇区:磁盘上每个逻辑磁道上的逻辑扇区数,每个扇区 512 字节。通常现代硬盘驱动器的单个磁道上有 63 个扇区。
- 写入预补偿:这是一个兼容性设置,指定对于非常旧的驱动器应在哪个柱面号进行写入调整。
- 停泊区(停泊磁头):停泊区是 BIOS 停泊磁头的圆柱体,当驱动器关闭时,磁头会在该圆柱体上停泊,以避免数据丢失或产生坏扇区。由于现代硬盘驱动器会自动停泊磁头,因此现在很少需要这样做。
- 转换模式:用于支持 504 MB 以上硬盘的 BIOS 转换模式。
- 块模式:控制 BIOS 以块形式执行磁盘传输的能力。
- 程序控制 I/O (DMA) 模式:用于执行与硬盘之间的传输的程序控制 I/O 模式或 DMA 模式。
- 32 位传输模式:控制使用更高性能的 32 位数据传输。
文件系统的限制
每个文件系统支持最大卷大小、文件大小以及每个卷的文件数量。
现在举例来说,通常 FAT16 和 FAT32 卷分别限制为 4 GB 和 32 GB(通常)。您必须了解与 FAT 文件系统相关的一些限制,如下所示:
- FAT12:小于 16 MB 的 FAT 卷被格式化为 FAT12。它是最古老的 FAT 类型,使用 12 位二进制来保存簇号。使用 FAT12 格式化的卷最多可以保存 4,086 个簇,等于 2 12 减去 FAT 中使用的几个保留值。(我们将在本章接下来给出的磁盘逻辑结构中详细讨论它)。因此,FAT12 最适合较小的卷。它用于小于约 16 MB 的软盘和硬盘分区。
- FAT16: FAT16 使用 16 位二进制数来保存簇号。使用 FAT16 的卷最多可以保存 65,526 个簇,这等于 2 16 减去 FAT 中要使用的几个保留值。(我们将在本章后面给出的磁盘逻辑结构中详细讨论它)。FAT16 用于大小从 16 MB 到 2,048 MB 的硬盘卷。运行 MS-DOS、Windows 95/98/ME 和许多其他操作系统的计算机无法访问大于 2 GB 的 FAT16 卷。出现此限制的原因是这些操作系统不支持大于 32 KB 的簇大小,从而导致 2 GB 的限制。(请参阅本章后面给出的簇限制)。
- FAT32:理论上,FAT32 卷的最大容量可达 2048 GB(约 2 TB)。Windows 95 的 OEM SR2 版本以及 Windows 98/ME 均支持 FAT32。FAT32 使用 28 位二进制簇号(记住!不是 32,因为 32 位中有 4 位是“保留”的)。因此,理论上 FAT32 可以处理簇数超过 2.68 亿的卷(实际上是 268,435,456 个簇),并且支持最大 2 TB 的驱动器。但是,要做到这一点,FAT 的大小会变得非常大。(我们将在本章的下一个主题中讨论它)。
接下来在表中给出了 FAT 类型的比较。
NTFS:NTFS 代表新技术文件系统。Windows 2000/XP 使用该系统。理论上,NTFS 分区的最大大小为 (2 64 – 1) 个簇。
NTFS 文件系统的详细描述超出了本书的范围,但是下表给出了它的一些限制:
描述
|
限制 |
最大文件大小
|
16 EB – 1 KB (2 64 字节 – 1 KB) |
最大卷大小
|
(2 64 - 1)簇 |
每个卷的文件(和文件夹)
|
4,294,967,295 (2 32 – 1 ) 苍蝇和折纸 |
簇
任何软件可以访问的硬盘上分配的最小空间单位是扇区,包含 512 个字节。可以有一个磁盘分配系统,每个文件分配所需的单个扇区数。例如,一个 1 MB 的文件需要大约 2,048 个单个扇区来存储其数据。
对于 FAT 文件系统,或者更确切地说,对于大多数文件系统,不使用单个扇区。这有几个性能方面的原因。当 DOS 将某些信息写入硬盘时,它不会按扇区分配空间,而是使用称为簇的新存储单元。
FAT 是多年前设计的,是一种简单的文件系统,无法管理单个扇区。FAT 所做的是将扇区分组为更大的块,这些块称为簇或分配单元。
簇是可分配给文件的最小磁盘空间单位。这就是簇通常被称为分配单元的原因。当文件被分成 512 字节的块时,管理磁盘可能非常困难。
一个 20 GB 的磁盘卷使用 512 字节扇区进行单独管理,包含超过 4100 万个独立扇区,跟踪这么多信息非常耗时且耗资源。不过,有些操作系统确实会按扇区为文件分配空间,但它们需要一些高级智能才能正确执行此操作。
簇是 DOS 在磁盘上存储任何信息时分配的最小空间。即使在磁盘上只存储一个字节长的信息,也需要磁盘表面上至少一个簇区域。
如果一个簇可以存储 512 字节的信息,那么要存储 513 字节,则需要两个簇。每个文件必须分配整数个簇。这意味着,如果卷使用包含 4,096 字节的簇,则 610 字节的文件将使用一个簇,因此磁盘上有 4,096 字节,而 4,097 字节的文件使用两个簇,因此磁盘上有 8,192 字节。
这就是簇大小如此重要的原因,它可以确保最大限度地提高磁盘的使用效率。因此我们可以理解簇大小越大,浪费的空间就越多。
下图显示了名为 BINARY.C 的文件的属性,并说明了该文件在磁盘上占用的空间。该文件的实际大小为 610 字节,但由于单个簇为 4,096 字节,因此该文件在磁盘上占用一个簇(4,096 字节)。
一个簇可以由一个或多个扇区组成。这取决于所使用的磁盘类型。由于一个簇可以由多个扇区组成,因此使用簇作为分配单元可以减少 DOS 用于保存已用和空闲磁盘空间信息的文件分配表的大小。
簇大小主要由磁盘卷的大小决定。如果不严格地说,一般来说,较大的卷使用较大的簇大小。对于硬盘卷,每个簇的大小范围从 4 个扇区(2,048 字节)到 64 个扇区(32,768 字节)。
软盘使用的簇要小得多,有时使用的簇大小仅为 1 个扇区。簇中的扇区是连续的,因此每个簇都是磁盘上连续的空间块。
簇大小与分区或卷大小直接相关,对性能和磁盘利用率有重要影响。簇大小是在对磁盘卷进行分区时确定的。
有一些实用程序(例如 Partition Magic)可以在特定条件的限制内改变现有分区的簇大小,但对于一般情况,一旦选择了分区大小和簇大小,它就固定了。
正如我们前面讨论过的,磁柱或磁道号从 0 开始,第一个扇区号始终取为 1,还有一件事您应该记住,那就是第一个簇号始终取为 2。
簇大小
簇仅用于为数据区域分配存储区域。FAT 和目录区域不根据簇大小进行分配。在使用 512 字节扇区的磁盘上,512 字节簇包含一个扇区,而 4 KB 簇包含 8 个扇区。
下表列出了 DOS 针对各种磁盘格式使用的默认簇大小。但是在某些情况下簇的大小可能与默认大小不同:
软盘驱动器 (FDD) |
驱动器类型 |
部门/集群 |
总簇大小(以字节为单位)(每个扇区 512 字节) |
5.25” 360Kb FDD |
2 个部门 |
1,024 |
5.25”1.2Mb FDD |
1 个扇区 |
512 |
3.5” 720Kb FDD |
2 个部门 |
1,024 |
3.5”1.44Mb FDD |
1 个扇区 |
512 |
3.5”2.88MB 软驱 |
2 个部门 |
1,024 |
FAT16、FAT32 和 NTFS 各自使用不同的簇大小,具体取决于分区的大小,并且每个文件系统都有其可以支持的最大簇数。簇大小越小,磁盘存储信息的效率就越高,因为簇内未使用的空间不能被其他文件使用。
下表显示了 FAT16、FAT32 和 NTFS 文件系统分区的默认簇大小。FAT 32 允许更有效地存储和使用更大的硬盘,32 位 FAT 仅与 Windows 95 OSR-2 和 Windows 98/ME 兼容。MS-DOS、Windows 3.1、Windows 95 和 Windows NT 支持 FAT 16。操作系统 Windows 2000/XP 使用 NTFS 文件系统。
注意:这里 1 KiB 表示 1 二进制千字节,这意味着 1 KiB 等于 1024 字节,或者我们可以说 2 个 512 字节扇区等于 1KiB。
随着 FAT16 分区大小的增加,磁盘空间的浪费也随之增加。使用 FAT32 可以减少簇大小,从而提供高效的存储。虽然 FAT32 确实允许使用更大的硬盘并大大减少簇大小,但使用 FAT32 时有一个重要的性能考虑因素,即数十 GB 的巨型硬盘使得 FAT32 成为新系统的必备选择。我们可以说,您通常不再需要在 FAT16 和 FAT32 之间做出实际选择。
假设有一个 2,048 MB 的分区,这是 FAT16 可以支持的最大分区。如果此分区在 FAT16 下设置,则文件分配表将包含 65,526 个簇,每个簇占用 32 KiB 的磁盘空间。
较大的簇大小确实会造成大量磁盘空间浪费。因此建议在此分区上使用 FAT32,这将导致簇大小从 32 KiB 减少到 4 KiB。
事实上,这将大大减少磁盘上的闲置空间,最多可减少 30%,并可能释放数百兆以前浪费的磁盘空间。在这种情况下,这通常是正确的做法。然而,它也有另一面。我们不会免费获得这种减少的集群大小。
由于每个簇较小,因此必须有更多的簇才能覆盖相同大小的磁盘。因此,我们现在将有 524,208 个簇,而不是 65,526 个簇。
此外,FAT32 中的 FAT 条目为 32 位宽(每个条目为 4 个字节),而 FAT16 的条目为 16 位(每个条目为 2 个字节)。最终结果是 FAT32 的 FAT 大小是 FAT16 的 16 倍。下表总结了以下内容:
适用于 2,048 MB 磁盘卷的 FAT 16 和 FAT 32 |
脂肪类型 |
FAT16 |
FAT32 |
簇大小 |
32 千字节 |
4 千字节 |
FAT 条目数 |
65,526 |
524,208 |
FAT 的大小 |
131052 字节
(~ 128 KiB) |
2096832 字节
(~ 2 MiB) |
如果我们将 FAT32 卷的大小从 2 GB 增加到 8 GB,FAT 的大小将从大约 2 MiB 增加到 8 MiB。这的重要性不在于 FAT32 卷将不得不浪费磁盘上的几兆字节空间来保存 FAT。因为只有这样做,才能比通过减小 FAT 的大小节省更多的空间。真正的问题是 FAT 保存了卷中每个文件的所有簇指针。FAT 的大小大幅增加会对系统速度产生负面影响。
因此,将文件分配表的大小限制为合理的数字非常重要。事实上,在大多数情况下,这是一个在簇大小和 FAT 大小之间找到平衡的问题。FAT32 本身所做的簇大小选择就是一个很好的例子。
由于 FAT32 可以处理大约 2.68 亿个最大簇,因此 4 KiB 簇大小在概念上能够支持 1 TiB(1,024 GiB)大小的磁盘卷,但这样做的问题是,按照每个条目 2.68 亿乘以 4 字节,FAT 大小将超过 1 GB。
因此,FAT32 仅对最大 8 GiB 的卷使用 4 KiB 簇,然后使用更大的簇,如前面给出的簇大小表所示。FAT32 支持的最大分区大小(官方声明)为 2,048 GiB(2 TiB)。
硬盘的逻辑结构
基本上,我们可以用以下五个逻辑术语来划分硬盘的逻辑结构:
- MBR(主引导记录)
- DBR(DOS 引导记录)
- FAT(文件分配表)
- 根目录
- 数据区
下图表示了形成硬盘逻辑结构的这些逻辑术语的概念排列:
硬盘的逻辑结构
主引导记录 (MBR) 或有时称为主分区表 (MPT),包含一个小程序,用于从硬盘驱动器加载和启动活动(或可引导)分区。主引导记录包含有关硬盘驱动器上所有四个主分区的信息,例如起始扇区、结束扇区、分区大小等。
MBR 位于绝对扇区 0,或者说位于柱面 0、磁头 0 和扇区 1,并且如果磁盘中存在多个分区,则存在扩展主引导记录,其位于每个扩展分区卷的开头(参见下图)。
通过执行 DOS 的 FDISK.EXE 命令,可以在硬盘驱动器上创建 MBR。但是,还有许多其他软件可以执行相同的任务。使用 FDISK,可以将这些分区中的任何一个变为活动分区或可引导分区。
这允许活动分区的引导扇区在系统启动时接收控制。由于软盘上没有分区,因此软盘上没有 MBR。
由于 DOS 使用单个大写字母来命名分区,因此 DOS 允许的所有类型的分区的最大数量加起来为 24 个,从驱动器号 C(C:)开始到驱动器号 Z(Z:)。因此,即使存在多个物理硬盘驱动器,所有驱动器的分区总数也不能超过 24 个。
开机自检 (POST) 后,BIOS 将硬盘上的 MBR(主引导记录)加载到内存中,然后执行它。首先,MBR 检查硬盘上的活动分区,然后将 DOS 引导记录 (DBR) 加载到内存中,并将控制权移交给操作系统引导代码,然后操作系统引导记录代码将操作系统的其余部分加载到内存中。
主引导记录格式
主引导记录格式
我们可以将硬盘驱动器划分为多个逻辑驱动器,这些逻辑驱动器通常由 DOS 分配各自的驱动器号。一次只能将一个分区标记为活动(或可启动)分区。
主引导记录格式
主引导记录在主分区表中最多只能有 4 个条目。但是,可以通过包含扩展分区表的主引导记录来获取扩展主引导记录的位置,扩展分区表的格式与主分区表完全相同,只是没有引导代码。
在扩展主引导记录中,这 446 字节的空间通常为引导代码保留,并保持空白。主引导记录的所有 512 字节均已损坏,如下表所示:
抵消 |
描述 |
尺寸 |
000 小时 |
初始程序加载器 (IPL),可执行代码(提供计算机的首次启动) |
446 字节 |
1BEH |
第一个分区条目(参见下表) |
16 字节 |
1CEH |
第二个分区条目 |
16 字节 |
1DEH |
第三个分区条目 |
16 字节 |
1EEH |
第四个分区条目 |
16 字节 |
1FEH |
可执行标记或可引导扇区签名或魔数 (AAH 55H) |
2 个字节 |
总计 = 512 字节 |
所有扩展分区都应位于扩展分区条目所保留的空间内。只有两个扩展分区可供使用,第一个用作普通分区,第二个用作另一个扩展分区(如果存在)。因此,借助一个主分区表,我们可以获得其旁边的另一个扩展主分区表(如果存在)的位置。
分区表条目格式
下表给出了 MBR 中任何分区的分区表条目格式。任何 MBR 的每个分区条目都可以分解为以下字节及其特定含义:
引导类型指示字节(1 个字节):如果此字节为 00H,则表示分区不活动;如果此字节为 80H,则表示分区为活动分区或可引导分区。虽然不希望出现任何其他字节,但如果出现任何其他字节,则可能是由于分区表损坏或分区表受到病毒攻击。
分区的起始柱面 - 磁头 - 扇区号(3 个字节):当我们计算任何磁盘的 CHS(柱面、磁头和扇区)时,物理 CHS 计算如下:
- 物理扇区从 1 开始计算。
- 物理磁头从0开始计数。
- 物理柱面从0开始计算(详见上一章)
- 偏移量 01H 处的字节表示该分区的十六进制系统中的起始磁头号。
偏移量 02H 处的字节的 6 个最低有效位构成分区的起始扇区号,剩余 2 位(作为两个最高有效位)加上偏移量 03H 处的另一个字节的 8 位(10 位数的其余 8 个最低有效位)构成分区的起始柱面号。
抵消 |
意义 |
尺寸 |
描述 |
00小时 |
启动类型指示字节 |
1 字节 |
如果字节为00H,则该分区处于非活动状态;如果字节为80H,则该分区处于活动状态(或可启动) |
01小时 |
分区起始的磁头编号 |
1 字节 |
分区的起始头编号(十六进制) |
02小时 |
分区起始的扇区和柱面号 |
2 个字节 |
第一个字节的 6 位构成起始扇区号,其余 2 位(作为两个最高有效位)加上另一个字节的 8 位(10 位数的其余 8 个最低有效位)构成分区的起始柱面号 |
04 小时 |
文件系统指示字节 |
1 字节 |
十六进制文件系统指示字节(请参阅下表了解指示符) |
05小时 |
分区末尾的头号 |
1 字节 |
分区结束头编号(十六进制) |
06小时 |
分区末尾的扇区和柱面号 |
2 个字节 |
第一个字节的 6 位构成结束扇区号,其余 2 位(作为两个最高有效位)加上另一个字节的 8 位(10 位数的其余 8 个最低有效位)构成分区的结束磁柱号 |
08小时 |
分区起始的相对扇区号 |
4 字节 |
MBR 和分区中第一个扇区之间的扇区数 |
0通道 |
分区的扇区数 |
4 字节 |
分区中的扇区数 |
总计 = 16 字节 |
接下来执行的示例分区表研究示例中给出了圆柱和扇区编码。
文件系统指示字节(1 个字节):偏移量 04H 处的文件系统指示字节代表该分区的文件系统。本章接下来给出了列出各种文件系统的文件系统指示字节的表格。
分区的结束磁柱 - 磁头 - 扇区号(3 个字节):编码与分区的起始磁柱 - 磁头 - 扇区号相同。
分区起始的相对扇区号(4 个字节):十六进制系统中 MBR 和分区中第一个扇区之间的扇区数。
分区的扇区数(4个字节):以十六进制表示的分区中的扇区数。
应始终记住,柱面、磁头和扇区号应传递给 BIOS。因此,如果 BIOS 使用转换(LBA 模式或 INT 13H 扩展支持),这些值可能不代表物理 CHS 值。对于大型硬盘(大于 8.4 GB),CHS 值可能无效。通常应忽略这些值,而使用绝对扇区值。
下图显示了具有 FAT32 分区的磁盘的 MBR。图末的 64 字节高亮区域表示 MBR 的主分区表。
起始和结束 CHS 的编码如下:
- 在偏移量 00H 处,80(十六进制)表示该分区是活动分区。
- 在偏移量 01H 处,01(十六进制)代表起始头号 = 1。
- 偏移量 02H 和 03H 处的两个字节的组合按照接下来给出的编码形成分区的起始扇区和柱面号:
具有 FAT32 分区的磁盘的 MBR
因此分区的起始 CHS= 0-0-1。
类似地,分区结束的磁头号为 FE(十六进制),即 254,下表给出了分区结束磁柱和扇区号的编码:
因此分区的结束 CHS = 701-254-63。
偏移量 04H 处的字节 0B(十六进制)是分区的文件系统指示字节。字节 0B(H)表示分区具有 FAT32 文件系统。下表列出了各种文件系统及其文件系统指示字节:
文件系统指示字节(十六进制) |
分区/文件系统描述 |
00小时 |
未使用/空的分区表条目
(请记住,这不是用于指定磁盘上未使用的区域,而是标记未使用的分区表条目) |
01小时 |
DOS 12 位 fat
(类型01H适用于最大 15 MB 的分区) |
02小时 |
XENIX:根文件系统 |
03小时 |
XENIX /usr 文件系统(已过时)
(XENIX 是 Unix V7 的一个旧部分。微软 XENIX 操作系统于 1980 年 8 月发布。它是适用于 Intel 8086、Zilog Z8000、Motorola M68000 和 Digital Equipment PDP-11 的 Unix 操作系统的可移植商业版本。微软于 1983 年 4 月推出了 XENIX 3.0。SCO 于 1983 年为 8088/8086 推出了第一款 XENIX。) |
04 小时 |
16 位 FAT,DOS 3.0+(分区大小 < 32M)
(一些旧的 DOS 版本有一个错误,要求这个分区位于硬盘的第一个物理 32 MB 中) |
05小时 |
DOS 扩展(DOS 3.3+ 扩展卷)
最多支持 8.4 GB 磁盘。使用此类型05H DOS/Windows 将不会使用扩展 BIOS 调用,即使它可用。) |
06小时 |
16 位 FAT、DOS Big、DOS 3.31+(分区大小 >= 32M)
(对于 DOS 和 Windows 95/98,分区最大为 2 GB,每个簇最多有 65536 个簇,最大为 32 KB。Windows NT 可以使用 64 KB 簇创建最大 4 GB 的 FAT16 分区。) |
07H |
OS/2 IFS(可安装文件系统)(HPFS 是此文件系统最著名的例子。对于任何已安装的 IFS,OS/2 仅查看 ID 为 7 的分区,这就是 EXT2 IFS 数据包包含特殊的“Linux 分区过滤器”设备驱动程序以欺骗 OS/2 认为 Linux 分区的 ID 为 07 的原因)。 |
07H |
高级Unix |
07H |
NTFS 文件系统 |
07H |
QNX2.x(1988 年之前)
(对于分区类型 07H 的实际文件系统,应该检查分区引导记录) |
08小时 |
OS/2(仅限 v1.0 至 v1.3) |
08小时 |
AIX 启动分区
[AIX(Advanced Interactive Executive)是 IBM 版本的 Unix] |
08小时 |
分体式驱动 |
08小时 |
跨越多个驱动器的 DELL 分区 |
08小时 |
准将DOS |
08小时 |
QNX 1.x 和 2.x
(“qny” 根据 QNX 分区) |
09H |
AIX 数据分区 |
09H |
Coherent 文件系统
[Coherent 是用于 286-386-486 系统的类 UNIX 操作系统,由 Bob Swartz 领导的 Mark Williams 公司销售。它以其良好的文档而闻名。它于 1980 年推出,并于 1995 年 2 月 1 日停产。最后一个版本是用于 286-386-486 的 V3.2 和仅用于 386-486 的 V4.0(1992 年 5 月,使用保护模式)。它的售价为每份 99 美元,据传已售出 40000 份。Coherent 分区必须是主分区。] |
09H |
QNX 1.x 和 2.x(根据QNX 分区为“qnz” ) |
0aH |
OS/2 启动管理器
(OS/2 是 Microsoft 和 IBM 设计的操作系统,作为 MS-DOS 的后继者) |
0aH |
一致交换分区 |
0aH |
OPUS
(开放并行 Unisys 服务器) |
0bH |
WIN95 OSR2 32 位 FAT
(OSR2 代表 Microsoft 的“OEM Service Release 2”。它适用于最大 2047GB 的分区。Windows 95/98/ME 几乎总是具有相同的文件系统(即 FAT-32),在相同的分区限制内) |
0cH |
LBA 映射的 WIN95 OSR2 32 位 FAT
(它使用L ogical B block A寻址 - 中断 13H 扩展模式,因此我们可以说这是0BH的扩展 INT 13H 等效项。Windows 95/98/ME 几乎总是具有相同的文件系统,即 FAT-32,在相同的分区限制内) |
0eH |
LBA 映射的 WIN95:DOS 16 位 FAT或逻辑块可寻址 VFAT (与06H
相同,但使用 INT 13H 的 LBA 模式) |
0fH |
LBA 映射的 WIN95:扩展分区或逻辑块可寻址 VFAT
(它与05H相同,但使用 INT 13H 的 LBA 模式。Windows 95 使用0EH和0FH作为06H和05H的扩展 INT13H 等效值。Windows NT 不识别四种 Windows 95/98/ME 类型0BH、0CH、0EH和0FH) |
10H |
OPUS
(八进制程序更新系统) |
11H |
隐藏的 DOS 12 位 FAT或OS/2 启动管理器隐藏的 12 位 FAT 分区或从 OS/2 看到的 DOS(当 OS/2 启动管理器启动 DOS 分区时,它将通过更改其 ID 来隐藏除启动分区之外的所有主 DOS 分区,并且01H、04H、06H和07H分别变为11H、14H、16H和17H。 |
12 小时 |
Compaq 配置/诊断分区
(Compaq 将其用作配置实用程序分区。它是一个 FAT 兼容分区,可启动到其实用程序,并且可以像 MS-DOS 一样添加到 LILO 菜单中。) |
14 小时 |
(隐藏 DOS 16 位 FAT或OS/2 启动管理器隐藏 DOS 16 位 FAT)<32M 分区
(分区大小小于 32M。ID 14H 是使用 Novell DOS 7.0 FDISK 删除 Linux Native 分区的结果。) |
15 小时 |
隐藏的 DOS 扩展 |
16 小时 |
(隐藏的 DOS 16 位 FAT或OS/2 启动管理器 隐藏的 16 位 FAT) >=32M 分区 |
17H |
OS/2 启动管理器隐藏 HPFS 分区或隐藏 IFS(例如 HPFS) |
17H |
隐藏的 NTFS 分区 |
18H |
AST SmartSleep 分区或AST 特殊 Windows 交换文件(“零伏挂起”分区)
[AST Research, Inc.(以创始人 Albert Wong、Safi Qureshey 和 Thomas Yuen 的首字母命名)。Ascentia 笔记本电脑有一个“零伏挂起分区”或“SmartSleep 分区”,大小为 2MB+内存大小。] |
文件系统指示字节(十六进制) |
分区/文件系统描述 |
19H |
Willowtech Photon COS
(代码 19H 由 Willow Schlanger 为 Willowtech Photon COS 声明。 |
1bH |
隐藏的 WIN95 OSR2 32 位 FAT或隐藏的 Windows 95 FAT32 分区 |
1cH |
LBA 映射 隐藏 WIN95 OSR2 32 位 FAT
(它是使用 INT 13H 扩展的 LBA 模式的隐藏 Windows95 FAT32 分区) |
1eH |
LBA 映射隐藏 WIN95 16 位 FAT或隐藏 LBA VFAT 分区 |
1前锋 |
LBA 映射隐藏 WIN95 扩展或隐藏扩展 LBA VFAT 分区 |
20H |
OFSI
(Willowsoft Overture 文件系统) |
21H |
正式列为保留
(HP Volume Expansion、SpeedStor 变体。) |
21H |
FSO2
(Dave Poirier 为FSO2(氧气文件系统)所声明) |
22 小时 |
FSO2 扩展分区
(Dave Poirier 声称拥有 Oxygen 扩展分区) |
23H |
正式列为保留 |
24小时 |
NEC DOS 3.x |
26小时 |
正式列为保留 |
31H |
正式列为保留 |
32H |
NOS (网络操作系统)
( 32H被操作系统 NOS 使用,由位于澳大利亚墨尔本的 Alien Internet Services 开发。之所以选择 32H 这个 ID,不仅是因为它是少数几个可用 ID 之一,而且 32k 也是该操作系统最初针对的 EEPROM 的大小。 |
33H |
正式列为保留 |
34 小时 |
正式列为保留 |
35H |
OS/2 或 eCS 上的 JFS
[ OS/2 Warp Server for e-Business、OS/2 Convenience Pack(又名 4.5 版)和 eComStation(eCS,OS/2 Convenience Pack 的 OEM 版本)使用35H作为 OS/2 实现的 JFS(IBM AIX 日志文件系统)] |
36H |
正式列为保留 |
38H |
THEOS v3.2(2GB 分区) |
39H |
Plan 9 分区
(Plan 9是贝尔实验室为多种架构开发的一种操作系统。最初,Plan 9使用磁盘末尾的未分配部分。Plan 9 第 3 版使用39H类型的分区,该分区细分为分区第二扇区中Plan 9分区表中描述的子分区。) |
39H |
THEOS v4 跨区分区 |
3aH |
THEOS v4(4GB 分区) |
3bH |
THEOS v4 扩展分区
(THEOS是 Timothy Williams 于 1983 年创立的个人电脑多用户多任务操作系统。) |
3cH |
PartitionMagic 恢复分区
(当PowerQuest产品(如Partition Magic或Drive Image))对磁盘进行更改时,它首先将类型标志更改为 3CH,以便操作系统不会尝试修改它。在过程结束时,它会改回最初的状态。因此,只有在过程以某种方式中断(如关机、用户重新启动等)时,您才能看到 3CH 类型标志。如果您使用分区表编辑器或任何磁盘编辑程序手动将其改回,那么大多数情况下一切都会正常。) |
3dH |
隐藏的 NetWare |
40H |
Venix 80286
(这是一款非常古老的类 Unix 个人电脑操作系统。) |
41H |
Linux/MINIX(与 DR-DOS 共享磁盘)
(DR-DOS 代表数字研究磁盘操作系统。) |
41H |
个人 RISC 启动 |
41H |
PPC PReP(Power PC 参考平台)启动 分区 |
42H |
Linux 交换(与 DR-DOS 共享磁盘) |
42H |
SFS(安全文件系统)
(SFS是 Peter Gutmann 编写的 386+ PC 上 DOS 的加密文件系统驱动程序。) |
文件系统指示字节(十六进制) |
分区/文件系统描述 |
42H |
Windows 2000 动态扩展分区标记 (如果传统分区表中存在类型为42H 的分区
表条目,则 Windows 2000 将忽略传统分区表并使用专有分区表和专有分区方案(LDM 或 DDM)。纯动态磁盘(不包含任何硬链接分区的磁盘)只有一个分区表条目,类型为42H,用于定义整个磁盘。动态磁盘将其卷配置存储在位于每个动态磁盘末尾 1 MB 私有区域中的数据库中。) |
43H |
Linux 本机(与 DR-DOS 共享磁盘) |
44小时 |
GoBack 分区
(GoBack是一个记录对磁盘所做更改的实用程序,允许您查看或返回到某个早期状态。它像磁盘管理器一样接管磁盘 I/O,并将其日志存储在自己的分区中。) |
45H |
Boot-US 启动管理器
(Boot-US(Ulrich Straub)启动管理器可以安装到 MBR、单独的主分区或软盘。当安装到主分区时,此分区的 ID 为45H。此分区不包含文件系统,它仅包含启动管理器并占用单个磁柱(低于 8.4 GB)。) |
45H |
直接地 |
45H |
EUMEL/公告 |
46H |
EUMEL/公告 |
47H |
EUMEL/公告 |
48小时 |
EUMEL/Elan
( EUMEL,后来被称为Ergos L3 ,是 GMD 的 Jochen Liedtke 使用Elan编程语言开发的多用户多任务系统。它在德国学校用于计算机科学教育。) |
4aH |
AdaOS Aquila |
4aH |
适用于 DOS 的ALFS/THIN 轻量级文件系统 |
4cH |
Oberon 分区 |
4dH |
QNX4.x |
4eH |
QNX4.x 第 2 个分区 |
4fH |
QNX4.x 第 3 个分区
(QNX是经过POSIX(Unix 便携式操作系统接口)认证的、微内核的、分布式的、容错的操作系统,适用于 386 及更高版本,包括对嵌入式应用程序中的 386EX 的支持。) |
4fH |
Oberon 启动/数据分区 |
50H |
OnTrack 磁盘管理器(旧版本)、只读分区(磁盘管理器是OnTrack的一个程序,使人们能够在 DOS 下使用大于 504MB 的 IDE 磁盘。1.3.14 之前的 Linux 内核版本不能与 DM 共存。) |
50H |
Lynx RTOS(实时操作系统)
(Lynx RTOS使用户能够在 SCSI 和 IDE 驱动器上放置最多 14 个分区,每个分区大小为 2 GB,总共可提供最多 28 GB 的文件系统空间。) |
50H |
土生土长的奥伯龙 |
51H |
OnTrack 磁盘管理器 (DM6.0 Aux1) ,读/写分区 |
51H |
诺威尔 |
52H |
控制/管理 |
52H |
Microport SysV/AT或Microport System V/386 |
53H |
OnTrack 磁盘管理器 (DM6.0 Aux3),只写分区 |
54H |
OnTrack Disk Manager 6.0 动态驱动器覆盖 |
55H |
EZ-Drive 分区
(EZ-Drive是另一个类似磁盘管理器的程序,由MicroHouse于 1992 年开发。现在由StorageSoft销售。) |
56H |
Golden Bow VFeature 分区卷。
(这也是一个类似实用软件的磁盘管理器。这是一个非标准 DOS 卷。) |
56H |
DM 转换为 EZ-BIOS |
57H |
DrivePro
(DrivePro由MicroHouse于 1992 年开发。现在由StorageSoft销售。) |
57H |
VNDI 分区 |
5cH |
Priam EDisk 分区卷
(Priam EDisk是磁盘管理器类型的实用程序软件。这是一个非标准 DOS 卷。) |
61H |
SpeedStor
(存储维度 SpeedStor分区卷。这是一个非标准 DOS 卷。它是磁盘管理器类型的实用程序软件。) |
63H |
Unix 系统 V/386、386/ix、SCO、ISC Unix、UnixWare、Mach、Mach 上的 MtXinu BSD 4.3、GNU Hurd |
64H |
Novell NetWare 286,2.xx |
文件系统指示字节(十六进制) |
分区/文件系统描述 |
64H |
PC-ARMOUR 保护分区
(64H由 A. Solomon 博士的PC-ARMOUR磁盘保护使用,目的是在输入正确密码之前保持磁盘不可访问,然后在内存顶部加载一个 INT 13H 钩子,显示 CHS = 0-0-2,当请求 0-0-1 时,带有真实分区表的副本)。 |
65H |
Novell NetWare 3.86、3.xx 或 4.xx
( Novell Netware 3.0及更高版本每个驱动器使用一个分区。它在这些分区内分配逻辑卷。这些卷可以分成几个驱动器。使用的文件系统称为Turbo FAT,它与 DOS FAT 文件系统非常相似。Novell Netware曾经是主要的网络操作系统。Netware 68或S-Net (1983) 用于 Motorola 68000,Netware 86用于 Intel 8086 或 8088。Netware 286用于 Intel 80286,有多个版本,后来合并到Netware 2.2。Netware 386是用 C 语言为 Intel 386 重写的,后来更名为Netware 3.x(3.0、3.1、3.10、3.11 和 3.12 等)版本。其后继的Netware 4.xx有 4.00 版本, 4.01、4.02、4.10 和 4.11。然后是 Intranetware) |
66H |
Novell Netware SMS 分区
(SMS代表存储管理服务。现在不使用。) |
67H |
诺威尔 |
68H |
诺威尔 |
69H |
Novell Netware 5+和Novell Netware NSS 分区
(NSS代表 Novell 存储服务。) |
70H |
DiskSecure 多重启动 |
71H |
正式列为预留 |
73H |
正式列为预留 |
74天 |
正式列为预留 |
74天 |
Scramdisk 分区
(Scramdisk是一款磁盘加密软件。它支持容器文件、74H类型的专用分区和隐藏在 WAV 音频文件中的磁盘。) |
75H |
IBM个人计算机 |
76H |
正式列为预留 |
77H |
M2FS/M2CS 分区 |
77H |
QNX 4.x |
78H |
XOSL 文件系统
(XOSL引导加载程序文件系统) |
78H |
QNY 4.x |
79H |
准新币 4.x |
7EH |
使固定 |
7F小时 |
Alt-OS-开发分区标准 |
80H |
旧版 MINIX、MINIX v1.1 至 v1.4a |
81H |
MINIX 1.4b 及更高版本
(MINIX是一个类 Unix 操作系统,由 Andy Tanenbaum 和阿姆斯特丹自由大学的学生于 1989-1991 年左右编写。它可在 PC(8086 及更高版本)、Macintosh、Atari、Amiga、Sparc 上运行。 |
81H |
早期的Linux |
81H |
神达高级磁盘管理器 |
82H |
主要的 |
82H |
Solaris x86
(Solaris创建一个 ID 为82H的单个分区,然后使用分区内的 Sun 磁盘标签进一步拆分它。) |
82H |
Linux 交换分区 |
83H |
Linux 本机分区或Linux 本机文件系统或Linux Ext2fs
(Linux 是 Linus Torvalds 和互联网上的许多其他人自 1991 年以来编写的类 Unix 操作系统。它可在 386 及更高版本的 PC 和各种其他硬件上运行。它根据 GPL(通用公共许可证)分发。各种文件系统类型,如 xiafs、ext2、ext3、reiserfs 等,都使用 ID 83H。) |
84H |
OS/2 隐藏 C:驱动器或OS/2 重新编号类型 04 分区。
(OS/2 重新编号类型 04h 分区与隐藏 DOS C:驱动器相关) |
84H |
休眠分区
(针对各种笔记本电脑型号报告,例如,在使用 MKS2D 实用程序的 Dell Latitudes(带有 Dell BIOS)上使用。) |
85H |
Linux 扩展分区 |
86H |
旧版 Linux RAID 分区超级块 |
86H |
FAT16 卷/条带集(Windows NT)或NTFS 卷集
(它是传统容错 FAT16 卷。) |
87H |
HPFS 容错镜像分区或NTFS 卷集或NTFS 卷/条带集
(传统容错 NTFS 卷。HPFS 容错镜像分区。) |
8aH |
Linux 内核分区
(由 AiR-BOOT 使用) |
文件系统指示字节(十六进制) |
分区/文件系统描述 |
8bH |
旧式容错 FAT32 卷 |
8cH |
使用 BIOS 扩展 INT 13H 的旧式容错 FAT32 卷。 |
8dH |
免费的 FDISK 隐藏主 DOS FAT12 分区
(免费的 FDISK是FreeDOS使用的 FDISK 。它通过添加十进制数140 (8CH)来隐藏类型01H、04H、05H、06H、0BH、0CH、0EH和0FH。) |
8eH |
Linux 逻辑卷管理器分区 |
90H |
免费的 FDISK 隐藏主 DOS FAT16 分区 |
91H |
免费的 FDISK 隐藏 DOS 扩展分区 |
92H |
免费的 FDISK 隐藏主要 DOS 大型 FAT16 分区 |
93H |
隐藏的 Linux 本机分区 |
93H |
阿米巴文件系统 |
94H |
Amoeba 坏块表
(Amoeba 是 Andy Tanenbaum 与 Frans Kaashoek、Sape Mullender、Robert van Renesse 等人自 1981 年起编写的分布式操作系统。它可在 PC(386 及以上)、Sun3、Sparc、68030 上运行。它可免费供大学用于研究和教学目的。) |
95H |
MIT EXOPC 本机分区 |
97H |
免费的 FDISK 隐藏主 DOS FAT32 分区 |
98H |
免费 FDISK 隐藏主 DOS FAT32 分区 (LBA) |
99H |
Mylex EISA SCSI或DCE376 逻辑驱动器( Mylex DCE376 EISA SCSI 适配器
使用它来处理驱动器 1024 个柱面以外的分区。) |
9aH |
免费 FDISK 隐藏主 DOS FAT16 分区 (LBA) |
9bH |
免费 FDISK 隐藏 DOS 扩展分区 (LBA) |
9fH |
BSD/操作系统 |
0H |
Phoenix NoteBIOS 电源管理“保存至磁盘”分区或笔记本电脑休眠分区
(据报道, IBM Thinkpad、Phoenix NoteBIOS、Toshiba等各种笔记本电脑都具有零伏暂停分区、暂停至磁盘分区、保存至磁盘分区、电源管理分区、休眠分区等名称,通常位于磁盘区域的开始或结束。) |
氢键 |
笔记本电脑休眠分区
(用作 NEC 6000H 笔记本电脑上的“保存至磁盘”分区。类型A0H和A1H用于具有Phoenix BIOS 的系统。Phoenix PHDISK实用程序与这些一起使用。) |
氢键 |
HP 卷扩展(SpeedStor 变体) |
氢键 |
正式列为保留 |
氢键 |
正式列为保留 |
a5H |
BSD/386、386BSD、NetBSD、FreeBSD
(386BSD 是一种类 Unix 操作系统,由 Bill Jolitz 于 1991 年左右将 4.3BSD Net/2 移植到 PC 上。) |
α6H |
OpenBSD
(OpenBSD,由 Theo de Raadt 领导,从 NetBSD 中分离出来。它试图强调安全性。) |
a7H |
NEXTSTEP
( NEXTSTEP基于Mach 2.6并具有Mach 3.0的功能。它是一个真正的面向对象的操作系统和用户环境。 |
a8H |
Mac OS-X
(Apple 的 OS-X使用此类型作为其文件系统分区) |
a9H |
网络BSD |
氢键 |
Olivetti Fat 12 1.44MB 服务分区
(包含裸 DOS 6.22 和一个用于交换分区表中类型06H和AAH 的实用程序。) |
抗体 |
Mac OS-X 启动分区
(Apple 的 OS-X(Darwin Intel)使用此类型作为其启动分区。) |
抗体 |
GO! 分区 |
死的 |
ShagOS 文件系统 |
发帖者 |
ShagOS 交换分区 |
乙0H |
BootStar Dummy
(引导管理器 BootStar 管理其自己的分区表,最多有 15 个主分区。它使用 BootStar Dummy 值填充 MBR 中未使用的条目。) |
b1H |
正式列为保留 |
b3H |
正式列为保留 |
b4H |
正式列为保留 |
b6H |
正式列为保留 |
B6H |
Windows NT 镜像集(主),FAT16 文件系统 |
b7H |
BSDI 文件系统(次要交换)、BSDI BSD/386 文件系统 |
B7H |
Windows NT 镜像集(主),NTFS 文件系统 |
文件系统指示字节(十六进制) |
分区/文件系统描述 |
b8H |
BSDI BSD/386 交换分区(二级文件系统)
(BSDI(伯克利软件设计公司)由前 CSRG(UCB 计算机系统研究组)成员创立。他们的基于 Net/2 的操作系统称为 BSD/386。) |
bbH |
启动向导已隐藏 |
出色地 |
Solaris 8 启动分区 |
碳氢化合物 |
DR-DOS/Novell DOS 安全分区 |
碳氢化合物 |
计算机断层扫描系统 |
碳氢化合物 |
REAL/32 安全小分区 |
碳氢化合物 |
NTFT 分区 |
氢 |
DR DOS 6.0 LOGIN.EXE 保护的 12 位 FAT 分区 |
碳 |
为 DR-DOS 7+ 保留 |
碳 |
隐藏的 Linux |
3H |
隐藏的 Linux 交换 |
碳四极杆 |
DR DOS 6.0 LOGIN.EXE 保护的 16 位 FAT 分区 |
氚 |
DRDOS/安全(扩展) |
氚 |
DRDOS/secured(FAT-16,>= 32M)
(DR-DOS 6.0会将C0H添加到 LOGIN.EXE 安全分区的分区类型中,以便用户无法通过从 MS-DOS 软盘启动来逃避密码检查。否则,类型C1H、C4H、C5H、C6H和D1H、D4H、D5H、D6H的用法似乎与1H、4H、5H和6H完全一样。) |
氚 |
损坏的 FAT16 卷/条带集(Windows NT) (对于容错集的已禁用部分,
NTFS 将向分区类型添加C0H 。因此,将获得类型C6H、C7H。) |
気液 |
Windows NT 损坏的 NTFS 卷/条带集 |
気液 |
鸣管靴 |
氚 |
正式列为保留 |
気劑 |
正式列为保留 |
钙 |
正式列为保留 |
肝素 |
为 DR-DOS 安全 FAT32 保留 |
氯乙烯 |
为 DR-DOS 安全 FAT32 (LBA) 保留 |
水解 |
CTOS 内存转储 |
细胞 |
为 DR-DOS 安全 FAT16 (LBA) 保留 |
氢键 |
REAL/32 安全大分区
(REAL/32 是 DR 多用户 DOS 的延续。) |
d1H |
旧的多用户 DOS 安全 FAT12 |
d4H |
旧式多用户 DOS 安全 FAT16 <32M |
d5H |
旧的多用户 DOS 安全扩展分区 |
d6H |
旧的多用户 DOS 安全 FAT16 >=32M |
d8H |
CP/M-86 |
已经 |
非 FS 数据 |
海拔 |
数字研究 CP/M、并发 CP/M、并发 DOS |
海拔 |
CTOS(融合技术操作系统-Unisys) |
海拔 |
KDG Telemetry SCPU 启动
(KDG Telemetry使用 ID DBH来存储要在 DT800 系列的基于 x86 的 SCPU(监控 CPU)模块上运行的代码的保护模式二进制映像。) |
氢键 |
隐藏的 CTOS 内存转储 |
氢化物 |
Dell PowerEdge 服务器实用程序 (FAT) |
氘氘 |
DG/UX 虚拟磁盘管理器分区 |
氘氘 |
BootIt EMBRM
(启动管理器BootIt管理其自己的分区表,最多有 255 个主分区。) |
韋0H |
由ST Microelectronics为名为 ST AVFS 的文件系统保留。 |
1H |
DOS 访问或 SpeedStor 12 位 FAT 扩展分区
(它是位于 1023 以上柱面的 SSTOR 分区。) |
东南欧 |
DOS 只读 |
埃3赫 |
存储尺寸 |
埃4赫 |
SpeedStor 16 位 FAT 扩展分区 < 1024 个柱面 |
5H |
正式列为保留 |
5H |
具有逻辑扇区 FAT 的 Tandy DOS |
6H型 |
正式列为保留 |
乙炔基 |
BeOS BFS (BFS1)
(BeOS是在 Power PC 上运行的操作系统) |
氢化可的松 |
为 Matthias Paul 的 Sprytix 预留 |
嘿 |
表明此旧式 MBR 后面跟着 EFI 标头 |
异戊酸酯 |
包含 EFI 文件系统的分区 |
響鳴 |
Linux/PA-RISC 引导加载程序 |
f1H |
存储尺寸 |
気層 |
DOS 3.3+ 辅助分区 |
気層 |
具有逻辑扇区 FAT 的 Unisys DOS |
f3H |
正式列为保留 |
f4H |
SpeedStor 大分区 |
F4H |
Prologue 单卷分区 |
文件系统指示字节(十六进制) |
分区/文件系统描述 |
f5H |
序言多卷分区
(类型F4H分区包含一个卷,不再使用。类型F5H分区包含 1 到 10 个卷,称为MD0到MD9。它支持一个或多个系统。每个卷都可以有NGF文件系统或TwinFS文件系统作为文件系统。) |
f6H |
正式列为保留 |
F6H |
存储尺寸 SpeedStor |
法赫 |
MandrakeSoft 的Bochs x86 模拟器 |
気圄 |
VMware 文件系统分区 |
気液 |
VMware Swap 分区
(VMware提供可以在其中运行Linux、Windows、FreeBSD 的虚拟机。) |
氢键 |
使用持久超级块自动检测的Linux raid 分区 |
铁氢 |
SpeedStor 超过 1024 个柱面 |
铁氢 |
兰斯特 |
铁氢 |
IBM PS/2 IML(初始微码加载)分区
(位于磁盘末尾。) |
铁氢 |
Windows NT 磁盘管理器隐藏分区
(Windows NT 磁盘管理器将隐藏分区(即存在但不可访问的分区)标记为FEH类型。) |
铁氢 |
Linux 逻辑卷管理器分区(旧) |
韓 |
XENIX坏块表 |
DOS 引导记录 (DBR)/DOS 引导扇区
分区表之后,DOS 引导记录 (DBR) 或有时称为 DOS 引导扇区是硬盘上第二重要的信息。大多数用于光盘恢复的商业应用程序都能够重新生成损坏的引导记录
硬盘上第一个分区的 DOS 引导记录 (DBR) 通常位于绝对扇区 63(磁盘驱动器上的第 64 个扇区)或以 CHS 形式存在,对于大多数驱动器,我们可以说 C–H–S = 0–1–1。
但是,此位置可能因驱动器的 SPT(每磁道扇区数)而异。例如,在旧的 245MB 驱动器上,只有 31 个 SPT,引导记录位于第 32 个扇区(绝对扇区 31)。
DBR 由 DOS 的 FORMAT 命令创建。此程序可以从 DOS 软盘执行(或直接从另一个卷执行,但要遵守一些 OS 限制),以便在使用 FDISK 命令完成分区后创建 DBR。
DBR 所在的扇区将成为 DOS 中该特定分区的逻辑扇区 1。DOS 使用的扇区编号从 DBR 所在的物理扇区开始。
每个 DOS 分区的第一个逻辑扇区将包含一个 DOS 引导记录 (DBR) 或 DOS 引导扇区。DBR 的作用是将操作系统从硬盘驱动器加载到计算机的主内存中,并将系统控制权交给已加载的程序。
为此,DBR 包含一个小程序,该程序由主引导记录 (MBR) 可执行程序执行。所有 DOS 分区都包含用于引导机器(即加载操作系统)的程序代码,但只有该分区由主引导记录控制,在分区表条目中指定为活动分区。
DBR 中的 Boot 程序在分区的根目录中查找两个程序文件 IBMBIO.COM 或 IO.SYS 以及 IBMDOS.COM 或 MSDOS.SYS。IBMBIO.COM 和 IBMDOS.COM 是 PC-DOS 系统或原始 IBM 系统上的两个隐藏系统程序文件。而 IO.SYS 和 MSDOS.SYS 是 IBM 兼容系统附带的 MS-DOS 操作系统上的两个隐藏系统程序文件。
之后,IO.SYS(或 IBMBIO.COM)程序加载 MSDOS.SYS(或 IBMDOS.COM)程序和 COMMAND.COM 程序。整个过程称为计算机的“启动”。如果目录中没有这些系统文件,则此 MBR 程序将显示错误消息,例如:
“无效的系统磁盘或磁盘 I/O 错误,
更换磁盘,然后按任意键……”
屏幕上等待用户将包含上述程序的可启动磁盘放入软盘驱动器并按下一个键。
由于软盘上没有分区,因此其绝对扇区 0 上没有 MBR 或主分区表,而是在其第一个扇区上包含 DBR。
下表给出了使用 FAT12 文件系统格式化后的 3½ 英寸、1.44 MB 软盘布局的简单图。它显示了引导记录、FAT 的两个副本、根目录和数据区开头的位置:
3½ 英寸、1.44 MB 软盘的逻辑图,使用 FAT12 文件系统格式化,每磁道有 18 个扇区,80 个磁道,2 面,每个扇区 512 字节(每簇使用 1 个扇区)。 |
绝对扇区 |
内容 |
0 |
引导记录 |
1 – 9 |
脂肪1 |
10 – 18 |
脂肪2 |
19 – 32 |
根目录 |
33 – 2879 |
数据区 |
您还可以在数据区中创建子目录,其中似乎包含文件。事实上,子目录只不过是一个特殊文件,其中列出了似乎包含在此目录中的所有文件以及有关每个文件的所有相关数据,例如每个文件的起始簇的位置、日期、时间和文件大小等。
DBR 还包含一些有关磁盘几何结构的重要信息。此信息位于每个分区的第一个扇区中,例如:
- 跳转代码 + NOP
- OEM 名称和版本
- 每扇区字节数
- 每簇扇区数
- 保留扇区
- FAT 副本数
- 最大根目录条目数(但不适用于 FAT32)
- 分区中的扇区数小于 32MB(因此不适用于 FAT32)
- 媒体描述符(硬盘为 F8h)
- 每个 FAT 的扇区数(在较旧的 FAT 系统中,不适用于 FAT32)
- 每磁道扇区数
- 磁头数量
- 分区中隐藏扇区的数量
- 分区中的扇区数
- 每个 FAT 的扇区数
- FAT 信息描述符标志
- FAT32 驱动器版本
- 根目录起始簇号
- 文件系统信息扇区的扇区号
- 备份引导扇区的扇区号
- 预订的
- 分区的逻辑驱动器号
- 扩展签名(29H)
- 分区序列号
- 分区的卷名
- FAT 名称
- 可执行代码
- 可执行标记或幻数 (AAH 55H)
DBR 的前 3 个字节包含一个 JMP 指令,用于跳过信息并使扩展成为可能,因为 MBR 会将此扇区加载到内存中并将执行权移交给它。通常这三个字节是十六进制数,格式类似于E9 XX XX(十六进制)或EB XX 90(十六进制)。
初始 JMP 指令 OEM ID 之后是 8 位字段,由 Microsoft 保留用于 OEM 标识。OEM ID 描述创建引导记录的程序。对于 Windows 95/98/ME,这通常是“MSWIN4.0” ,对于 OS/2,这通常是“IBM 20.0” ,对于 MS-DOS 4.0 及更高版本,这通常是“MSDOS5.0” 。
引导扇区的第三个主要组成部分是 BIOS 参数块 (BPB)。磁盘参数块是 DOS 非常重要的数据区域。它帮助 DOS 查找:
- 每扇区字节数
- 每簇扇区数
- 保留扇区
- FAT 数量
- 根目录条目数
FAT32 DOS 引导记录格式 |
抵消 |
描述 |
尺寸 |
00小时 |
跳转代码 + NOP |
3 字节 |
03小时 |
OEM 名称和版本 |
8 字节 |
0BH |
每扇区字节数 |
2 个字节 |
0DH |
每簇扇区数 |
1 字节 |
0EH |
保留扇区 |
2 个字节 |
10H |
FAT 副本数 |
1 字节 |
11H |
最大根目录条目数(但不适用于 FAT32) |
2 个字节 |
13H |
分区中的扇区数小于 32MB(因此不适用于 FAT32) |
2 个字节 |
15 小时 |
媒体描述符(硬盘为 F8H) |
1 字节 |
16 小时 |
每个 FAT 的扇区数(在较旧的 FAT 系统中,不适用于 FAT32) |
2 个字节 |
18H |
每磁道扇区数 |
2 个字节 |
1AH |
磁头数量 |
2 个字节 |
1通道 |
分区中隐藏扇区的数量 |
4 字节 |
20H |
分区中的扇区数 |
4 字节 |
24小时 |
每个 FAT 的扇区数 |
4 字节 |
28小时 |
标志(位 0-4 表示活动 FAT 副本)(位 7 表示 FAT 镜像是启用还是禁用 <清除已启用>)(如果 FAT 镜像已禁用,则 FAT 信息仅写入位 0-4 指示的副本) |
2 个字节 |
2AH |
FAT32 驱动器的版本(高字节 = 主版本,低字节 = 次版本) |
2 个字节 |
双通道 |
根目录起始簇号 |
4 字节 |
30小时 |
文件系统信息扇区的扇区号(从分区开头开始引用) |
2 个字节 |
32H |
备份引导扇区的扇区号(从分区开头开始引用) |
2 个字节 |
34 小时 |
预订的 |
12 字节 |
40H |
分区的逻辑驱动器号 |
1 字节 |
41H |
未使用(可能是前一个条目的高字节) |
1 字节 |
42H |
扩展签名(29H) |
1 字节 |
43H |
分区的序列号或 32 位二进制 ID
(操作系统本身提供的 32 位二进制 ID) |
4 字节 |
47H |
分区的卷名 |
11 字节 |
52H |
FAT 名称(本例中为 FAT32) |
8 字节 |
5AH |
可执行代码 |
420 字节 |
1FEH |
可执行标记或幻数 (AAH 55H) |
2 个字节 |
- 逻辑卷中的总扇区数(小,逻辑卷大小小于或等于 32 MB)
- 媒体描述符字节
- 每个 FA 的扇区数
这些信息有助于我们找到 FAT 的位置和其他一些重要值。如果在此处输入错误的信息或破坏这些值,则无法从硬盘驱动器启动。有时,磁盘参数块中的信息错误会阻止从硬盘驱动器以及软盘驱动器启动。
每个扇区的字节数几乎总是 512。如果不是这样,那么它也必须是 2 的整数幂(例如 64、128 和 256)。
每个簇的扇区数取决于簇的大小。(请参阅本章前面给出的簇部分)。FAT 的副本数几乎总是 2。
根目录的数量:取决于文件系统和卷大小。(请参阅之前给出的文件系统限制和接下来给出的根目录描述)。
扇区总数:不包括隐藏扇区。如果 BPB 中的值为 0,则使用扩展引导记录信息中的字段,反之亦然。请注意,可以通过检查偏移量 26H 处的签名字节来确定扩展信息(DOS 4.0 及更高版本)是否可用。
逻辑 DOS 驱动器的引导扇区之前的任何扇区都被视为“隐藏”扇区。DOS 不解释隐藏扇区。普通软盘驱动器有 0 个隐藏扇区。硬盘驱动器分区将有一个数字,反映它们在驱动器上的位置。请注意,第一个柱面的整个第一个磁头通常为分区表保留,即使实际上只有第一个扇区被使用。
媒体描述符:用于指示媒体或磁盘类型。扩展 DOS 分区的正常值为 0,硬盘的正常值为 F8H。下表给出了媒体描述符字节的值。
媒体描述符 |
类型 |
容量 |
尺寸和类型 |
0H |
2.88 MB |
3.5 英寸,双面,每磁道 36 个扇区 |
0H |
1.44 MB |
3.5 英寸,双面,每磁道 18 个扇区 |
F9H |
720 千字节 |
3.5 英寸,双面,每磁道 9 个扇区 |
F9H |
1.2 兆字节 |
5.25 英寸,双面,每磁道 15 个扇区 |
外籍家庭主妇 |
360 千字节 |
5.25 英寸,双面,每磁道 9 个扇区 |
前庭高心率 |
320 千字节 |
5.25 英寸,双面,每磁道 8 个扇区 |
自由港 |
180 千字节 |
5.25 英寸,单面,每磁道 9 个扇区 |
前庭大出血 |
160 千字节 |
5.25 英寸,单面,每磁道 8 个扇区 |
F8H |
--------- |
固定磁盘 |
FAT 的扇区数:必须计算。计算 FAT 大小的方法已在章节中给出的 FAT 描述中给出。
下图给出了 FAT32 文件系统的 DBR:
FAT 的部门
每磁道扇区数(或每磁头扇区数):每磁头扇区数是归入一个磁头的扇区数。同样,每柱面磁头数反映每个磁头的柱面数。如果此分区是 CHS 分区,则这些值必须与 BIOS 返回的值相同。如果它们不相同,则必须考虑磁盘配置错误,并且分区可能无法使用。
隐藏扇区:正如我们已经讨论过的,这是物理磁盘上位于卷开头之前(引导扇区本身之前)的扇区数。它在引导序列期间用于计算到根目录和数据区域的绝对偏移量。可以将其视为此分区开头和分区表本身之间的扇区数。
此字段应与分区表中的“分区前扇区数”相同。请注意,它不一定是第一个扇区的物理 LBA 地址,因为可能存在辅助分区。
如果隐藏扇区与分区表中的扇区不同,则您可以认为引导扇区已损坏,分区不可用。还请注意,在旧版本的 DOS 中,高位字通常包含垃圾。
如果您怀疑引导扇区已损坏,您可以检查上面列出的几个字段,看看那里列出的值是否有意义。
例如,在大多数情况下,每扇区的字节数为 512。您可能还会期望在引导扇区的可执行代码部分看到适合格式化磁盘的操作系统的文本字符串。
例如,MS-DOS 格式化的 FAT 卷上的典型文本字符串包括:“无效的系统磁盘”、“磁盘 I/O 错误”、“更换磁盘,然后按任意键”、“非系统磁盘或磁盘错误”、“更换并在准备就绪时按任意键。”和“磁盘启动失败”。Windows NT 格式化的 FAT 卷上的文本字符串包括:“BOOT:无法(或无法)找到 NTLDR”、“读取磁盘时出现 I/O 错误。”和“请插入另一张磁盘。”
但请记住,您不应将此列表视为全部内容。如果您在引导扇区中发现其他消息,这并不一定表示引导扇区存在问题。不同版本的 MS-DOS 和 Windows NT 的引导扇区中的消息字符串有时可能会略有不同。
另一方面,如果您找不到任何文本,或者文本显然与 MS-DOS 或 Windows NT 无关,那么您应该考虑您的引导扇区可能已被病毒感染,或者可能发生了其他形式的数据损坏。
要从被病毒感染的引导扇区中恢复,通常最好使用商业防病毒程序。许多病毒和木马所做的远不止将数据写入引导扇区,因此不建议手动修复引导扇区,因为它可能无法完全消除病毒或木马,在某些情况下,可能弊大于利。不过,我们将在本书的编程部分处理 DBR。
如果您怀疑引导扇区因其他原因而损坏,则可以通过手动修改上述字段来恢复引导扇区损坏,而无需重新格式化驱动器。我们将在本书的恢复编程技术中尝试使用编程来克服此类问题。
文件分配表 (FAT)
DBR 之后是文件分配表。文件分配表 (FAT) 于 1977 年推出,用于将数据存储在 Microsoft 独立 Disk Basic 的软盘上。FAT 经过多次修改,以满足不断增长的需求。它的开发是为了满足快速灵活的系统对可移动和固定媒体上的数据进行管理的要求。
1996 年,FAT32 随 Windows 95 OSR2 推出。如前所述,Windows 98/ME 支持硬盘大小的 FAT32。现在这些操作系统普遍使用 FAT32 文件系统。
第一个 DOS FAT 文件系统 (DOS 1.x) 使用 12 位 FAT 系统,该系统至今仍在软盘中使用。DOS 2.x 增加了对硬盘的支持,由于容量较大,因此改为使用 16 位 FAT 条目。
大约在 1987 年,DOS 4.0 改变了低级扇区处理方式,使用 32 位参数来克服大磁盘支持问题,正如我们已经讨论过的文件系统的局限性。
FAT 保存着磁盘驱动器完整表面的映射,例如哪个区域是空闲的、哪个区域是坏的、哪个区域被哪个文件占用等等。当需要访问存储在磁盘表面的某些数据时,DOS 会查阅 FAT 以找出硬盘表面包含该数据的区域。
使用的 FAT 类型由硬盘分区时的 FDISK 程序决定。但实际的 FAT 是由 DOS 的 FORMAT 程序写入的。
FAT 不会跟踪磁盘表面的每个扇区,而是管理一组称为“簇”或“分配单元”的扇区中的磁盘区域(请参阅同一章中之前讨论的簇)。
簇是 DOS 分配给文件的硬盘驱动器空间的最小单位,它由一个或多个扇区组成,具体取决于驱动器的大小。簇大小由 DOS FORMAT 程序在硬盘驱动器高级格式化期间决定和固定。(请参阅前面给出的“簇大小”讨论)
实际上,FAT 是整个卷的簇的索引。FAT 为每个簇都有一个条目。FAT 中的前两个条目包含有关 FAT 的信息。FAT 中的第三个和后续条目被分配给磁盘空间的簇,从第一个可供文件使用的簇开始
由于 FAT 非常重要,因此 DOS 保留了 FAT 的两个副本,即主 FAT 或 FAT1 和辅助 FAT 或 FAT2(通常有两个副本,但是许多新操作系统会创建两个以上的 FAT 副本)。
每个 FAT 都占据磁盘上的连续扇区,如果第二个 FAT 紧跟在第一个 FAT 之后,则 DOS 不会使用第二个 FAT 来纠正问题,相反,当第一个 FAT 更新时,DOS 会将其复制到第二个 FAT,从而在此过程中也会损坏第二个 FAT。
每次 DOS 发现第一个和第二个 FAT 不匹配时,都会进行此更新。因此,如果第一个 FAT 出现任何损坏,应立即使用某些磁盘编辑软件进行修复,并将第一个 FAT 与第二个 FAT 进行比较。这应该在 DOS 将损坏的 FAT 复制到第二个 FAT 之前完成。
随着 FAT32 的推出,FAT 条目和扇区编号现在都是 32 位的。这意味着现在有 4,294,967,296 个不同的 32 位值乘以每个扇区 512 字节,得出 2 TB(2,199,023,255,552 字节)是 FAT32 下可能的最大磁盘大小。
FAT 32 中每个文件的目录项大小为 4 个字节,用于保存文件起始簇的值,而 FAT16 下则需要 2 个字节。值越大,保存的簇数就越多。
传统上,每个目录条目都是一个 32 字节的记录,这一点保持不变。目录记录中间有 10 个字节(字节 12 到 21),Microsoft 已保留这些字节以供将来使用。现在,其中两个字节用于容纳 FAT32 下指定起始簇所需的额外字节。
我们已经讨论过,FAT 有 12 位、16 位和 32 位版本。32 位 FAT 允许更高效的存储,效率可提高 30%,并且可以使用更大的硬盘。
当程序调用操作系统的文件系统来查找文件内容时,将读取该文件目录条目中的第一个簇值,并使用该值查找 FAT 链。FAT 链是包含属于某个文件的数据的簇列表。
FAT32 驱动器布局 |
抵消 |
描述 |
分区开始 |
引导扇区 |
分区起始 + 保留扇区数 |
脂肪表 |
分区起始 + 保留扇区数 +(每个 FAT 的扇区数 * 2)
[假设已启用 FAT 镜像,这几乎总是正确的] |
根目录 |
分区起始位置 + 保留扇区数 + (每个 FAT 的扇区数 * 2) + 根目录中的扇区数 |
数据区 |
FAT 条目可以包含指示以下内容的值:
- 给定文件的 FAT 链中的下一个簇
- 空闲簇,即未被任何文件使用的簇
- 坏扇区的信息,即包含一个或多个物理损坏且不应使用的扇区的簇。
- 文件的最后一个簇
FAT 表条目 |
数字(十六进制) |
描述 |
0 |
自由集群 |
???? |
集群正在使用中,链中的下一个集群 |
FF0-FF6 / FFF0-FFF6 |
集群已保留 |
FF7/FFF7 |
簇包含坏扇区 |
FF8-FFF / FFF8-FFFF |
文件结尾 |
每个 FAT 条目代表一个簇地址,并包含指向文件的下一个簇地址(FAT 条目)的指针。文件的最后一个 FAT 条目包含最终簇值而不是指针。FAT 中的前两个条目包含有关 FAT 的信息。FAT 的这些字节包含一个媒体描述符字节。此字节可用于查找此 FAT 条目所属的磁盘介质类型。
FAT 中的第三项及后续条目被分配到磁盘空间的簇,从第一个可供文件使用的簇开始。FAT 条目可以具有上表中给出的任意值,具体取决于它要传达的信息。
12 位 FAT 中的 000H 或 16 位 FAT 中的 0000H 表示此 FAT 位置对应的簇未分配或为空。12 位 FAT 中从 FF8H 到 FFFH 的任何值或 16 位 FAT 中从 FFF8H 到 FFFFH 的任何值都表示此簇是文件簇链中的最后一个簇。
12 位 FAT 中的 FF0H 至 FF7H 值表示保留簇。12 位 FAT 中的 FF7H 或 16 位 FAT 中的 FFF7H 表示与 FAT 位置对应的簇是坏簇,即这基本上是一个包含坏扇区的簇。此簇不用于数据存储。
FAT 表中的任何其他值都是指向文件分配链中下一个集群的指针。
Windows 如何检测不正确的关机
这是很常见的事情,我希望您在使用 Windows 时已经多次注意到这一点,如果您的计算机由于电源故障、软件损坏、意外关机等原因而出现不当关机,当您进一步重新启动计算机时,在启动过程中屏幕上会显示不当关机的消息,并且操作系统会扫描磁盘以查找错误。
接下来的两个图显示了 32 位 FAT 开头的 256 字节,但是我们只需要最初的 8 个字节来讨论这一点。
实际上,当 Windows 操作系统将自身加载到内存中,即 Windows 启动时,FAT 的第 8 个字节(或偏移量 7H)将从 0FH 或 FFH 变为 07H 或 F7H。
Microsoft 仅对包含正在运行的操作系统的卷使用字节 0FH,而对其正在访问的任何其他卷使用字节 FFH。
一旦 Windows 开始启动,第 8 个字节将更改为 07H 或 F7H,仅当 Windows 正确关闭时,它才会设置回 0FH 或 FFH。
如果发生电源故障,或者计算机的电源开关意外关闭,或者由于某些软件问题而手动重新启动系统,则该字节将保持为 07H 或 F7H,以便在下次启动时通知 Windows 操作系统发生了某种不正确的关机,然后 Windows 使用其磁盘扫描程序(Scandisk)来验证磁盘是否有错误。

根目录
最后一个 FAT 之后是根目录。根目录就像是硬盘驱动器上存储信息的目录。根目录位于 FAT 之后,因此可以通过将引导记录中的值相加轻松确定其位置。
目录区保存有关文件名、文件创建日期和时间、文件属性、文件大小和特定文件的起始簇的信息。描述有关文件的这些信息的每个目录条目都是 32 字节信息。
根目录包含有关从根目录分支出来的文件和目录的信息。所有其他目录本身都以文件形式存储,格式与根目录相同。以前,根目录的大小是固定的,并且位于磁盘上的固定位置,但现在它可以根据需要自由增长,因为它现在被视为文件。
根目录中可以存储的文件数取决于所使用的 FAT 类型。例如,对于具有 12 位 FAT 的 3½ 英寸 1.44Mb 软盘,其条目数限制为 224,如果尝试存储第 225 个文件,DOS 将显示“文件创建错误”。使用 16 位 FAT 时,根目录中总共可以有 512 个条目。软盘或硬盘上的每个主目录也充当根目录条目。
下表列出了不同介质和 FAT 的根目录条目的限制:
媒体和文件系统描述 |
最大根目录条目数 |
单面 5¼ 英寸 180K FDD |
64 |
双面 5¼ 英寸 320K FDD |
64 |
双面 5¼ 英寸 360K FDD |
112 |
双面 3½ 英寸 720K FDD |
112 |
双面 5¼ 英寸 1.2 兆 FDD |
224 |
双面 3.5 英寸 1.44 兆 FDD |
224 |
双面 3½ 英寸 1.68 兆字节 DMF 格式磁盘(这就是 Microsoft 创建 CAB 文件的原因!) |
16 |
双面 3.5 英寸 2.88 兆 FDD |
240 |
硬盘(FAT12 和 FAT16) |
512 |
采用 FAT 32 的硬盘(因为它将路由目录视为文件) |
65,536 |
这并不意味着 16 位 FAT 只能在硬盘驱动器上存储 512 个文件。可以使用子目录存储任意数量的文件,但仅受驱动器大小的限制。
请记住,软盘的卷标通常存储在引导扇区内,但硬盘的卷标存储为根目录条目,引导扇区中保留的空间留空。如果存在目录,则 DOS 的 DIR 命令返回目录中的卷标,如果不存在,则返回引导扇区中的卷标。
目录条目包含进入簇链的条目和文件名。因此,最重要的目录条目是根目录,因为它包含指向所有子目录的簇索引。
所有目录都包含两个条目,“.”表示当前目录(此子目录),“..”表示父目录(此子目录的父目录)。我们可以轻松跟踪这些条目,因为如果簇包含目录,它们将始终位于簇的开头。下表显示了根目录中目录条目的格式。下表显示了如何对根目录中文件的 32 字节目录条目进行切片以存储有关它的各种信息:
抵消 |
尺寸 |
描述 |
00小时 |
8 字节 |
文件名
(另请参阅下表以了解文件名第一个字符的特殊含义) |
08小时 |
3 字节 |
扩大 |
0BH |
1 字节 |
文件属性(见文件属性表) |
0通道 |
10 字节 |
预订的 |
16 小时 |
2 个字节 |
创建时间或上次更新时间(参见日期时间格式表) |
18H |
2 个字节 |
创建日期或上次更新日期(请参阅日期时间格式表) |
1AH |
2 个字节 |
文件的起始或第一个簇
(值 0000H 用于父目录(' .. ')条目,以指示父目录是根目录) |
1通道 |
4 字节 |
文件大小(以字节为单位)。 |
文件名包含大写的名称,如果文件名的大小小于 8 个字符,则空格用 ASCII 数字 32 的空格字符填充。扩展名字段包含文件的扩展名,以大写形式显示。
如果文件名长度超过 8 个字符,Windows 会将长文件名截断为 6 个大写字符,并在基本文件名末尾添加“~1”,从而创建一个短文件名。
如果已存在另一个具有相同前六个字符的文件名,则数字将递增。扩展名保持不变,并且任何在早期版本的 Windows 和 DOS 中非法的字符都将替换为下划线。
长文件名存储在特殊格式的 32 字节长文件名 (LFN) 目录条目中,这些条目的属性字节设置为 0FH。对于给定文件或子目录,一组或多个长文件名目录条目紧接在磁盘上的单个 8.3 目录条目之前。
每个 LFN 目录条目包含最多 13 个长文件名字符,操作系统会根据需要将多个字符串在一起以组成整个长文件名。
这就是长文件名会减少文件系统中根目录条目的最大可能数量的原因。Windows 如何支持长文件名,我们将在本章后面详细讨论。
文件名的第一个字节也可能包含一些有关文件的重要信息。该字节给出的信息可能是下表中给出的信息之一:
文件名第一个字符 |
价值 |
意义 |
00小时 |
表示该目录条目未使用。 |
05小时 |
表示文件名的第一个字符是字符E5H,但实际上文件并没有被删除。(参见E5H的含义) |
E5H |
该文件已被删除,此目录条目是已删除文件的目录条目。该文件先前占用的数据区域现在可供另一个新文件分配。 |
2EH |
这是一个子目录。此条目的簇号字段将包含目录的簇号。 |
2EH 2EH |
目录项中的两个 2EH 表示子目录的父目录项。此项的簇号将包含此目录的父目录的簇号。如果父目录是根目录,则簇号将为零 0000H。 |
属性是一个 8 位二进制编码字段。下表列出了给定文件的属性标志的状态:
属性位 |
属性 |
少量 |
二进制 |
十六进制 |
只读文件标志 |
0 |
......? |
01小时 |
隐藏文件标志 |
1 |
......?. |
02小时 |
系统文件标志 |
2 |
......?.. |
04 小时 |
卷标标志
(表示该条目是卷标) |
3 |
....?... |
08小时 |
子目录
(与目录格式相同) |
4 |
...?.... |
10H |
存档位
(自上次备份以来修改的文件) |
5 |
..?...... |
20H |
保留(包含0) |
6 |
.0...... |
- |
保留(包含0) |
7 |
0....... |
- |
一个文件可能有多个属性。例如,一个文件可以是只读文件,也可以是隐藏文件,或者一个文件可以同时具有系统文件和隐藏文件两种属性。(请参阅下面给出的目录条目编码示例)。
时间和日期是一个 32 位的特殊编码字段(16 位表示时间,16 位表示日期)。下表给出了这些位编码的划分,以组成文件的创建或最后更新时间以及创建或最后更新日期:
文件创建时间或最后更新时间的条目,即目录条目中的第 16 和第 17 个字节,其格式如上表所示。编码如下:
- H 是小时的二进制数,范围从 0 到 23
- M 是表示分钟的二进制数,范围从 0 到 59
- S 是秒的二进制数,以 2 秒为增量
- 文件创建或上次更新的数据条目,即第 18 和
- 目录项中的第 19 个字节,格式如下:
- Y 是 0 至 127 之间的二进制数,或 1980 至 2107 之间的年份
- M 是月份的二进制数,范围是 1 到 12
- D 是表示日期的二进制数,范围是 1 到 31
此目录条目根据第一个簇值与 FAT 条目相链接。一旦 DOS 获得目录中任何文件的起始簇值,DOS 便可以使用 FAT 找到完整文件。链中的条目簇是组成文件的第一个簇。如果设置了属性的目录标志,则此字段指向新的目录条目。
文件大小条目为 4 个字节。由此我们可以计算出 FAT32 如何支持最大文件大小为 4,294,967,295 字节,即约 4 GiB。4 个字节有 32 位,任何 32 位二进制组成的最大可能文件大小可能是,
= 11111111 11111111 11111111 11111111 (B)字节
= 4,294,967,295(D)字节
~ 4 GiB
因此,FAT32 支持的最大文件大小为 4 GiB。
根目录条目
文件的大小和文件的起始簇可能是恢复损坏文件的数据恢复的宝贵资源,因为我们可以计算出文件应该由多少个簇组成。
上图显示了七个不同文件的根目录条目。这些条目的编码如下表所示:
长文件名 (LFN)
正如我们之前在根目录讨论中讨论过的,以前根目录的大小是固定的,并且位于磁盘上的固定位置,但现在它可以根据需要自由增长,因为它现在被视为一个文件。
这对于长文件名非常重要,因为每个长文件名都使用多个目录条目。在使用 8.3 文件名的操作系统中添加长文件名支持并不像扩展目录条目以容纳超过 11 个字符那么简单。
如果这个新操作系统返回 255 个字符的文件名,许多旧应用程序(预计接收的字符不超过 11 个)就会崩溃,因为程序必须留出内存来存储读取的文件名,如果它为文件名留出 16 字节,而操作系统将(比如说)32 个字符复制到该空间,那么其他数据就会被覆盖。破坏应用程序的一种可靠方法是将随机数据复制到其数据空间中。
为了解决这个问题,Windows 95 中找到了巧妙的解决方案,解决了支持长文件名的问题,同时保持与以前版本的 DOS 和 Windows 应用程序的兼容性。
当大多数应用程序(除了低级磁盘实用程序,例如 Norton Disk Doctor)向系统查询文件和子目录名称时,它们不是直接从磁盘读取目录条目,而是使用操作系统内置的枚举函数。
我们知道目录条目是用只读、隐藏、系统和卷标属性位的组合来标记的。同样,如果目录条目的属性字节的值为 0FH,则所有现有版本的 DOS 和所有 Windows 95 之前的版本的 Windows 中内置的枚举函数都会跳过该目录条目,就像它不存在一样。
然后,解决方案是为每个文件和子目录存储两个名称,一个对所有应用程序都可见的短名称和一个仅对 Windows 95(及更高版本)应用程序以及已重写以添加对长文件名支持的应用程序可见的长名称。短文件名以 8.3 格式存储在传统的 32 字节目录条目中。
我们已经讨论过,Windows 通过将长文件名截断为六个大写字符并在基本文件名末尾添加“~1”来创建短文件名。
如果已存在另一个具有相同前六个字符的文件名,则数字将递增。扩展名保持不变,并且任何在早期版本的 Windows 和 DOS 中非法的字符都将替换为下划线。
长文件名存储在特殊格式的 32 字节长文件名 (LFN) 目录条目中,属性字节设置为 0FH。对于给定文件或子目录,一组或多个长文件名目录条目紧接在磁盘上的单个 8.3 目录条目之前。
每个长文件名目录条目包含最多 13 个长文件名字符,操作系统会根据需要将尽可能多的字符串在一起以组成整个长文件名。
对于长文件名目录条目,文件名以 Unicode 格式存储,每个字符需要 2 个字节,而 ASCII 则需要 1 个字节。文件名字符分布在三个单独的字段中:
- 长度为前 10 个字节(5 个字符),
- 第二个12字节(六个字符),
- 第三个4个字节(两个字符)。
- 目录条目第一个字节的最低五位保存一个序列号,用于标识目录条目相对于其他条目的位置
- 与同一文件相关的长文件名目录条目。
如果长文件名需要三个 LFN 目录条目,则第一个条目的序列号为 1,第二个条目的序列号为 2,第三个条目的序列号为 3,并且第三个条目的第一个字节的第 6 位设置为 1,以指示它是序列中的最后一个条目。
属性字段在 LFN 目录条目中的位置与在 8.3 目录条目中的位置相同,因为文件系统在检查属性字节之前不知道它正在处理的目录条目类型。起始簇号字段也出现在相同的位置,但在 LFN 目录条目中,其值始终为 0。类型指示符字段在每个长文件名中也保留 0。
长文件名的一个问题是它们比短文件名占用更多的磁盘空间。当长文件名存储在子目录中时,这不是什么大问题,因为只要有磁盘空间,子目录就可以增长以容纳添加的目录条目,但根目录中可用的目录条目的最大数量是固定的,而长文件名会浪费大小有限的根目录中的空间。
现在举例来说,如果硬盘的根目录最多包含 512 个目录条目,因为 128 个字符的名称需要 11 个条目,其中 10 个为长名称,1 个为短名称,因此,如果每个文件和子目录都赋予 128 个字符的名称,则只能在根目录中创建 46 个文件和子目录。
FAT32 的问题也消失了,因为 FAT32 下的根目录也可以增大,因为在 FAT32 系统中,根目录被视为可以增大的文件。
数据区(或文件区)
根目录之后是数据区(或文件区)。我们可以说根目录之后的卷剩余部分是数据区。
数据区包含磁盘表面上存储的实际数据。DOS 使用簇号 2 作为数据区的第一个扇区,因此我们在执行各种计算时应记住簇号应从 2 开始。
当我们格式化硬盘驱动器时,DOS 的 FORMAT 命令不会破坏或覆盖数据区上的数据。FORMAT 命令仅删除目录条目和 FAT 条目,而不会触及实际数据区。
这使得意外格式化的硬盘驱动器的恢复成为可能,但并非所有意外格式化的软盘都可恢复。与 Windows 完全格式化一样,软盘的数据区域将由 F6H 字符填充,并且所有信息将被覆盖。
DOS 使用一个 16 位/32 位指针,称为“最后使用的簇”(LCU) 指针,来存储最后使用的簇号。最初,此指针值为零,当在特定簇上写入某些信息时,该簇号将存储到 LCU 指针中。
此后,每次要写入新信息时,DOS 都会从 LCU 号开始搜索空闲簇。这样,在将数据写入新的未使用区域时,磁盘上写入的新数据必须保持连续。
现在,在意外删除的情况下,了解数据会变得容易得多,因为文件位于磁盘上的一个连续区域中。一旦到达磁盘末尾或系统重置,LCU 指针值将重置为零。
但问题不止于此。实际上,您不可能只在磁盘上创建新文件,而不从以前存储的文件中删除或修改任何文件。如果您创建和删除了大量文件,仅使用 LCU 就会出现问题,因为这会迫使新数据越来越深入硬盘的内轨。
因此,如果任何存储在磁盘中的文件被移动或删除,则数据区域中该文件占用的簇现在将设置为数据区域中可用的未分配簇,并准备在其上写入新数据。通过这样做,操作系统不需要将所有数据移动到磁盘的内轨。
但是大量的文件的删除和创建会造成磁盘上数据的碎片化,从而导致数据碎片化。
碎片化和碎片整理数据
我们已经讨论过,磁盘中的每个文件都存储为一个簇链接列表,文件中包含的数据可以位于磁盘上的任何位置。如果您将一个 10 MB 的文件存储在使用 4,096 字节簇的磁盘上,则它使用了 2,560 个簇。这些簇可以位于磁盘的不同轨道、不同盘片上,实际上,它们可以位于任何地方。
虽然文件可以分布在整个磁盘上,但这远非理想的情况。原因是性能缓慢,令人不快。硬盘是相对较慢的设备,主要是因为硬盘中有机械部件。每次硬盘必须将磁头移动到不同的轨道时,都要花费相当于数千个处理器周期的时间。
因此,我们希望尽量减少每个文件在磁盘上的分布程度。在理想情况下,每个文件实际上都是完全连续的。这意味着它使用的每个簇在磁盘上都是一个接一个的。这样就可以在必要时读取整个文件,而无需硬盘进行大量的机械运动。
实际上,文件系统开始时其文件的全部或大部分都是连续的,但由于一段时间内文件的创建和删除,磁盘上的数据变得越来越碎片化。
让我们考虑一个简单的例子来理解碎片化。下表表示 12 个集群的使用情况。最初,该表是空的:
集群 1 |
集群 2 |
集群 3 |
集群 4 |
集群 5 |
集群 6 |
集群 7 |
集群 8 |
集群 9 |
集群 10 |
集群 11 |
集群 12 |
现在假设我们在此磁盘中创建四个文件,即文件 A、B、C 和 D。文件 A 占用 1 个簇,文件 B 占用 4 个簇,文件 C 占用 2 个簇,文件 D 占用 3 个簇。我们将它们存储在可用空间中,并且它们一开始都是连续的,如下图所示:
过一段时间,我们删除文件 C,这样,文件 C 占用的两个簇现在都是空闲的或未分配的。磁盘看起来如下图所示:
现在,我们创建一个需要 3 个簇的新文件 E。但是,由于磁盘上没有剩余的 3 个簇长度的连续块,所以我们必须将 E 分成两个碎片,使用以前由 C 占用的部分空间。现在我们的磁盘将如下图所示:
经过一段时间后,我们删除文件 A 和 E,并创建占用 5 个簇的文件 F。磁盘现在如下图所示:
现在我们看到文件 F 最终被分成了三个碎片。磁盘中的这种类型的数据称为碎片数据。上面给出的示例是一个非常简化的碎片示例,因为实际磁盘有数千个文件和数千个簇,因此那里的问题被放大了。不过,这可以让您大致了解会发生什么。
碎片整理程序(如 Microsoft 的 DEFRAG 程序、Norton 的 SpeedDisk)的作用是重新排列磁盘,使文件恢复为连续的形式。运行磁盘碎片整理实用程序后,我们讨论的磁盘上的碎片整理数据将如下图所示:
在许多情况下,碎片化和碎片整理后的数据在数据恢复过程中非常重要。
假设我们有两个崩溃的磁盘需要恢复数据,一个磁盘有碎片数据,另一个磁盘最近进行了碎片整理。由于文件的 FAT 和 Root 信息已损坏,因此您必须通过从两个磁盘的表面收集数据来进行数据恢复。在这种情况下,恢复的百分比将与磁盘中数据的碎片整理成正比。
显然,从碎片整理后的磁盘恢复数据会很容易,数据恢复的百分比也会很高,但另一方面,从碎片磁盘恢复数据会很困难,而且费时,恢复数据的百分比也会令人失望。
确定数据损坏的原因
有一些特定的步骤,如果按顺序执行,可能会帮助我们找到损坏的区域。这些步骤已与恢复过程一起描述如下:
使用可启动软盘启动系统
使用您使用的操作系统的可启动软盘或 CD 启动系统。尝试读取逻辑驱动器 C: 或 D: 或任何其他驱动器。如果驱动器可访问,只需从驱动器中复制所有数据。现在您可以找出磁盘无法正常启动的原因,并且压力更小。
验证 MBR 信息
硬盘上第一个也是最重要的数据是 MBR 及其所包含的表,即分区表。本书附带的磁盘中提供了名为“TTEDITOR.EXE”的小型磁盘编辑工具。或者您可以使用任何其他程序来分析硬盘。
Diskedit 将是最适合分析磁盘以进行数据恢复的程序。好吧,无论你觉得哪个程序易于使用,都可以由你选择。尝试读取 MBR,尤其是其分区表。
正如您在本章讨论的 MBR 描述中所看到的,在 MBR 的后半部分,如果出现问题,则显示一些可读的文本作为错误消息。这些文本消息显示如下:
如果没有这些错误消息,则表明 MBR 已损坏。还可能出现一些非法消息,例如“您的系统已被......入侵”或任何其他意外消息。这表明 MBR 存在严重问题,很可能是由于某种病毒感染造成的。
现在检查 MBR 的初始 446 字节后的分区表。如果分区表为空,则在启动时不会看到任何错误消息。DOS 会忽略未分区的驱动器。如果驱动器 A: 中没有任何可启动软盘,系统将要求在驱动器 A: 中插入可启动软盘。
这里需要注意的重要一点是,之前运行的驱动器上的分区表不应为空白,因为某些东西已经将其删除。如果分区表为空白,请从备份中恢复 MBR。
如果备份不起作用,即使成功完成恢复过程,该扇区上也存在物理损坏。尝试使用下一章中提供的数据恢复编程技术来恢复数据。如果您根本不是程序员,最好去任何优秀的数据恢复中心。
如果您没有任何 MBR 备份,请尝试使用某些磁盘编辑工具(例如 Diskedit)手动写入分区表,但是在某些情况下这样做非常困难。
对于不是程序员且没有任何备份的用户,可以使用我大学时期开发数据恢复项目时一直使用的方法。
您要做的是,只需搜索您附近的计算机,该计算机具有几乎相同的磁盘大小、相同的分区数,并且最重要的是,它具有与您的计算机相同的操作系统。
但是,大多数情况下,它都能正常工作。但如果不能,至少它可以帮助您访问磁盘的第一个分区。如果您的操作系统安装在第一个分区中,并且其他信息未损坏,操作系统也将正常启动。
如果 MBR 没有问题,则验证 DBR
如果 MBR 没有问题,请验证 DBR(DOS 引导记录)。正如我们已经讨论过的,这是 DOS 分区中的第一个扇区,包含一个小程序,用于加载隐藏文件并引导操作系统。
DBR 还包含许多有关 FAT、根目录簇和分区大小等的重要信息。使用一些类似 Diskedit 的实用程序来读取 DBR 信息,如果 DBR 已损坏或包含一些非法信息,请从备份中恢复 DBR。
所有专业的数据恢复软件都能够重写 DBR。我们将在本书的下一章中讨论如何使用编程重写分区的 DBR。
您还可以通过提供适当的信息在 Diskedit 的帮助下重写分区的 DBR。
还有一种非常简单的方法可以找出损坏的区域。屏幕上显示的错误消息有特定的原因。一些重要错误消息的描述如下:
信息 |
描述 |
“读取驱动器时未找到扇区” |
此消息可能在任何 DOS 操作期间出现。通常,它是由扇区 ID 褪色或丢失引起的。 |
“读取驱动器数据错误” |
此消息可能在任何 DOS 操作期间出现。它是由数据校验失败引起的 - CRC(循环冗余校验)或 ECC(错误校正码)。此“数据校验”是指用于检查从磁盘读取的数据是否可靠的机制。 |
“找到 0 个硬盘” |
如果计算机的BIOS没有检测到硬盘,就会显示此信息。请检查硬盘的电源线和数据线连接情况。如果连接正常,则问题可能是由于硬盘的某些硬件错误造成的。 |
“硬盘故障,请按 F1 继续” |
同上 |
“驱动器规格无效” |
当系统无法识别硬件、没有分区信息或缺少驱动器的设备驱动程序时,就会显示此信息。 |
“配置无效按 F1 继续” |
如果硬盘可用,则主板中的电池已经没电,并且系统丢失了其配置SETUP信息或磁盘没有响应。 |
“无效的分区表” |
这是 MBR 错误消息。当 MBR 的分区表没有有效的分区信息时会显示此消息。 |
“加载操作系统时出错” |
这是 MBR 错误消息。它是由于任何类型的 MBR 信息损坏而显示的。 |
“缺少操作系统” |
同上。 |
“磁盘启动失败” |
这是一条 DBR 错误消息。通常,如果您从软盘启动,则应该可以访问硬盘驱动器。虽然它不可启动,但这不会影响对磁盘上数据的访问。 |
“非系统磁盘或磁盘错误” |
同上。 |
“命令解释器损坏或缺失” |
由于命令解释器损坏或缺失,显示此消息。例如,如果操作系统在当前路径中 找不到command.com或者 command.com 已损坏。 |