在 MBR 分区表中,每个分区条目都包含一个单字节标识符,该标识符应该描述分区中包含的文件系统类型。文件系统的 FAT 系列已发布多个这样的 ID,一个对应于 FAT 条目的每个宽度。奇怪的是,除了 FAT12 和扩展引导记录类型之外的每个 FAT 变体还有一个额外的 ID,用于文件系统的“LBA”变体:
ID(非 LBA) | 身份证 (LBA) | 文件系统 |
---|---|---|
0x01 |
没有任何 | FAT12 |
0x04 ,0x06 |
0x0e |
FAT16 |
0x0b |
0x0c |
FAT32 |
0x0f |
0x05 |
扩展引导记录 |
现代操作系统通常能够自行确定应该如何寻址驱动器。即使在 LBA 寻址还很年轻的时候,通过 BIOS 访问磁盘,也应该可以简单地探测适当的中断 13h 调用的可用性,如果它们不存在则回退到 CHS 版本。因此,额外的分区 ID 似乎是多余的。
那么这些额外的分区 ID 的意义是什么?它们是否以任何方式影响了磁盘格式、文件系统驱动程序或引导代码?
它们可以阻止不使用 LBA I/O的(旧)操作系统尝试访问这些分区,但失败。分区类型控制哪些操作系统尝试查看分区中的内容。使用 LBA I/O 的操作系统知道查看具有较新分区类型的分区。不将分区视为应忽略的东西的操作系统。
对于无法处理大于 16MiB 和 32MiB 的分区的(旧)操作系统也是如此。
进一步阅读
@JdeBP 的回答是正确的,但不完整。分区类型 ID 的主要目的确实是隐藏无法正确访问分区的旧操作系统(这主要是指旧版本的 DOS)的分区。有时这是因为磁盘驱动程序的任意大小限制;在其他情况下,这是因为 FAT 磁盘格式本身发生了变化(更宽的 FAT 条目,BPB 结构的变化)。
完整的表格(改编自KB Q69912)应如下所示:
0x01
0x04
0x05
0x06
0x0b
0x0c
0x0e
0x0f
阅读如下:如果最后三列中的所有约束都满足(整个分区可以用给定方案寻址,分区不大于指定的FAT版本不迟于指定),则可以使用类型ID在第一列中将分区公开给第二列中的 DOS 版本。反之亦然:少于 32768 个扇区的 CHS 可寻址 FAT12 分区很可能被识别为
0x0c
; 这样做的用处不大。所有 DOS 版本也受到簇大小不能大于 64 个扇区 = 32768 字节的约束。如果这个假设被打破,最好使用的类型可能是
0x07
.DOS 7.0 及更高版本以另一种方式使用分区类型 ID:选择使用哪个 BIOS 服务来访问驱动器。顾名思义,CHS 寻址的分区通过旧的 INT 0x13 服务(AH=0x02,AH=0x03)访问,而 LBA 寻址的分区通过 INT 0x13 扩展访问(AH=0x42,AH=0x43)。CHS 驱动程序也受到某些怪癖和限制的影响,这些都不适用于 LBA 驱动程序:
0x05
)必须在柱面边界对齐;否则 DOS 将错误计算分区所在的位置。* DOS 版本首先与 Windows 95 (4.0.950) 一起分发
** DOS 版本首先与 Windows 95 OSR2 (4.0.1111) 一起分发
*** 分区表寻址方案(以及 BPB 等数据结构)的限制:CHS 最多可寻址 1024 × 255 × 63 个扇区,LBA 最多可寻址 2个 32 个扇区。(知识库文章声称限制为 1024 × 255 × 64,但这可能是错误的。)
**** 最大集群大小为 64 个扇区的限制;每扇区 512 字节 × 每簇 64 扇区 × 65525 簇 ≈ FAT 簇区域中的 2 GiB。理论上,即使有这个限制,这个限制也可以用大的保留扇区区域或根目录区域来打破,但其他大小限制可能仍然存在。
***** 此约束的来源尚不清楚;也许它是虚假的。