概述
PDP-10是数字设备公司(DEC)于1966年至1983年间生产的一系列36位大型计算机系统,是PDP系列的重要成员。它最初作为DEC对IBM大型机的回应而设计,以其强大的分时操作系统(如TOPS-10、TOPS-20)和灵活的汇编指令集著称,在1970年代至1980年代早期主导了学术机构(如MIT AI Lab、斯坦福AI Lab)和早期研究网络(如ARPANET)的计算环境。PDP-10对计算机科学的发展贡献巨大,孕育了MIT的ITS操作系统、EMACS编辑器、Lisp机器原型以及早期的互联网协议实验,并因与黑客文化的紧密关联而成为传奇。由于硬件成本高昂和32位架构的兴起,PDP-10在1980年代中期逐渐退出历史舞台,但其设计思想影响深远,例如源于TOPS-20的许多功能后来被UNIX和Windows借鉴。
1 历史与发展
1.1 起源:与PDP-6的关系
PDP-10的直接前身是DEC在1964年推出的PDP-6,同样是一台36位机器。PDP-6的设计目标是为大学和科研机构提供高性能的分时计算能力,但其市场表现不佳,仅售出约23台。DEC吸取了PDP-6在成本控制和市场定位上的教训,于1966年启动了PDP-10项目,核心目标是保留PDP-6的36位架构优势,同时大幅降低制造成本并提高可靠性。PDP-10的指令集几乎完全向后兼容PDP-6,但采用了更紧凑的模块化设计和更便宜的集成电路(早期型号使用分立元件,后续转为集成电路),使其在性能和价格之间取得了更好的平衡。因此,PDP-10常被视为PDP-6的“现代化改进版”。
1.2 型号演进
1.2.1 PDP-10 KA10(1968)
KA10是PDP-10的第一个量产型号,于1968年正式发布。它采用分立晶体管逻辑,使用核心内存(core memory),基本配置包括64K字(约288KB)内存,时钟频率约为1MHz。KA10型号支持多达10个终端,运行TOPS-10操作系统。尽管可靠性不如后来的型号,KA10在麻省理工学院(MIT)和斯坦福大学等机构得到早期部署,为后续的软件生态奠定了基础。著名例子是MIT AI Lab的KA10,被称为“AI Lab 1号”,其上运行了ITS操作系统早期版本。
1.2.2 KI10(1970年代早期)
KI10于1970年代初推出,是PDP-10的第二个主要型号。它使用集成电路替代了KA10的大部分分立元件,显著缩小了体积并提高了可靠性。KI10支持最多约16个终端,内存容量扩展到256K字,并引入了更强大的I/O总线(如DF10)。KI10在学术机构中广泛使用,例如斯坦福AI Lab的KI10(名为“SAIL”)成为早期人工智能研究的重要平台。其操作系统主要沿用TOPS-10,同时部分单位尝试运行TENEX。
1.2.3 KL10(1975)
KL10于1975年推出,是PDP-10系列的高端型号。它采用ECL(射极耦合逻辑)电路设计,时钟频率提升到约4MHz,支持最多512K字内存,并支持多达64个终端。KL10首次全面支持虚拟内存(通过硬件分页机制),并成为TOPS-20操作系统的首选平台。它也常用于运行MIT的ITS操作系统。KL10在ARPANET骨干节点中扮演了关键角色,例如BBN的TENEX系统。由于性能强劲且价格高昂(约30万至50万美元),KL10主要服务于大型研究机构。
1.2.4 KS10(1978)——低端“小PDP-10”
KS10于1978年发布,是DEC为低端市场打造的“小PDP-10”。它采用了LSI-11微处理器作为控制单元,并将核心处理器实现为一块大规模集成电路(称为“PDP-10 on a chip”)。KS10的价格大幅降低(约2万美元起),内存上限为256K字,支持约16个终端。KS10主要面向教育和中小企业,运行TOPS-10或TOPS-20的简化版本。由于其低成本,KS10成为爱好者社区和高校计算机实验室的常见配置,著名的文本冒险游戏《Zork》就是在KS10上开发并调试的。
1.2.5 其他变体(KL-10B、1983年左右的V-10计划)
DEC在KL10基础上发展出KL-10B,主要改进了散热和电源系统,并增加对更多内存(最高2兆字)的支持。1983年前后,DEC启动代号“V-10”的计划,旨在设计一种基于定制VLSI芯片的下一代PDP-10。该项目旨在解决成本和性能瓶颈,但进展缓慢,最终因市场对32位系统(如VAX)的追捧而终止,未进入量产阶段。
1.3 停产与后续:从“Jupiter”到兼容机(Foonly、Systems Concepts等)
DEC于1983年正式宣布PDP-10停产,同时推出了后继产品“Jupiter”(即DECsystem-10/20的后续型号)。但Jupiter内部实际基于VAX架构,并非真正的36位机器,因此未被社区视为PDP-10的继承者。在此背景下,一些第三方公司开始生产兼容PDP-10的系统。其中最著名的是Foonly公司,它由前斯坦福AI Lab工程师创立,生产兼容PDP-10的Foonly F-1、F-2和F-4等型号,这些机器曾用于MIT AI Lab和电影特效公司(如“Triple-I”)。另一家公司Systems Concepts也推出了SC-40等兼容产品。此外,部分原DEC工程师组建了“XKL”公司,开发了基于微处理器的TOAD-1和TOAD-2系统,但产量极少。这些兼容机延续了PDP-10的生命,但最终因更廉价的UNIX工作站而淡出市场。
2 硬件架构
2.1 36位字长与指令集
PDP-10采用36位字长,这是对PDP-6传统的继承。36位字长允许每个字容纳6个6位字符(用于六进制编码),或5个7位ASCII字符(少用),或1个定点数(36位整数),或1个浮点数(通常为8位指数+27位尾数,另有单精度36位与双精度72位变体)。这种字长在分时系统中具有优势,能够在一条指令中处理多个字符,提升文本编辑和终端处理的效率。
2.1.1 指令格式与寻址模式
PDP-10的指令固定为36位,基本格式分为:操作码(9位)、寄存器字段(4位)、地址字段(18位),以及一些变体(如间接位、变址位)。地址字段可直接访问64K字的物理内存(前18位地址范围)。寻址模式包括:直接寻址、变址(通过通用寄存器修改地址)、间接寻址(地址字段指向的内存单元中再读取有效地址)。此外,PDP-10还支持“相对寻址”(通过程序计数器偏移)和“立即数”操作。这些模式为汇编编程提供了极大灵活性。
2.1.2 通用寄存器与累加器
PDP-10拥有16个通用寄存器(编号0–15),每个寄存器36位宽。其中寄存器0(称为AC0)在传统PDP-6中被视为累加器,但在PDP-10中所有寄存器均可作累加器使用,这与大多数机器不同。寄存器15通常用作程序计数器(PC),即硬件自动使用它存储指令地址,且可通过指令直接读写。这种设计使PDP-10的汇编编程非常灵活,程序员可以将寄存器视为通用存储单元,同时利用PC寄存器的可读写特性实现精巧的自我修改代码。但这也带来了安全隐患,具体见后续章节。
2.2 内存系统
2.2.1 分页与虚拟内存(早期的PAGE/SEG机制)
PDP-10的早期型号(KA10、KI10)使用简单的物理内存管理,没有硬件分页。KL10及以后引入了硬件分页机制,称为“PAGE/SEG”系统。它将36位虚拟地址分为两部分:段号(segment number,高9位)和页内偏移(page offset,低27位)。段号指向一个段描述表,每个描述包含物理页框号(18位)和存取权限(读/写/执行)。通常一个段为1K字,通过段号可最多映射512个段(共512K字虚拟空间)。这种机制支持在KL10上运行TOPS-20的虚拟内存,每个进程可拥有独立的地址空间。
2.2.2 内存保护与分时的硬件支持
PDP-10提供两级保护:内核模式(executive mode)和用户模式。执行指令(如I/O操作、修改页表)仅在内核模式下允许。内存保护基于分页机制:每个页框设置有读、写、执行位,用户进程只能访问页表中授权给它的页面。此外,PDP-10硬件支持可重入代码和共享页面,多个进程可共享同一物理页面(如系统库)。分时硬件还包含一个可编程的实时时钟,用于时间片轮转调度,以及中断系统支持优先级选择。
2.3 外设与总线
2.3.1 标准I/O总线(DF10、DR11等)
PDP-10的I/O系统基于多个并行总线。最早使用PB(Peripheral Bus),后来演进为DF10(Data Front-end 10)和DR11等总线。DF10是一个高速并行I/O总线,连接CPU和I/O处理机(如PDP-11前端处理器)。DR11是通用数字接口总线,用于连接第三方外设。这些总线支持直接存储器访问(DMA),允许外设高速读写内存。
2.3.2 磁盘、磁带与终端接口
常见的磁盘驱动器包括DEC的RP04、RP06等(容量在14M至67M字之间),使用Movable Head磁盘。磁带驱动采用标准9轨工业磁带。终端接口采用异步串行线(通常为20mA电流环或RS-232),通过DH11、DL11等接口卡支持多路终端。DEC还提供了图形终端(如VT11),用于早期计算机图形学实验。
3 操作系统与软件生态
3.1 主要操作系统
3.1.1 TOPS-10(早期分时系统)
TOPS-10是DEC为PDP-10开发的首个正式分时操作系统,起源于1960年代的“DEC Monitor”并不断改进。它提供多用户交互式会话,支持文件系统(以“UFD”和“SFD”组织目录)、批处理和联机调试。TOPS-10的命令行界面采用了简洁的动词-参数格式,如.R FORTRAN运行Fortran编译器。TOPS-10在1970年代占据主导地位,但缺乏虚拟内存支持,对内存管理较为原始。
3.1.2 TOPS-20(更现代的演进)
TOPS-20由BBN开发的TENEX系统演化而来,DEC于1976年正式推出。TOPS-20引入了虚拟内存、更直观的命令行(基于案例命令,如DIRECTORY列出文件)、壳层(EXEC)支持命令历史记录和别名,以及基于目录的层次化文件系统。TOPS-20被广泛认为是当时最先进的分时操作系统之一,其命令风格和文件系统设计影响了后来的UNIX和VMS。典型例子是@DELETE命令删除文件时提示确认,这一交互性后来被许多系统采纳。TOPS-20主要运行在KL10和KS10上。
3.1.3 ITS(Incompatible Timesharing System,MIT)
ITS是MIT AI Lab和计算机科学实验室独立开发的操作系统,始于1960年代末。ITS的设计哲学强调用户自由、共享资源以及避免对系统的任何限制。它没有文件保护(默认所有文件公开),用户进程可以进行各种底层操作(包括直接写盘)。ITS支持许多创新:实时协作编辑(如“访客”模式)、第一个复杂的文本编辑器TECO和EMACS、交叉引用工具等。ITS成为黑客文化的摇篮,许多著名的软件(如Macsyma、Zork)诞生于此。由于ITS的“不兼容”特性,它无法运行大多数DEC标准的二进制软件,但它的影响超越了其实用范围。
3.1.4 TENEX及其衍生版本(BBN研发)
TENEX由Bolt, Beranek and Newman(BBN)在1970年代初开发,最初运行在PDP-10上,为ARPANET的关键节点提供支持。TENEX率先实现了虚拟内存和分页技术,其设计影响了TOPS-20。TENEX拥有一个名为“EXEC”的命令解析器,并支持网络编程;它也是早期电子邮件系统(如MMDF)的平台。BBN后来发布了TENEX的改进版“TOPS-20”,并授权给DEC。
3.2 编程语言与工具
3.2.1 MACRO-10汇编语言
MACRO-10是PDP-10的标准汇编语言,支持宏指令、条件汇编和高级伪操作。PDP-10的汇编程序员可以通过MACRO-10直接操作寄存器、内存和I/O。该语言高度依赖PDP-10的指令集特性,是编写操作系统和实用程序的主要工具。MACRO-10还包含一个预处理器,允许定义宏和子程序。
3.2.2 高影响力语言:Lisp(MacLisp、Interlisp)、FORTRAN、COBOL
PDP-10是Lisp语言的重要摇篮。MacLisp(MIT)和Interlisp(BBN及Xerox)都在PDP-10上开发并运行。MacLisp是著名的符号代数系统Macsyma的基础;Interlisp则被用于早期人工智能研究。此外,DEC提供了标准的FORTRAN-10和COBOL-10编译器,满足商业和科学计算需求。PDP-10的36位字长特别适合数值计算,36位浮点数的精度高于大多数32位机器。
3.2.3 编辑器:TECO与EMACS的早期渊源
TECO(Text Editor and COrrector)是PDP-10上最早、最强大的文本编辑器之一,以命令驱动和宏扩展著称。MIT的Richard Stallman在TECO的基础上扩展了众多宏,最终整合为EMACS(Editing MACroS)。1976年,Stallman在MIT AI Lab的PDP-10上发布了第一个EMACS版本。EMACS的名字直接来自对TECO宏的扩展——它实际上是一个用TECO宏编写的编辑器框架。EMACS后来移植到其他平台,成为开源社区的旗帜。
3.2.4 调试器与性能工具(DDT、SOS等)
DDT(Dynamic Debugging Technique)是PDP-10上著名的调试器,支持机器指令级断点、单步执行和内存转储。DDT被广泛应用于操作系统和编译器的开发。SOS(Symbolic Operating System Debugger)是一个更高级的调试工具,支持符号名(如函数名)进行调试。TOPS-10和TOPS-20还包含性能监视工具(如PERMON),用于分析系统负载和用户资源占用。
3.3 网络与通信
3.3.1 早期ARPANET接口(IMP连接)
PDP-10是ARPANET首批节点的主要机器之一。通过连接接口信息处理器(IMP),PDP-10(运行TENEX或TOPS-10)成为早期网络中的主机。典型例子是BBN的PDP-10作为ARPANET的网络控制中心,以及MIT的PDP-10用于网络协议测试。DEC为PDP-10提供了专用的接口硬件(如IMP-10板)和软件(NCP、Telnet)。
3.3.2 网络协议:CHAOSnet、TCP/IP实验
MIT AI Lab的PDP-10运行ITS,其内部局域网使用一种称为CHAOSnet的专有协议(类似于以太网的前身)。CHAOSnet提供分组交换和地址解析,并实现了邮件协议(MMDF)和文件传输。另外,在1970年代末,PDP-10成为TCP/IP早期实现的重要平台。BBN的IMP软件中后来包含了TCP/IP支持,MIT的ITS上也实现了TCP/IP栈(称为“IP/TCP”)。这些实验直接推动了互联网核心协议的发展。
3.3.3 邮件、BBS与在线社区(如MIT AI Lab的“AIM”)
PDP-10上的电子邮件系统早期来自TENEX的“Message”程序和ITS的“Mail”。著名的“AIM”(AI Lab Message)是MIT AI Lab在PDP-10上建立的一个公告板系统,允许用户张贴消息、组织讨论。AIM后来演变成Usenet早期的一些节点。此外,PDP-10还承载了“BBS”(如“The PLATO”系统的某些部分,但PLATO多靠主机实现)。PDP-10社区的在线文化形成了早期的网络礼仪和协作精神。
4 文化影响与遗产
4.1 黑客文化发源地
4.1.1 MIT Tech Model Railroad Club与PDP-10的缘分
MIT的Tech Model Railroad Club(TMRC)是早期黑客文化的发源地之一。该俱乐部在1960年代开始使用PDP-1进行铁路控制系统实验,随后引入了PDP-6和PDP-10。TMRC成员如Richard Greenblatt和Stewart Nelson将“hack”这一概念从对铁路模型的技术改进扩展到计算机系统探索。PDP-10成为他们实践“黑客伦理”的载体:信息自由、开放共享以及对系统极限的挑战。
4.1.2 首批黑客伦理与术语(“hack”、“kludge”)
在PDP-10环境中,许多黑客术语得以流行。“hack”指巧妙而富有创造性的程序技巧(非破坏性);“kludge”指粗糙但有效的修复方案;“guru”指精通系统的高手。MIT的“黑客词典”(The Hacker’s Dictionary)最初大量取材于PDP-10社区的用语。这些术语后来影响了整个计算文化。
4.2 著名软件与项目的诞生
4.2.1 EMACS(Richard Stallman)
如前所述,EMACS诞生于MIT AI Lab的PDP-10 ITS系统上。Richard Stallman在1976年合并了TECO宏,发布了第一个EMACS版本。EMACS迅速在PDP-10社区流行,并成为自由软件运动的开端。Stallman后来基于EMACS理念发起了GNU项目。
4.2.2 Lisp机器(Symbolics、LMI的技术前身)
PDP-10上的MacLisp实验直接导致了Lisp机器的构想。MIT AI Lab的“Greenblatt”等人利用PDP-10的硬件经验,设计了一款专门运行Lisp的单用户计算机,即后来的CADR(Lisp机器原型)。1980年代,Symbolics和LMI(Lisp Machines Inc.)公司基于这些设计生产了商用Lisp机器。这些机器在技术上继承了PDP-10的许多特点(如大内存、标签式架构)。
4.2.3 互联网邮件与Usenet早期节点
PDP-10在ARPANET上的邮件系统(如BBN的MMDF)为现代邮件协议奠定了基础。此外,Usenet(1979年诞生)的早期节点中,许多运行着PDP-10(例如加州大学伯克利分校的PDP-10参与了最初的Usenet试验)。PDP-10上的电子邮件和新闻组促进了分布式讨论的普及。
4.3 模拟与复刻
4.3.1 开源模拟器(SIMH、KLH-10)
随着PDP-10实物的消失,模拟器成为延续其遗产的关键。SIMH是一个开源的多系统模拟器,由Bob Supnik开发,支持PDP-10的全系列(KA10、KI10、KL10、KS10)。SIMH能够运行几乎所有原始操作系统(TOPS-10、TOPS-20、ITS)。KLH-10是另一个高效模拟器,专注于KL10的模拟,能够在现代系统上提供近乎实时的体验。这些模拟器允许新一代爱好者体验36位计算环境。
4.3.2 爱好者社区与“Living PDP-10”项目
全世界有一批活跃的爱好者社区,致力于维护和修复真实的PDP-10硬件。例如,“Living PDP-10”项目在美国计算机历史博物馆保留了可运行的KL10系统,定期进行演示。在线论坛(如“DEC PDP-10 mailing list”)交换技术资料和软件归档。这些社区使得PDP-10的精神得以延续。
4.4 对后续系统的影响
4.4.1 TOPS-20对VMS、Unix的交互影响
TOPS-20的许多创新被后来的操作系统借鉴:命令自动补全(通过Control-R或?)、层次化文件系统、进程间通信(网络套接字概念的雏形)、强大的外壳语言(EXEC)。VMS(VAX/VMS)在设计时直接参考了TOPS-20的部分命令和交互方式。Unix社区也吸收了TOPS-20的某些思想,例如BSD Unix中的gtar(来自TOPS-20的备份程序)。技术交流通过ARPANET和员工流动实现。
4.4.2 指令集知识在VLIW/RISC设计中的回响
PDP-10的36位指令集设计(尤其是寄存器–内存架构、间接寻址、多级变址)在后来某些RISC和VLIW项目中受到影响。例如,IBM 801和斯坦福MIPS等研究曾回顾PDP-10的指令并行性(如条件码与跳转分离)。不过,这种影响较为间接,更多是作为“反面教材”:PDP-10的复杂性(如需要大量微代码)促使RISC倡导者追求精简。但PDP-10的灵活性设计仍在学术讨论中被反复提及。
5 已知问题与趣闻
5.1 著名“bug”与硬件故事
5.1.1 KA10的“MULTIPLE ERROR”陷阱
KA10型号存在一个著名硬件bug:当CPU同时触发两个不同优先级的错误(如页面错误与算术溢出)时,它可能进入“MULTIPLE ERROR”状态,导致系统彻底挂起且无法恢复。DEC的硬件手册中描述该状态需要手动重启。MIT的黑客们曾编写专门的监控程序来检测并避免这种“死锁”,例如在ITS中增加额外的错误处理代码。
5.1.2 KS10的时钟漂移与游戏“Zork”的异常
KS10的实时时钟基于类似LSI-11的晶体管振荡器,存在温度敏感型漂移。据《Zork》开发者回忆,早期KS10上的时钟快慢不一,导致游戏内部的计时逻辑(如“移动次数”和“随机事件”触发)在不同机器上表现不同。开发者不得不加入运行时校准,根据实际时钟频率调整随机数种子。《Zork》的某些谜题(如“潮汐洞穴”中的时间循环)就是受此启发而产生的幽默设计。
5.2 幽默命名:为什么叫“DECsystem-10”却常被称作“PDP-10”
DEC在1970年代后期试图重新品牌PDP-10,将其命名为“DECsystem-10”(以及后来的DECsystem-20)。但用户社区和黑客文化固执地使用“PDP-10”,因为“PDP”这一前缀承载了早期黑客机器的声望,且“DECsystem”听起来过于商业化。另一个原因是:真正的PDP-10与后来的DECsystem-10在硬件上完全兼容,但后者通常指代包含TOPS-10软件的整体方案,而“PDP-10”更强调主机本身。这一命名分歧成为计算机历史中的一个趣谈。
5.3 影视与流行文化中的PDP-10(如《战争游戏》中的WOPR?实际不是,但常被误认)
在1983年的电影《战争游戏》(WarGames)中,主角使用的超级计算机“WOPR”是一台没有展示具体外形的虚构机器。许多观众和影评人因影片中出现的终端(类似DEC VT100)以及分时操作环境(具有类似TOPS-20的命令提示符)而猜测WOPR原型是PDP-10。事实上一部分视觉效果由PDP-10终端模拟,但核心计算机是IMB 360/370或Cray的混合,并非PDP-10。尽管如此,PDP-10仍因“WOPR”的关联而在流行文化中留下印记。其他影视中偶尔出现PDP-10的镜头,例如纪录片《黑客:骑士的电脑》(1985)和硅谷早期访谈。