磁盘访问以称为扇区的单位进行。为了从磁盘读取或写入内容,我们必须指定磁盘上的位置,例如通过给出扇区号。如果磁盘是 SCSI 磁盘,那么这个扇区号会直接进入 SCSI 命令,并被磁盘理解。如果磁盘是使用 LBA 的 IDE 磁盘,情况也完全相同。但是,如果磁盘是旧式的 RLL 或 MFM 磁盘,或者是 LBA 时代之前的 IDE 磁盘,那么磁盘硬件期望使用三元组(柱面,磁头,扇区)来指定磁盘上所需的位置。
磁盘的扇区编号为 0, 1, 2, ... 这被称为 LBA 寻址。
在古代,在 IDE 磁盘出现之前,磁盘有一个由三个常数 C、H、S 描述的几何结构:柱面数、磁头数、每磁道扇区数。扇区的地址由三个数字给出:c、h、s:柱面号(介于 0 和 C-1 之间)、磁头号(介于 0 和 H-1 之间)以及磁道内的扇区号(介于 1 和 S 之间),出于某些神秘的原因,c 和 h 从 0 开始计数,而 s 从 1 开始计数。这被称为 CHS 寻址。
最近十年内生产的磁盘都没有几何结构,但是这种古老的 3D 扇区寻址仍然被 INT13 BIOS 接口使用(使用与任何物理现实无关的虚构数字 C、H、S)。
线性编号与这种 3D 表示法之间的对应关系如下:对于具有 C 个柱面、H 个磁头和 S 个扇区/磁道的磁盘,3D 或 CHS 表示法中的位置 (c,h,s) 与线性或 LBA 表示法中的位置 c*
H*
S + h*
S + (s-1) 相同。
因此,为了访问非常旧的非 SCSI 磁盘,我们需要知道它的几何结构,即 C、H 和 S 的值。(如果您不知道,可以在 www.thetechpage.com 上找到大量有用的信息。)
在本文中,一个扇区有 512 字节。这几乎总是正确的,但例如某些 MO 磁盘使用 2048 字节的扇区大小,下面给出的所有容量都必须乘以四。(在这种磁盘上使用 fdisk
时,请确保您拥有 2.9i 或更高版本,并给出 `-b 2048' 选项。)
具有 C 个柱面、H 个磁头和 S 个扇区/磁道的磁盘总共有 C*
H*
S 个扇区,可以存储 C*
H*
S*
512 字节。例如,如果磁盘标签上写着 C/H/S=4092/16/63,则该磁盘有 4092*
16*
63=4124736 个扇区,可以容纳 4124736*
512=2111864832 字节(2.11 GB)。行业惯例是对于大于 8.4 GB 的磁盘,给出 C/H/S=16383/16/63,并且磁盘大小不能再从磁盘报告的 C/H/S 值中读取出来。
旧的 INT13 BIOS 磁盘 I/O 接口使用 24 位来寻址扇区:柱面 10 位,磁头 8 位,磁道内扇区号 6 位(从 1 开始计数)。这意味着此接口无法寻址超过 1024*256*63 个扇区,即 8.5 GB(使用 512 字节扇区)。如果为磁盘指定的(虚构)几何结构少于 1024 个柱面、或 256 个磁头、或每磁道 63 个扇区,那么此限制将更小。
(更准确地说:使用 INT 13,AH 选择要执行的功能,CH 是柱面号的低 8 位,CL 的位 7-6 中包含柱面号的高两位,位 5-0 中包含扇区号,DH
是磁头号,DL 是驱动器号(80h 或 81h)。这解释了分区表的部分布局。)
当引入所谓的扩展 INT13 功能时,这种情况得到了纠正。现代 BIOS 在访问大容量磁盘时没有问题。
(更准确地说:DS:SI 指向一个 16 字节的磁盘地址包,其中包含一个 8 字节的起始绝对块号。)
Linux 不使用 BIOS,因此没有(也从未有过)这个问题。
但是,这种几何结构在分区表的解释中起作用,因此如果 Linux 与例如 DOS 共享磁盘,那么它需要知道 DOS 会认为磁盘具有什么几何结构。它在启动时也起作用,BIOS 必须加载引导加载程序,而引导加载程序必须加载操作系统。
旧的 ATA 标准描述了如何使用 28 位(扇区 8 位,磁头 4 位,柱面 16 位)在 IDE 磁盘上寻址扇区。这意味着 IDE 磁盘最多可以有 2^28 个可寻址扇区。使用 512 字节扇区,这是 2^37 字节,即 137.4 GB。
ATA-6 标准包含如何寻址超过 2^28 扇区边界的规范。新标准允许寻址 2^48 个扇区。最近的 Linux 内核中支持合并了 Andre Hedrick 的 IDE 补丁,例如 2.4.18-pre7-ac3 和 2.5.3。
Maxtor 自 2001 年秋季以来销售 160 GB IDE 磁盘。旧内核会将此类磁盘视为 137.4 GB 磁盘。