简短的序言:XT有线硬盘接口的限制为 1024 个柱面、16 个磁头和 63 个扇区。但BIOS调用(int 13h,AH = 02、03、08)提供了不同的限制:1024 个柱面(CL[7:6]<<8|CH)、256 个磁头(DH)和 63 个扇区(CL[5:0])。后来,ATA 发明的有线大小再次为 65536 个柱面、16 个磁头和 255 个扇区。因此,为了达到最大通用大小(1024x16x63、504MiB/528MB),BIOS 必须发明几何转换级别。

(问题已在此处更新,感谢回答者。我错过了 XT 界面的限制,所以后来添加了它。但这并没有改变疑问的主体。)

回想起来,这里最奇怪的是磁头限制。当时硬件开发速度极快,速度远高于现在。但我无法想象一个磁盘设备有 128 个磁盘:从现在的观点和 20 世纪 70-80 年代的技术水平来看,这是不可能的。(我见过的最激进的 HDD 是 1996 年生产的 6 英寸 10GB 磁盘,有 14 个磁盘。大多数其他磁盘最多有 4 个磁盘。)相反,想象一个磁道上有更多扇区要容易得多;数千个扇区也不算不合理。

那么,问题是:为什么(以及由谁)在开发 IBM PC BIOS 时选择这些限制?哪些因素导致了这一不合理的决定?

(PS:这里还有更多奇怪之处:适合 24 位而不是 28 位;扇区地址以 1 开头而不是 0。但我可以想象它们的合理原因,与这个磁头编号范围不同。)

注意:摘自《IBM PC XT 技术参考》第一版(1983 年 1 月),第 A-84 页(BIOS 列表,int 13h):我重新输入:

REGISTERS USED FOR FIXED DISK OPERATIONS
(DH) - HEAD NUMBER (0-7 ALLOWED, NOT VALUE CHECKED)
(CH) - CYLINDER NUMBER (0-1023 ALLOWED, NOT VALUE CHECKED)(SEE CL)
(CL) - SECTOR NUMBER (1-17, NOT VALUE CHECKED)
NOTE: HIGH 2 BITS OF CYLINDER NUMBER ARE PLACED
IN THE HIGH 2 BITS OF THE CL REGISTER
(10 BITS TOTAL)

由于几何翻译是在 1990 年之后才生效,因此我看不出与它有任何关系。


似乎已解决:正如@StephenKitt 所建议的,在磁头号中,高 4 位在软盘和 XT HDD 变体中被假定为驱动器号保留,但在 AT 变体中变为空闲。然后 BIOS 开始“自动”假设磁头号由于可用空间而可扩展到 8 位。很纠结,但至少对我来说,看起来相当合理。也感谢@Justme 指出 XT 接口细节。

5

  • 2
    如果记忆没错的话,它最初只是 CL = 扇区、CH = 柱面、DH = 磁头。后来他们用完了柱面,所以他们从 CL “偷”了一些位作为柱面的高位。他们本可以从 DH 偷一些位作为更多柱面,但大约在那时,有人想出了一个好主意,用转换层对其进行虚拟化,因此哪个寄存器中的哪些位应该用于磁头/柱面/扇区不再重要。


    – 


  • 该死,@JerryCoffin,这就是答案。而且非常有趣。我不知道转换层。我一直想知道他们如何将所有地址空间打包到这些圆柱参数中!将其作为答案发布。


    – 


  • @JerryCoffin 我拿到了 PC XT 技术参考 1983 年 1 月版。它已经列出了与后来相同的方案 – 从扇区号 (CH) 中窃取 2 位高柱面号。这比第一次翻译的需要早了将近十年。所以我猜几何翻译与此无关。


    – 


  • “结果,达到最大常见尺寸 (1024x16x63, 512GB)”计算 512 B * 1024 * 16 * 63 的结果为 504 MiB。


    – 

  • @ecm 明显拼写错误。谢谢,已修复。


    – 


最佳答案
2

API 可以追溯到最初的 IBM PC 及其软盘支持。引用 5150 的 BIOS 列表:

REGISTERS FOR READ/WRITE/VERIFY/FORMAT
(DL) - DRIVE NUMBER (0-3 ALLOWED, VALUE CHECKED)
(DH) - HEAD NUMBER (0-1 ALLOWED, NOT VALUE CHECKED)
(CH) - TRACK NUMBER (0-39, NOT VALUE CHECKED)
(CL) - SECTOR NUMBER (1-8, NOT VALUE CHECKED)

它整齐地映射到驱动器接口,该接口具有八条数据线,并使用所有八条线一次一个地传输磁头、磁道/柱面和扇区/记录号。

在 XT 中添加硬盘支持时,需要的柱面数超过 255 个:。为了尽可能保留现有 API,所需的额外位是从扇区号中窃取的。这与硬件接口相匹配:控制器需要驱动器号(一位)、磁头号(五位)、两个高柱面位、扇区号(六位)和八个低柱面位,按此顺序(请参阅 1983 年 4 月的 PC XT 技术参考第 1-185 页)。

