2011 年,「发现号」航天飞机完成最后一次飞行任务后,被送入史密森尼博物馆。在它的中层甲板航空电子舱里,三台银白色的 AP-101S 计算机仍然嵌在机架上——这些机器在航天飞机服役的 30 年间,控制着发动机、导航着轨道、处理着数千个传感器信号。
大部分人关注的是那些计算机里的 CPU。但 Ken Shirriff 最近把目光投向了 CPU 旁边那个不起眼的铝盒子:I/O 处理器(IOP)。他获得了两块来自 IOP 的电路板,并做了一次彻底的硬件解剖。
我们跟着他的分析,看看这些 1980 年代的电路板到底藏着什么。
两个盒子,一台机器
航天飞机搭载了五台通用计算机(GPC),每台重约 120 磅,由两个铝制盒子组成。右边的盒子是 CPU——一个 32 位处理器,每秒执行 42 万条指令,使用磁芯存储器而非 DRAM 芯片。左边的盒子就是 I/O 处理器,它是 CPU 和航天飞机其余系统之间的桥梁。
IOP 的角色很容易被低估。从名字看,它像是一个简单的输入/输出外设。但实际上,IOP 是一台独立的可编程计算机,而且比主 CPU 更复杂。它管理着 24 条高速数据总线网络,每条网络以每秒 100 万比特的速率连接着航天飞机的各个系统——发动机控制器、CRT 显示器、惯性测量单元、传感器信号调理器。
航天飞机共有 28 条数据总线网络,每台计算机接入其中 24 条。飞行关键系统至少通过两条网络连接,发动机控制器和显示器则连接四条——冗余不是选项,是硬性要求。
板卡的物理形态:「页面」
在 IBM 的术语里,每块电路板被称为「页面」(page)。这个名字可以追溯到 IBM System/4 Pi 系列航空计算机——4π 是立体角的完整球面度数,作为 System/360 的几何双关延伸。Shirriff 获得的两块页面,每块尺寸为 9×3 英寸,比标准 4 Pi 页面宽一英寸。
为什么多一英寸?标准 4 Pi 页面(8 英寸宽)每面可容纳 78 块芯片。IOP 的设计师显然发现空间不够用,将页面拓宽到 9 英寸,每面能塞进 100 块芯片。连接器也从 98 针升级到 120 针,针脚间距从 0.06 英寸压缩到 0.05 英寸。即使以今天的标准看,这种密度仍然令人印象深刻——而且这是 1970 年代中期的产品。
页面的物理结构是双层设计:两块印刷电路板夹着一层金属板。热量通过金属板传导到机箱两侧的热交换器,而非风扇直接吹过板面。这种传导散热在真空环境中是必须的——太空中没有空气对流。
MIA 接口页面:模拟世界的桥接器
第一块页面名叫 MIA(Multiplexer Interface Adapter,多路复用接口适配器),是六块网络接口页面之一。每块 MIA 页面支持四条网络连接,两侧各有一块几乎相同的电路板。
页面最引人注目的是右侧的模拟电路区。一个标着「IBM」的 46 针金色模块占据了视觉中心——这是一个混合模块(hybrid module),在陶瓷基板上用比头发丝还细的键合线连接了晶体管裸片、电阻和电容。它不是真正的集成电路,但在 1970 年代,把一整块模拟电路板缩小到单个模块里,是航天电子小型化的尖端方案。
数字侧的四个大型金色芯片是定制 Motorola 集成电路,分别负责每个网络端口的发送和接收。它们执行的任务包括曼彻斯特编解码、同步信号插入和检测、奇偶校验生成与验证。
曼彻斯特编码的选择是一个有趣的细节。这种编码方案于 1940 年代在曼彻斯特大学发明,每条比特在中间位置有一次电平跳变——0 是「低-高」,1 是「高-低」。这样做的好处是双重的:即使连续发送相同的比特,接收端仍然能靠跳变同步时钟;同时编码后的信号没有直流分量,可以安全地通过变压器耦合。航天飞机的数据总线网络大量使用了这种编码,而同样的方案今天仍然应用于以太网、RFID 标签和遥控器。
页面采用的变压器耦合也值得留意。每对网络线通过小型变压器与电路连接,提供电气隔离、滤除电磁干扰、匹配阻抗——和现代以太网的隔离变压器原理相同,但早了二十多年。
仔细观察板面,细棕色的跳线蜿蜒穿梭在芯片之间——这是手工修补线(bodge wire),用于修复设计错误或现场升级。一块经历过多次返工的飞行硬件,反而比完美无瑕的展品更真实。
PROM 页面:烧熔丝编程的微码存储器
第二块页面存储着 IOP 的微码。这是一块 PROM(可编程只读存储器)页面,上面排列着 36 个白底金盖的芯片。
这些芯片采用的是一种今天几乎绝迹的存储技术:熔丝链 PROM。每个比特位对应一根微型熔丝——熔丝完好代表 0,熔丝烧断代表 1。编程时,用 17 伏脉冲逐位烧毁需要置 1 的熔丝,这是一个不可逆的物理过程。没有紫外线擦除窗口,没有电可擦写单元——烧了就烧了,永久确定。
每块 PROM 芯片存储 512 个 4 比特字。36 块芯片组合起来,每块页面提供 1024 条 72 比特宽的微指令。剩下 512 条微指令存在另一块页面上。芯片上手工标注的编号最高到达 74——Shirriff 推测,最初的连续编号在芯片因软件补丁需要更换时被打乱了,每次更换使用下一个可用编号。
这块 PROM 页面的物理构造也与标准页面不同。它使用的是 DIP(双列直插封装)而非扁平封装,导致芯片密度只有标准页面的约四分之一。PROM 芯片当时只有 DIP 形式供应,设计师不得不接受空间效率的牺牲——这提醒我们,航天级硬件的选型受制于每一个组件的可用封装形式。
一个处理器上的 25 台虚拟计算机
IOP 最不寻常的地方在于它的架构。它由 Peter Kogge 设计——这位并行处理领域的专家后来因 Kogge-Stone 加法器(用于 Pentium 等处理器)而闻名。IOP 实现了一种称为「桶式处理器」(barrel processor)的设计:一台物理处理器轮流执行 25 个虚拟处理器的指令,每个虚拟处理器每次只运行一个时钟周期。
这 25 个虚拟处理器分为两种完全不同的类型,使用两套互不兼容的指令集。24 个 BCE(Bus Control Element,总线控制单元)各自负责一条网络端口,指令集只有传输数据、接收数据、加载超时寄存器、存储状态和等待这几条专用指令——没有算术运算,没有条件分支。第 25 个是 MSC(Master Sequence Controller,主序列控制器),作为「执行者」运行完整的 32 位指令集,管理 BCE 的配置和调度。
一个 16.5 微秒的时间槽被切分为 33 个片段:每个 BCE 占一片,MSC 占八片,剩下一片用于自检。这种设计确保了每条网络端口获得确定且可保证的处理时间——即使某个端口被数据淹没,也不会影响其他端口的响应延迟。
实现这种切换的机制是微码。每一条 MSC 或 BCE 指令被拆解为一系列 72 比特宽的微指令,直接控制物理处理器内部的三个 16 位数据通路和两个 ALU。每个虚拟处理器有独立的寄存器组和微指令地址寄存器。物理处理器在每个周期结束后切换到下一个虚拟处理器的上下文——这是硬件级的多线程,完全绕开了操作系统的软件调度。
这比现代 CPU 的超线程技术早了近三十年。
航天级工程与消费电子的时间差
把这些页面放在 1970 年代的技术坐标系里看,能更清楚地理解其设计决策的分量。
Shirriff 在文章里提到一个对比点:IBM 在 1960 年代就在使用六层印刷电路板和表面贴装元件,而苹果直到 1986 年的 Apple IIGS 才开始广泛使用贴片元件,1987 年的 Macintosh SE 仍然全部采用插件封装。航天计算机的制造工艺领先消费电子约二十年。
但这领先是双向的。到 1980 年代末,AP-101B 已经显得老旧。1991 年,IBM 将 CPU 和 IOP 合并为单个 AP-101S 盒,速度更快、内存更大,总重量减轻了约 300 磅。但即使如此,当航天飞机在 2011 年退役时,它的核心计算机架构仍然停留在 1990 年代初的水平。而同一时期,地面上的手机已经从砖头大小进化到了 iPhone 4S。
航天工程中「成熟技术优先于最新技术」的逻辑在这里体现得淋漓尽致。一片 PROM 熔丝可能比一颗现代闪存更可靠——因为辐射环境下的单粒子翻转无法改变物理熔断的状态。
为什么今天仍然值得研究
Shirriff 这篇文章的价值超越了猎奇。它展示了几个在今天仍然有意义的设计思想。
首先是物理冗余和确定性调度。航天飞机的 24 个网络端口、每条关键系统四重连接、每个虚拟处理器的时间槽保障——这些设计原则在今天的实时系统和分布式系统中仍然是指导性的,只是在消费级产品里被「够用就行」的成本逻辑替代了。
其次是微码作为一种抽象层的优雅性。IOP 的物理处理器和程序员可见的指令集之间隔着一层微码,两套截然不同的指令集(MSC 的全功能指令集和 BCE 的极简 I/O 指令集)运行在同一硬件上。这是硬件/软件协同设计的一个经典案例,在今天的领域专用处理器(DSA)和智能网卡设计中仍然能看见回响。
最后,这也是一次关于物质性的提醒。熔丝 PROM 的工作原理——物理上烧毁一根金属丝来存储一个比特——是一种你能「看见」的计算。在一切都虚拟化、抽象化的今天,面对一块你可以数出每一根跳线、认出每一块 NAND 门芯片的电路板,感受到的是计算机作为一种物理实体的原始魅力。
参考链接:
本文的素材来自公开信息和社区讨论。如果你对这个话题有更深入的一手经验,欢迎指出文中的不足。