Bre*_*ugh 9

不幸的是,这正是当时流行的 CHS 寻址方案的实施和采用方式。这被采纳为 IBM 兼容计算机在用于磁盘访问的 BIOS 中断中的官方约定,解释了为什么该约定一直沿用至今。来自ECMA-107 Standard , Volume and File Structure of Disk Cartridges for Information Interchange(原始ATA-1 规范中也提到了这一点):

6.1.3 逻辑扇区号

卷上的每个扇区都应由逻辑扇区号标识。[...]逻辑扇区编号应按升序分配,从 0 开始,从扇区 1、轨道 00、0 侧开始,继续到轨道 00、1 侧(如果 FDC 可在两侧记录),然后跟踪 01、0 侧等。

此问题已在某些硬盘的规范中解决,其中指出给定的逻辑 CHS地址与物理 CHS 地址位置不同。这在Seagate ATA 接口参考手册中进一步讨论,其中包含以下有趣的叙述:

5.1 逻辑块寻址

[...] 驱动器上的扇区被假定为线性映射,LBA 0 为柱面 0/磁头 0/扇区 1。

[...] 对于所有平移模式,C=0、H=0、S=1 等价于 LBA=0。不可能在所有转换模式下为所有逻辑块地址计算等效的 CHS,因为该公式仅适用于一个方向。这是因为 CHS 寻址无法访问逻辑块寻址可以访问的所有可能扇区的 1/256,因为 CHS 中没有扇区 0。

因此对于逻辑 CHS 寻址,尽管第一个柱面/磁头索引从基于 0 的偏移量开始,并且第一个扇区索引从1开始(例如,最小可能的 CHS 地址是 0/0/1),但这不会改变任何关于该扇区的物理位置。把它想象成磁盘上第一个被称为“扇区 1”的物理扇区,占据 CHS 0/0/1。实际上,大多数编程语言中的“第一个”元素是从 0 开始的,因此CHS 地址 0/0/1 处扇区的逻辑地址为零( 0x00)。

这在逻辑上更有意义(即,“第零”逻辑地址是第一个物理扇区),因为我们可以像任何其他内存设备一样寻址磁盘设备(因为每个扇区都有一个唯一的线性地址来将其映射到物理扇区)扇区),因此为什么 LBA 从零开始是有意义的。实际上,如果我们将 CHS 地址 0/0/1 转换为 LBA,则生成的 LBA 将是0x00000000(这就是为什么在大多数 CHS 到 LBA 计算中从扇区索引中减去 1,以及为什么将 1 添加到 LBA 的索引中的原因)到 CHS 计算)。


har*_*ymc 8

我试图追溯CHS的历史和“从 1 开始”扇区编号的惨败,这给磁盘驱动程序编写者带来了许多麻烦,并导致了LBA 的迅速兴起。

CHS 的历史可以追溯到个人计算机在软盘上运行以及发明 BIOS 时。这是维基百科所说的:

BIOS(基本输入/输出系统)一词由 Gary Kildall 发明,并于 1975 年首次出现在 CP/M 操作系统中,描述了在引导时加载的 CP/M 的机器特定部分,它直接与硬件接口。

对 CP/M BIOS 的研究发现了文档 CP/M 信息档案:BDOS 系统调用,其中扇区号从零开始。结论是:最早的 CHS 模式实际上使用了从零开始的扇区地址

第一台 IBP/PC 首次引入了基于一个的扇区地址。文件 INT 13 - Diskette BIOS Services特别指出:

Most disk BIOS calls use the following parameter scheme:

    AH = function request number
    AL = number of sectors  (1-128 dec.)
    CH = cylinder number  (0-1023 dec.)
    CL = sector number  (1-17 dec.)    <--------!!!
    DH = head number  (0-15 dec.)
    DL = drive number (0=A:, 1=2nd floppy, 80h=drive 0, 81h=drive 1)
    DL = drive number (0=A:, 1=2nd floppy, 80h=C:, 81h=D:)
         Note that some programming references use (0-3) as the
         drive number which represents diskettes only.
    ES:BX = address of user buffer
Run Code Online (Sandbox Code Playgroud)

因此,IBM/PC 通过事实上的 BIOS 实现将扇区编号从零基转换为一基。

在被指派创建 IBM 个人计算机(型号 5150)的十二位 IBM 工程师中,David J. Bradley为其 BIOS 开发了代码。所以他是在所有其他细节中决定磁盘中断参数的人。我们还欠这家伙连同梅尔哈勒曼著名 CTRL+ ALT+ DEL

因此为什么在 CHS 中扇区计数从 1 开始而不是从 0 开始的问题 的答案是:
因为 David J. Bradley 以这种方式对 BIOS 进行了编程

至于他为什么这样做,这个最好由他自己回答。如果我不得不猜测,我会说他将扇区零作为寻址扇区,驱动程序可以通过该扇区验证磁头是否在正确的轨道上。

由于磁盘实际上被设计成不需要这样的机制,并且工程师还没有准备好因为 BIOS 而浪费一个扇区,因此扇区 0 从未出现过。此后,驱动程序编写者需要为所有 BIOS 磁盘调用的扇区地址减一和加一。