采用以下 fdisk 输入:
o # Create DOS/MBR partition table.
n # Create new partition.
p # Partition type
1 # Partition ID
2048 # Starting sector
+4M # Ending sector
t # Assign said partition to a FAT12 filesystem.
1 # FAT12 filesystem.
a # Mark said partition as bootable.
w # Write partition table.
现在,让我们看一下 MBR,特别是分区条目(分区条目从0x80
第一行末尾附近开始)。
000001b0: 0000 0000 0000 0000 4a2f 9087 0000 8020 ........J/.....
000001c0: 2100 01a2 2200 0008 0000 0020 0000 0000 !..."...... ....
000001d0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
000001e0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
000001f0: 0000 0000 0000 0000 0000 0000 0000 55aa ..............U.
根据 MBR 部分条目的布局(在此处和此处给出),我们可以从中收集 CHS 元组的值是0x20
、0x21
、0x00
。
0x20
相当简单:它相当于第 32 个头。
0x21
包含起始扇区和起始柱面。0x21
-> 0b00100001
,给出33
扇区,柱面的第 8 位和第 9 位导致0
( 0b00
)。
结合0b00
(来自0x21
)和的圆柱体位0b00000000
,我们得到0b0000000000
圆柱体。总而言之,我们最终的起始磁头为32,起始扇区为33,起始柱面为0。
当我尝试通过 BIOS 中断加载此 CHS 时,它抱怨 CHS 无效(我可以正常读取其他扇区)。我认为这是因为头部是 32;毕竟,你为什么会有一个 16 盘片的硬盘呢?
tl;博士
Fdisk 输出带有 CHS 值的 MBR。
我的问题是我是否误解了 CHS 值是如何编码到分区条目中的,或者这是否是 fdisk 的一个怪癖。
根据 fdisk 本身,C/H/S 值确实应该是:
fdisk 不会尝试匹配实际的磁盘几何结构——这在 C/H/S 限制内长期以来是不可能的,所以它所做的只是计算一些值,这些值在转换回 LBA 时会给出正确的结果。
来自 util-linux 的代码
include/pt-mbr.h
:来自 util-linux 的评论
libfdisk/src/dos.c
:您假装有一个 16 盘片的硬盘,以便表示比 C/H/S 系统通常可以表示的更多的磁盘空间。每个盘片只有 64ki 柱面 × 255 个扇区 × 2 个磁头,每个盘片只能达到约 8 GB,显然磁盘现在已经稍微超出了这个范围。
操作系统或固件不会单独控制每个磁头,它只是通过 ATA 命令将数字传递给磁盘并取回数据,因此它并不真正关心磁盘是否有 255 个磁头。磁盘本身也不再 - 现在磁盘做的第一件事是使用公式将 C/H/S 值转换为线性 LBA 地址(假设磁盘被赋予 C/H/S 而不是 LBA 开始) .
因此,即使在 BIOS 和操作系统切换到直接处理 LBA 之前,使用“荒谬”的 C/H/S 值来访问该格式通常允许的更多磁盘空间已经很常见。
当前所有的操作系统都只是忽略 MBR 中的 C/H/S 字段并专门处理 LBA,显然这就是“OnTrack 磁盘管理器”在 MS-DOS 中过去所做的事情。(此外,据我所知,SCSI 磁盘从一开始就不支持 C/H/S,它们始终只支持 LBA。)我可以肯定的是,您现在发现的几乎所有 BIOS 都具有原生支持LBA 通过“扩展 INT 13h”(正如 Google 告诉我的那样)。