为什么 CHS 中的扇区号寻址从扇区 1 开始而不是从 0 开始?

为什么 CHS 中的扇区号寻址从扇区 1 开始而不是从 0 开始?

在引入 LBA 之前,为什么 CHS 从 开始0,0,1而不是0,0,0

答案1

不幸的是,这只是当时流行的 CHS 寻址方案的实现和采用方式。这被采纳为 IBM 兼容计算机在用于磁盘访问的 BIOS 中断中的官方约定,这也解释了为什么这个约定一直沿用至今。ECMA-107 标准信息交换用磁盘盒的卷和文件结构(原文中也提到了这一点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,以及为什么在 LBA 到 CHS 计算中将 1 添加到索引中)。

答案2

我曾试图追溯中枢性高血压以及“从 1 开始”扇区编号的混乱,这给磁盘驱动器写入器带来了许多麻烦,并迅速导致了左心室射血分数

CHS 可以追溯到个人计算机使用软盘和 BIOS 发明的时代。这就是维基百科说:

BIOS(基本输入/输出系统)这个术语是由 Gary Kildall 发明的,并于 1975 年首次出现在 CP/M 操作系统中,描述了在启动时加载的 CP/M 中直接与硬件交互的机器特定部分。

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

基于 1 的扇区地址最早是在第一个 IBP/PC 中引入的。文档 INT 13 - 软盘 BIOS 服务具体来说:

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

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

在负责开发 IBM 个人计算机(型号 5150)的 12 名 IBM 工程师中,大卫·布拉德利开发了 BIOS 代码。因此,除了其他细节之外,他还决定了磁盘中断的参数。我们还要感谢他和 Mel Hallerman 共同创造了著名 的CTRL++ 。ALTDEL

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

至于他为什么这样做,这个问题最好由他自己来回答。如果一定要我猜的话,我会说他把零扇区留作寻址扇区,以便驱动程序可以验证磁头是否在正确的轨道上。

由于磁盘的设计实际上并不需要这种机制,而且工程师们也不准备因为 BIOS 而浪费一个扇区,因此扇区零从未存在过。此后,驱动程序编写者需要在所有 BIOS 磁盘调用中对扇区地址进行减一和加一。

答案3

IBM 于 IBM 3740 上制定了第一个软盘规范,其中并未提及为系统保留扇区。为系统保留的唯一扇区是 00 号磁道,它仅存储“数据集标签”,用于标识存储在 01 至 76 号磁道中的信息类型。它明确规定第一个扇区是 SECTOR 1。这不是巧合,而是与计算机编号方式相反的自然编号方式。

我们可以观察到,当人类开始数数时,不是从零开始,而是从一开始。例如,假设一个教室里有 135 名学生。数数的方式是这样的:一、二、三……一百三十四、一百三十五。

其数值表示形式如下:1、2、3、...134、135 到目前为止我们同意,对吗?

现在让我们把不以 0 表示的数字放进去。它看起来像这样:001、002、003、...、015、016、...、099、100、...、133、134、135

这就是发生的事情中枢性高血压0,0,1——0,0,2——0,0,3……

值得注意的是,Excel 工作表中的行或数据库中的自动数字字段以 1 开头而不是以 0 开头,但没有人对此发表任何评论。

David J. Bradley 是否以这种方式安排 BIOS?

是的,但他不在外面。

绝对没有技术原因导致 SECTOR 0 无法使用,除非出于其他原因将其保留并对用户隐藏。原则上,一切都表明这是一个自然编号的问题。

GA21-9152-2 文件编号 3740-00,15
IBM 3740 数据输入系统

第 12 页
磁盘初始化
...每个磁盘包含两个备用磁道,用于替换任何不规则磁道。此外,初始化功能还提供了一种改变软盘上扇区地址顺序的方法。通常,扇区的顺序按数字顺序排列(1、2、3、... 25、26)

第 24 页
软盘上的数据标签
在初始化期间,数据集的数据集标签以磁性方式记录在软盘的索引轨道(轨道 00)上。此标签的主要目的是显示数据集在软盘上的位置

这是 1973 年。它将数据记录在 8 英寸软盘上。IBM PC 5150 诞生于 1981 年 8 月 12 日……我们不能忘记,它们必须与以前的设备保持一定的兼容性。

肯定没有技术原因。

相关内容