更新后的控制器接口表明,在为磁柱寻找额外位时,选择并不像“磁头或扇区”那么简单。软盘控制器在磁柱号前使用一个字节中的三个位来编码磁头号(一位)和驱动器选择(两位)。对于硬盘驱动器,磁头数量增加了,字节被重新构造,但仍然具有相同的用途:选择驱动器和磁头。有两个未使用的位可用于磁柱,但也许在那里保留一些备用容量以在某个时候增加支持的驱动器数量会更安全。

这样,相同的 BIOS 服务 API 可以用于软盘和硬盘,而无需更改任何软盘代码。

顺便说一句,相关的硬件“标准”不是 ATA,而是 ,因为 XT 使用的是 ST-412。

2

  • 好吧,你回答中最重要的一点是 ATA 几何比 XT 出现得晚。我最初没有注意到这一点。但所有这些都没有回答为什么 XT 开发人员从扇区号中偷取位,而扇区号的增长可能性比从磁头号中偷取位要大得多。你对 CH + CL 的假设看起来很奇怪,因为柱面在 CX 中没有连续的位范围。


    – 


  • 1
    是的,它只是基于收银台的接近度。控制器接口更重要,请参阅我更新后的答案。


    – 

简短版本:柱面和扇区之所以在寄存器 CX 中以它们原来的方式组合成单个字,是因为 XT 硬盘控制器卡上使用的 Xebec 硬盘控制器芯片组希望以该格式将柱面和扇区原生地作为两个字节,因此最简单的方法是在硬盘 BIOS INT13h 接口上使用完全相同的格式。它与将来可能需要的任何几何转换无关。

IBM PC 5150 BIOS 是在机器仅配备软盘而没有硬盘时开发的。

在第一个 BIOS 版本中,软盘子系统 INT 13h 的输入是 DH 中的磁头号、CH 中的磁道/柱面号以及 CL 中的扇区号。

没有检查这些值是否在范围内,但有记录显示磁头号只有 0 和 1,磁道号从 0 到 39(共 40 条磁道),扇区号从 1 到 8。

第一批硬盘后来出现在 IBM 5160 PC/XT 上,第一批驱动器为 10MB,参数为 306 个柱面、4 个磁头和每个磁道 17 个扇区。XT 硬盘适配器有一个单独的硬盘 BIOS,它挂接 INT 13H 以提供硬盘作为驱动器 80h,并作为其他驱动器的后备,称为主板 BIOS 以处理软盘。但由于 306 不适合 CH 中柱面的 8 位,很明显在这种情况下 CL 和 CH 已经一起用于组合柱面/磁头。XT 驱动器寄存器接口支持 32 个磁头、64 个扇区和 1024 个柱面(基于为它们保留的位)。驱动器控制器寄存器使用磁头号为一个字节的格式,并且柱面高位与扇区号共享。因此,控制器硬件定义了 CX 中组合柱面/扇区的新用途,因为使用相同格式最容易。尽管所有 8 位都保留用于磁头编号,但记录的接口使用 17 个扇区、1024 个柱面和 8 个磁头。

ATA 尚未发明,因为它是随 PC/AT 一起出现的,ATA 代表 AT 附件。BIOS 接口与 XT 相比没有变化,但作为硬件接口,第一个 ATA 版本将驱动器磁头数限制为 16,柱面值限制为 1024(即使为其保留了整个字寄存器),扇区最多可以有 255 个,因为为其保留了整个字节。后来的 ATA 标准扩展到更多柱面,但磁头数没有变化。

硬盘花了数年时间才突破 BIOS 柱面和 ATA 磁头的组合限制 504MiB,并且需要进行 CHS 转换才能呈现少于 1024 个柱面的虚拟几何形状,同时将磁头数量扩展到 16 个以上,即 LBA。

6

  • 嗯,你回答中最重要的一点是 ATA 几何出现得晚于 XT。我最初没有注意到这一点。但所有这些都无法解释为什么 XT 开发人员从扇区号中偷取比特,而扇区号的增长可能性比磁头号大得多。


    – 

  • @Netch XT 硬盘控制器希望扇区和柱面字节以该格式写入。我会将其添加到答案中。


    – 


  • 所以你的意思是这是硬件设计师选择了他们所看到的最简单的方法,但 BIOS 人员避免重新打包这些值?


    – 


  • 1
    @Netch 有点。我的意思是他们使用 Xebec 芯片组作为硬盘控制器,而 Xebec 芯片组需要特定的双字节格式的扇区和柱面数据,然后硬盘 BIOS 使用相同的双字节格式来避免转换/重新打包值。这样移动的数据较少,如果采用其他方式,移动的数据较多。


    – 

  • 1
    @Netch 实际上,这些答案可能没有回答您的问题 – 我只是说 Xebec 控制器使用这种符号来写入 CHS 数据,但为什么使用这种符号仍然未知。Xebec 控制器拥有自己的 Z80 CPU,这使得它成为任何机器的易于适应的硬盘接口,因此 BIOS 和 Z80 代码之间的协议可以是任何东西。也许它已经以相同的形式存在于其他机器中,并且它无需修改即可适应 BIOS 接口,也许 IBM 工程师询问 Xebec 如何最好地适应他们当前的 BIOS API,谁知道呢。


    –