本文来自微信公众号“CSDN”(ID:CSDNnews),作者:Michal Necasek,译者:弯月,36氪经授权发布。
距离 1981 年 8 月 IBM 发布 PC 机,已经过去 40 年了。
但早在一年前,也就是 1980 年 8 月,IBM 就已经开始设计 IBM PC 机了。对于 PC 机这样的产品来说,一年的开发周期也未免太短了,特别是对于像 IBM 这样的公司,当时他们的产品开发周期接近五年。紧迫的日程安排决定了 PC 的设计:不能使用定制的芯片,不能使用尚未生产的芯片,没有核心的软件开发,而且最好使用久经考验且熟悉的技术。
在重重限制下,1980 年 8 月 10 日的一叠论文勾勒出了 PC 机的设计。部分设计图如下所示。
图:IBM PC 设计,1980 年 8 月
仔细看看这个设计图,你就会发现尽管 IBM 的 PC 机在 1980 年 8 月~ 1981 年 8 月之间发生了很多变化,但核心组件从未改变:一个机箱,两个软驱,五个 I/O 扩展槽,还有一个可拆卸的键盘;一个英特尔 8088 CPU,带有可选的 8087 FPU,8259A 中断控制器,8237-5 DMA 控制器;主板上安装的内存条,可选的内存条扩展卡;一块显卡,带有独立的显示器,或使用电视。
选择这些特定的芯片并非巧合,原因很明显:IBM System/23 Datamaster。
IBM PC 硬件深受设计团队之前设计的 Datamaster 的影响。Datamaster 于 1981 年 7 月发布,就在 PC 发布前几周,似乎很奇怪。但实际上,Datamaster 的开发始于 1978 年,硬件于 1980 年夏季完成。由于 IBM 选择了 BASIC,因此实现难度加大,导致产品发布被大大推迟。
图:IBM System/23 Datamaster (Model 5322)
Datamaster 使用 8 位英特尔 8085 CPU、8259中断控制器、8237 DMA 控制器以及 8253 可编程定时器。它还使用了与 PC 非常相似的扩展总线。
Datamaster团队了解到,8 位 CPU 的 64K 地址空间不足以处理 IBM 为其设计的任务。因此,Datamaster 使用分页来扩展寻址能力,但如此一来,复杂度就大幅增加了。
考虑到这一点,IBM 希望 PC 的 CPU 具有更大的地址空间。英特尔 8086 或 8088 是合理的选择,虽然 8086 的性能稍微好一点,但他们认为相对于复杂度与成本的增加,这点性能提升不值得。8088提供了一个很好的这种方案,1 MB(在当时来看非常大)的地址空间可以支持 16 位的软件,而且还可以利用更便宜且熟悉的 8 位基础设施。
借助已有的 8086 BASIC(微软)和其他工具,从 8085 移植软件并不困难。此外,IBM 还拥有支持 8085 和8086 开发的英特尔 MDS 开发系统。
考虑到上述情况,相信不难回答诸如“为什么 IBM 不使用摩托罗拉68000”之类的问题。1980 年的时候这款 CPU 还非常稀有,也没有支持 68000 的 BASIC,也没有软件,而且 IBM 并没有这方面的经验。选择 68000 会延迟 PC 的发布,远远超出 IBM 的接受范围。仅此一项就足以放弃 68000 了。
最初的设计要求电源放在 PC 机箱的左侧,需要与扩展卡和内部软盘驱动挤在一起。实际的设计将电源移到了软盘驱动器的背后,为扩展卡留出更多空间。
IBM利用了额外的空间,与 IBM PC 一起发布的扩展卡位于更大的一侧。
Datamaster不仅影响了 PC 的 CPU 以及支持芯片的选择,还强烈影响了 PC 的 62 针 I/O 扩展总线,即后来的 ISA 总线。Datamaster 的影响有多大?看一看下面两张图,你就明白了。
图:IBM Datamaster I/O 扩展(1980年12月)
上图来自1980 年 12 月发布的 IBMDatamaster 服务手册。下图是 1981 年 8 月发布的 IBM PC 技术参考资料中的扩展连接器的示意图。
图:IBM PC I/O 扩展(1981 年8 月)
这张图左右颠倒了(应该是A引脚在左边,B引脚在右边),但显然与前一张图非常相似。原来页面选择位 0-3 巧妙地变成了寻址位 16-19。Datamaster 上具有特殊用途的中断和 DMA 级别在 PC 上是通用的。但仍有一些差异,比如在 Datamaster 上引脚 B20 曾经是DMA 请求 0,但在 PC 上变成了系统时钟信号。由于在 PC 上 DMA 通道 0 专用于 DRAM 刷新,因此 DMA 请求 0 就没有意义了。Datamaster上未使用的引脚 B04 变成了中断请求 2。
这种相似性意味着,Datamaster 现有的扩展卡只需稍作改动就可以在 IBM PC 中使用。这无疑大大加快了开发初始阶段的速度,因为不需要设计全新的软盘控制器或串行适配器。
第一款 IBM PC 系统板支持 16 ~64 KB的内存,64 KB 是那个时代“个人计算机”所能支持的最大内存。此外,还提供了 32/64 KB内存卡,可插入到PC 扩展槽。充分利用这三个卡(实际最大数量,五个扩展槽中有两个是为显卡和软盘控制器准备的),PC 就可以扩展到 256 KB 的内存。
下图展示的原型板是 Mostek MK4232 内存芯片(32K×1),总共有 18 个芯片的空间。最多可以安装 64 KB 内存(两个 32 KB)并具有奇偶校验。
图:IBM PC 原型板(BYTE Magazine)
在当时,低端计算机使用奇偶校验的情况并不多,但 IBM 认为增加的错误检测功能是值得的。
刚开始的时候,1 MB 地址空间被划分为几个区域。顶部为系统固件保留了 128 KB,为其他内存保留了 128 KB,为显示内存保留了 128 KB。剩下 640 KB 可作为系统内存,但这纯粹是理论上的,原本 PC 仅支持 256 KB 的内存。就连 PC/AT也只支持板载的 256 或 512 KB。
PC的内存映射非常合理, 640 KB 的内存限制直到20世纪80年代后期才开始造成不便,远远超过了 PC 的预期设计寿命。那时,问题不在于硬件(286 和 386 处理器),而是软件(DOS)在拖后腿。
如上图所示,最初大家以为 PC 的设计会配备 8 英寸的外部驱动器。但最后并不是这样。但是 PC 存储子系统的其余部分与最初的设计相差无几。
Datamaster使用 8 英寸的驱动器,而 PC 却使用了5¼英寸的驱动器。这种存储媒体使用起来更为方便(不知道你有没有见过 8 英寸软盘,非常大),而且 8 英寸的驱动器与 PC 的外形也不匹配。
Datamaster使用 NEC μPD765 软盘控制器,而且运行良好。IBM 工程师知道如何使用这种控制器,而且他们觉得没必要为 PC 选择不同的控制器。
PC使用扇区大小为 512 字节的软盘,后来这就成了默认配置,而其他大小就成了另类。然而,在1980 ~ 1981 年间,常见的扇区大小为 128 字节、256 字节,乃至 1,024 字节。Datamaster也使用 512 字节的扇区,只不过软盘的第一个磁道使用 128字节的扇区,这种做法在当时很常见。幸运的是,PC 做了一些简化,一律使用 512 字节的扇区。
PC本可以使用 1,024 字节扇区来最大化软盘存储容量,但当时他们根本没有考虑过。有一个问题需要权衡利弊:软盘的每个扇区都需要一定量的管理开销以及额外的闲置区,但同时每个文件往往会在其最后一个扇区中浪费一些未使用的空间。512 字节扇区是一个很好的折中,既可以降低磁盘扇区开销,每个文件也不会浪费太多空间。
PC存储子系统不需要与现有系统兼容,因此可以制定自己的标准。
仔细看一看PC 设计图,你就会发现,最终的 PC 与最初的设计有一个明显的不同:显示硬件。这并非巧合,这也是 PC 与 Datamaster 最大的不同。
Datamaster仅需要显示文本,因此使用了英特尔 8275 CRT 控制器。而 PC 为了显示图形需要选择不同的 CRT 控制器,最终 PC 选择了摩托罗拉 6845。此外,PC 还需要支持电视和专用显示器,而 NTSC 电视的特性决定了 IBM 的CGA 需要做什么。
图:家用 PC 机
最初 PC 的设计要求 80×24 的文本分辨率,与 Datamaster 使用的分辨率相同,也是终端的标准分辨率。但最终 PC 使用了 80×25 分辨率,虽然这在如今非常普遍,但在 1981 年非常罕见。
最初的设计还要求 280×192 的图形分辨率(与 Apple II 相同)。但最后 PC(CGA) 改为使用320×200 图形分辨率。原因可能是“这个值在 NTSC 电视和 16 KB 显存的限制范围内”。
CGA有 16 KB显存(准确来说 16,384 字节)。4 色(每像素 2 位)320×200 分辨率或 2 色 640×200 分辨率正好是16,000 个字节。虽然内存还够多加几行图形,但不够再多显示一行 8x8 的字符了。
纯文本 MDA 同样具有 4 KB(4,096字节)的显存。存储一行文本需要 160 个字节(80 个字符,每个字符带有一个属性字节),因此只能容纳 25 行文本(4,000 个字节的内存),不能再多了。
尽管对于 IBM PC 来说,320×200 分辨率是新设计,但 Commodore 64(几个月后推出)也使用了这个分辨率。在 PC 上,考虑到显存大小和显示硬件,这是显示文本和图形所能支持的最大值了。
PC的物理键盘布局与 Datamaster(Model F 键盘)相同,但键的标签不同,而且键盘不是内置的。Datamaster 使用并口将键盘连接到系统,而 PC 则使用一根长长的螺旋形串口电缆。
图:最初 IBM PC 键盘的布局
最初的 83 键 PC 键盘现在已经不常见了,因为20世纪80年代后期就换成了加强版的101/102 键布局。
请注意,在最初的 PC 键盘上,你需要两只手才能按到 Ctrl-Alt-Del (故意这么设计的),因为 Ctrl 和 Alt 位于键盘的左侧,而 Del 位于右侧。
PC 成功的一个关键因素是技术参考。虽然技术参考不是教程,也没有大量的文字解释,但其中包含完整的 IBM PC 原理图,以及 PC BIOS 的完整列表,而且加了详细的注解。工程师可以找到 IBM 使用的组件的数据表,并确切了解它们在 PC 中的连接方式。或者复刻一个 PC。
IBM 的技术参考也是紧张的开发计划的直接结果。他们没有时间聘请技术作家团队,按照当时IBM 产品风格开发文档。另一方面,发布原理图和 BIOS 源代码非常便捷,而且深受为 IBM PC 开发硬件和软件的工程师的赞赏。
在 20 世纪 80 年代,IBM 系统(包括 Datamaster)几乎只使用 EBCDIC 字符集。正如设计图所示,PC 从一开始就打算使用 ASCII。令人惊讶的是,在开发过程中 ASCII 并没有引发任何重大问题。
PC 开发团队故意采用了与 IBM 其他产品不同的方式。微软 BASIC 使用 ASCII,DOS 使用 ASCII。英特尔 MDS 也使用 ASCII,而 PC BIOS 就是在英特尔 MDS 中开发的。
ASCII/EBCDIC的分歧仅在于,将BIOS列表(ASCII)迁移到 IBM的大型机系统的时候给 PC 开发团队带来了些许不便。
Datamaster 使用中断作为固件入口点,IBM PC 沿用了这种做法。虽然在当时直接调用已知地址是类似的机器上常见的做法,但是因为分页问题 Datamaster 无法直接使用这种方法。
虽然软件中断方法似乎不太自然,但事实证明这种方法非常灵活,很方便“挂载”到现有中断,添加新功能,并“链接”到现有中断处理程序,与面向对象编程中的继承是同一个概念。IBM 使用这种方法来处理 PC/XT 硬盘控制器(在新的 ROM 中为硬盘添加 BIOS INT 13h,并链接到旧的负责软盘访问的 BIOS 服务)和 EGA(使用额外的 ROM 来驱动EGA,但如果额外的ROM不存在,就退而使用系统 BIOS 以获得 CGA/MDA 支持)。
碰巧的是,DOS地选择了相同的软件中断方法来提供系统服务,目的是提高灵活性和可扩展性。
IBM最初的计划是为 PC 提供 ROM BASIC 和CP/M 操作系统,二者是当时个人电脑的标配。微软是 BASIC 供应商,并且已拥有 8086 BASIC,因此 IBM 需要与微软协商 BASIC,并实现微软要求的 OEM 接口。
PC附带一个 32 KB ROM BASIC,被人称为“磁带BASIC”,暗指 BASICROM 只能使用附带的磁带存储。作为 DOS 的一部分,IBM还发布了 Disk BASIC 和 AdvancedBASIC(BASIC.COM 和 BASICA.COM),二者都使用了 ROM BASIC,而且还提供额外的“设备驱动程序”,允许 ROM BASIC 使用软盘存储。
操作系统方面并没有那么顺利。有很多传说和相互矛盾的故事,实际的情况却没人说得清。
最大的谜题是为什么 IBM PC 没有附带 CP/M。有很多传言说 CP/M 的发明者和数字研究老板 Gary Kildall 拒绝与 IBM 高管会面,也有人说他的飞机晚点了,未能参加会议。当然这些都不能当真,因为会议可以改日期。
还有传言称,Gary Kildall 根本没有参与其中,因为当时负责 OEM 谈判的是他的妻子 Dorothy McEwen。这个故事还有一个版本说,她未能与 IBM 高管会面,因为她与惠普另有会议,而且会后直接去度假了。当然这些故事的可信度也不高,原因也一样:会议可以改日期。
我相信真实的情况可能很简单:DRI 没有要销售的产品。1980 年(或 1981 年) CP/M-86 根本不存在。
IBM等不起,只能想其他办法。微软已与 IBM 签约,答应为 PC 提供语言工具(汇编、Pascal、FORTRAN 等),而且还需要一个操作系统,他们知道去哪里找。
DOS的故事有据可查。早在 1979 年,SCP 就开始构建基于8086 的系统,而且他们也需要一个操作系统。当时 8086 的 CP/M 还不存在,而且也不清楚何时上市。于是,Tim Paterson 站了出来,将 QDOS、Quick 和 DirtyOS 组合在一起,并重新命名为 86-DOS,这是类似于CP/M 的产品,可以管理软盘上的文件和启动程序。86-DOS 的主要优点是,能够相对简单地将现有的 8085 CP/M 应用程序移植到 8086,而且大部分工作都可以由机器翻译完成。
微软以非常便宜的价格购买了 86-DOS,将其授权给 IBM,并在20 世纪 80 年代 ~90 年代初期赚了一大笔。
IBM PC 为两个商业帝国奠定了基础,但 IBM 并不是其中之一。
多亏了 IBM PC,DOS 成为了标准的 PC 软件,而微软很乐意将其授权给任何 OEM。多年来,微软从DOS 许可中获取了巨大利润。DRI 曾一度威胁到微软的摇钱树(当时比尔·盖茨非常担心),但在 DRI 真正侵蚀到微软的利益之前,微软成功地法用 Windows 取代了 DOS。
从表面上看,英特尔闯入 x86 帝国纯属偶然。8086 只是应急产品。80286 只是一个很小的更新,而 80386 刚开始的时候是一个看不到出路的项目,在 iAPX 432 失败后,英特尔面临重大的战略问题。PC 迫使英特尔走向了 x86 这条线。
成功需要天时地利人和,缺一不可。
IBM PC 的开发周期非常短,从设计到发布产品仅用了一年的时间。PC 的设计大量借鉴了开发团队在 System/23 Datamaster 积攒的经验。PC 的核心架构与 Datamaster 非常相像,除了 CPU 升级(英特尔 8085 换成了8088 )。另一方面,PC 的 I/O 子系统设定了新的标准,其与 Datamaster 只有一些联系(存储、通信),或者说几乎没有任何联系(显示)。
从硬件(大量重复使用 Datamaster 的设计)到软件(使用已有的第三方软件,没有等待 CP/M-86),紧张的日程安排几乎决定了 PC 设计的所有方面。IBM PC 是一款出现在正确的时间点上的正确的产品,它的成功超出了所有人的预期。
参考链接:
http://www.os2museum.com/wp/the-ibm-pc-41-years-ago/