FreeBSD 中文社区 2025 第二季度问卷调查
FreeBSD 中文社区(CFC)
VitePress 镜像站QQ 群 787969044视频教程Ⅰ视频教程Ⅱ
  • FreeBSD 从入门到追忆
  • 中文期刊
  • 状态报告
  • 发行说明
  • 手册
  • 网络文章集锦
  • 笔记本支持报告
  • Port 开发者手册
  • 架构手册
  • 开发者手册
  • 中文 man 手册
  • 文章与书籍
  • UNIX 四分之一世纪
  • Unix 痛恨者手册
  • 《Unix 四分之一世纪》翻译项目
  • 前言
  • 致谢
  • 简介
  • 序幕
    • 太空序曲
    • 1969 年夏到 1970 年秋
    • 机械计算和电子计算
    • 操作系统
    • MAC 项目:CTSS 和 Multics
  • 一款系统的诞生
    • PDP-11
    • 1971 年,第 1 版
    • 1971-1973,C 语言和管道
    • 1973,第一篇论文
    • 法律 第一幕
  • 是什么让 UNIX 成为 UNIX?
    • 用户 第一幕
    • 为什么是 Unix
    • 风格和工具
    • PWB 和 MERT
    • 实用工具
  • Unix 的传播与发展
    • 用户 第二幕
    • 伯克利 Unix 第一幕
    • 第 7 版
    • 伯克利 Unix 第二幕
    • 商业 Unix
    • DEC
    • 法律 第二幕
  • Unix 产业
    • /usr/group
    • Sun 和 JAW
    • 标准
  • 现状
    • 互相争斗的 Unix
    • 衍生版本
    • OSF 和 UI
    • VAX 后的伯克利 Unix
    • 法律 第三幕
  • 落幕
    • 结语:Unix 为什么能成功
    • 进一步阅读
    • 人物与术语表
    • 附图
由 GitBook 提供支持
LogoLogo

FreeBSD 中文社区(CFC) 2025

在本页
在GitHub上编辑
导出为 PDF
  1. Unix 的传播与发展

伯克利 Unix 第二幕

1978 年初,Richard Fateman 教授开始寻找一台具有更大地址空间的机器,以便他能继续在 PDP-10 上开始的 Macsyma 项目。Fateman 解释道:

麻省理工学院的 MAC 项目中的程序叫做 MACSYMA。为了区分仅在 PDP-10(以及某种程度上在 Multics 系统上)运行的原始版本和 VAX 版本,我称后者为 VAX/Macsyma,有时缩写为 vaxima。麻省理工随后将 Macsyma 程序及其名称出售给了 Symbolics 公司。此后,所有不在 Symbolics 或其继任者——位于马萨诸塞州阿灵顿的“Macsyma Inc.”直接控制下的版本,都被称为除 Macsyma 之外的其他名称。

  • DOE-Macsyma(DOE 即能源部)

  • Paramax(Paradigm Associates)

  • Maxima(由德克萨斯大学的 Bill Schelter 移植的 Common Lisp 版本)

  • Aljabr(由 Jim O'Dell 制作的 Macintosh 版本)

所有这些衍生版本本质上彼此相似,也与 vaxima 相似,尽管每个支持者都会声称其优越性。

筹集了一份 NSF 资助申请,准备与系里的资金合并使用。最初,VAX 运行的是 DEC 的 VMS 操作系统。

但系里已经习惯了 Unix,Fabry 获得了一份由 John Reiser 和 Tom London 在 Holmdel 的贝尔电话实验室完成的 Unix 32V 版本移植到 VAX 的副本。这个移植项目的负责人是 Charlie Roberts,下面是他讲述的故事:

在 1977 到 1978 年间,DEC 预先发布了 VAX。Dennis、Ken 和 Steve 对 DEC 感到相当疏远。他们觉得自己的工作卖出了很多机器,但 DEC 仍然拒绝支持 Unix,反而继续推进 VMS 这个项目。所以当 DEC 提供给他们一台 VAX 时,他们干脆拒绝了。[Doug Mcllroy 告诉我另一个原因是“VAX 有令人反感的臃肿指令集,充满了与 Ken 和 Dennis 的价值观背道而驰的无关内容。”] 不管怎样,Dennis 和 Steve 正在做 Interdata 的移植,Steve 称它为“Intersnail(慢速蜗牛)”。

于是 DEC 找到了我们在 Holmdel。显然我们是第二梯队。Tom London 和 John Reiser 还有 Ken Swanson 都对此感兴趣,我们在 1978 年初拿到了 VAX。我没有参与任何技术工作,实际上,我花了大量精力和时间去说服管理层让我们做这件事。你看,这不算是研究。但他们还是允许我们花时间去做。大约三个月后,我的小组将第七版 Unix 移植到了 VAX。我们一月拿到机器,四月让它运行起来,八月时真的能用了。到那时,大家都知道我们在做什么。我接到了大约六所大学的电话——布朗大学、加州大学洛杉矶分校、伯克利大学、滑铁卢大学,其他的我记不清了。于是我去找了专利和许可部门的 Roy Lipton 和 Al Arms,讨论如何发布。经过反复磋商,他们决定我们可以把它交给一所大学用于研究用途,Al 会和那所机构签订一份“特别研究协议”。

我在几次会议上见过 Fabry,也曾去过伯克利做过报告,与 Ferrari、Ernmanuel Blum 和 Bill Joy 交谈过。因此,在贝尔电话实验室区域 11 管理层的支持下,我们于 1978 年 10 月或 11 月将 32V 版本送到了伯克利。

Roberts 的管理团队批准了这项工作,他们是 C.C. Cutler、R.W. Lucky 和 W.S. Boyle。1127 部门的管理层——Doug Mcllroy、Sam Morgan 和 Bob Prim——也给予了批准。

正是这个 32V 版本在 1979 年演变成了 3BSD。Kirk McKusick 向 Peter Collinson 讲述了这个故事:

当 Ken 离开回到 Bell Labs 时,他留下一套 Unix 系统。Bill 和 Chuck Haley 接管了这套系统的维护工作。当时他们做了升级,比如升级到第 6 版,并且整合了来自实验室的“50 套 Bug”修复磁带。后来他们又升级到了第 7 版。

Bill 继续专注于工具方面的工作。他对 shell 感到厌倦,从 John Mashey 的 PWB shell 中借鉴了一些想法,开发出了 csh。Bill 也对 ed 感到厌烦,决定开发 ex,这是一个扩展的面向行的编辑器。后来,他们把几台终端从不支持光标定位的 ADM-3 升级到支持光标定位的 ADM-3a。房间里只有两台这种终端,而 Bill 非常喜欢用它们。他开始开发 vi,总是有借口把正在用新终端的人赶走。最初发明 termcap,就是为了让同一款编辑器能在这两种 ADM 终端上运行。

有一个传说讲述了 vi 为什么没有多窗口功能。Bill 当时改写了代码,功能差不多实现了。后来磁盘崩溃了,而备份磁带里的版本没有包含窗口功能。他一直没来得及补上这个功能。

最初的 Berkeley Software Distribution(BSD,伯克利软件发行版,不是 1BSD)包含 Pascal 系统和 ex。Bill 不仅是位非常有才华的程序员,同时也是名出色的市场营销者。他会发表激动人心的演讲,讲这些东西有多棒。比如 Pascal 解释器运行速度只有 C 编译器的十分之一,而且带有错误校正功能,对学生更友好,因为能支持更多学生。他大约卖出了 35 盒 BSD 磁带,所谓卖出就是“以大约 35 美元的价格提供给用户”。[实际价格是 50 美元。] 当时的 BSD 发行版就是 Bill 一个人——他是黑客、接电话的人、录音带操作员,他在标签上写地址,寄出磁带,样样亲为。

2BSD 是随后发布的版本,大约在一年后发布,包含 Pascal 系统、ex、vi 和 csh。Bill 也是单枪匹马完成,并在一年内发出了大约 100 份。

这应该是基于第 7 版的,因为 1978 年我们拿到了 UNIX/32V 的预发行版本。它是第 7 版移植到 VAX 上的版本。它没有分页功能,只是一款传统的基于交换的 Unix 系统运行在 VAX 上。我们拿到的是非常低序号的 VAX-11/780,序列号只有个位数。

Bill 的首要任务是让 32V 在 VAX 上运行。这相当简单,只要你的硬件与发行磁带上的完全一样。没有自动配置的概念。你必须拥有完全相同的设备,不能多也不能少。必须有两块磁盘,并且必须是 RP06。

接下来就是移植工具。我一直在做 Pascal 解释器的一些改进,加了一些功能,补齐了一些不完善的部分。Bill 对我说:“你为什么不把解释器也移植过来呢?”

这个解释器是用汇编语言写的,“其实很简单,操作不多,汇编代码看起来几乎一样。”他演示了几个示例,证明移植很容易。我花了一个月时间做这件事,最后我放弃了汇编语言,用 C 语言重新写了一遍。

另一个问题是 VAX 的内存只有 2MB……当时有很大推动力去真正使用机器上的虚拟内存硬件。Özalp Babaoğlu 和 Domenico Ferrari 设计了一款适用于 VAX 的分页系统。他请 Bill 帮忙启动并运行这个系统,因为那时 Bill 对这个系统已经略知一二。在 1978 年 12 月到 1979 年 1 月的假期期间,他们让 VAX11/780 独立运行,能够启动不同的系统。登录时会显示一个横幅“Virtual VAX Unix”,但系统不可避免地会卡住一段时间。等待大约 5 分钟后,系统会重新启动并显示为 32V。

系统不断地来回切换,但假期结束时他们让它稳定运行,并成为基础系统。

随后 Bill 决定不再发布仅包含工具的版本,转而打包完整系统。他创建了 3BSD 版本。这是一款完整的系统,带有基于虚拟内存的内核和已移植的工具。它是一款完整可启动的系统,磁带开头有启动区,可以直接安装到裸机上。Bill 仍然独自完成所有发布工作。

与此同时,我开始更认真地参与内核相关工作。我记得促使我参与的事件。Bill 当时正试图调试虚拟内存系统的一部分。他随身带着厚厚一叠大约一英寸半厚的内核程序代码清单。他走进来,以他极具热情的风格,把代码清单摔在桌上,翻到某页。他在那页代码上画了圈又圈。“这页代码中某处有一个因竞态条件引起的错误,谁找到我就给 20 美元。”

我之前从未看过内核源码,但我学过操作系统课程,知道竞态条件通常会在上下文切换时出现。我查看代码,发现很标准,只有两个子程序调用出现在这一页。我指着这两个调用问他是否有可能导致上下文切换。“就是它!就是它!”他说完就带着一串纸张冲出房间。在 Bill 的办公室里工作,很难不被他的热情感染。

3BSD 系统发布后受到关注,因为许多大学开始采购 VAX 机器。如果想要使用分页系统,你只能运行 VMS 或 3BSD。很多人想用 Unix,同时也希望利用分页功能。因此,3BSD 在早期 VAX 机器的购买者中非常受欢迎。

这里有个脚注。McKusick 告诉我:“这笔债务多年未还。Bill 后来去了 Sun,成了百万富翁。大约四五年前,UNIX International 成立时,他们想搞点宣传,准备在 UniForum(旧金山,1989 年 1 月)举行一个大型新闻发布会宣布他们的成立。他们决定给 Unix 业内的一些名人颁发行业奖,借此吸引媒体关注。他们提名了那些人——Dennis 和 Bill Joy,你懂的,‘召集惯犯’。不管怎样,我也被加进了名单。在活动之前,他们和我们聊了一些细节。我给他们讲了我怎么加入 Unix 的故事,大家都笑了。但到了颁奖那天,他们先颁给了像 Dennis Ritchie 这样的重要人物,最后轮到我了,他们读了那个故事。Bill 就站在台上拿着他的奖牌。他们说:‘Kirk 报告说他从没拿到过报酬。’我刚走到 Bill Joy 身后,他从口袋掏出一张 50 美元,亮了亮,说:‘这是你的 20 美元本金和利息!’然后我就坐下了。后来我问他,‘Bill,他们事先告诉你会这样吗?’他说,‘一点没告诉我,要是告诉我,我就拿着那张 20 美元了。’”

1980 年,是 Bill Joy 飞到新泽西,和 Steve Bourne 一起把 4BSD 带进了 Bell Labs。Joy 告诉我:“我们一夜之间完成的。决定在晚上 9 点开始,第二天早上人们到办公室就看到一个新的操作系统在运行。真是惊人。”确实如此。

Keith Bostic 整理了一份伯克利 Unix 发展历史的概要,直到 NET 2 版本发布。这是他概要的开头部分。

a) 伯克利早期运行的系统是第 5 版(Version 5,V5)、第六版(V6,大约 1976 年)和第 7 版(V7,大约 1978 年),均来自 Bell Labs。所有系统都运行在 DEC PDP-11 计算机的不同版本上。这些系统在伯克利计算中心和电气工程与计算机科学系不断进行了修改。修改内容包括:

b) Berkeley Pascal 磁带,BSD——大约 1977 年,伯克利为在 PDP-11 上使用第 6 版而编写并发布的软件。

c) 2BSD——大约 1978 年开始由伯克利发布的用于第 6 版、第 7 版的软件。软件和修改内容不时增加,包括 Mail、more、csh、ex 和 vi、Pascal 软件等。2BSD 以不同版本发送给拥有第 6 版、第 7 版许可证的机构。

d) 3BSD,1979 年末——这是首个面向 VAX 的伯克利发行版。它基于 32V,包含伯克利的工具和来自 2BSD 的修改,另外还有由包括 Bill Joy 在内的几位研究生完成的虚拟内存系统。

从 1969 年到第 6 版版本,只有一个解释器,一款名为 Shell 的程序。第四版手册条目(日期为 1973 年 4 月 18 日)长达三页。随着 Bourne shell 在 V7 中和 Joy 的 C shell 在 2BSD 中的加入,程序员有了选择(尽管如果使用的是 System III,则没有选择权)。正如预期的那样,这引发了关于“选哪个?”的争论。在 1980 年代中期,AT&T Bell Labs 的 David Korn 发明了 Korn shell。它于 1986 年被纳入“Experimental Toolchest”,并在 1989 年成为 UNIX 系统实验室的 SVR4 发行版的一部分(版本日期为 1988 年 11 月 16 日)。一般来说,Bourne shell 向上兼容 Korn shell。还有许多其他类型的 shell,但 sh、csh 和 ksh 是最常见的。

Unix 能够运行于多种机器这一事实,引起了国防高级研究计划局(DARPA)的关注。DARPA 关注到他们的多个承包商使用不同的硬件和多种操作系统,而且软件无法互换——软件根本不兼容。DARPA 希望有一个共同的基础,以促进更多的软件互通。McKusick 告诉我,“很明显他们会选择 VAX,问题在于最终是选 VMS 还是 Unix 作为首选操作系统。”他告诉 Collinson:

Bill 设法说服了 DARPA,认为 Unix 是更好的基石,因为它能够迁移到其他系统上,这样他们就不会被困死在 VAX 上。Bob Fabry 负责政治层面的说服,而比尔则负责技术层面。

他们成功获得了 DARPA 的一笔重大合同,用于实现这些性能增强并添加一些其他必要的基础功能。承诺是这些改进会很快推出。因此,4BSD 在 DARPA 资助抵达伯克利后两个月内发布……这是 1980 年晚些时候的事情。

根据 Collinson 的说法,“4BSD 变得流行的原因是因为 VAX-11/750 发布了,而 4BSD 是唯一能在它上面运行的 Unix 系统。”McKusick 继续说道:

DEC 的 Armando Stettner 促成了 Bill 飞到 Maynard 去见一台尚未发布的新 750 机型,代号 Comet。Bill 和 Armando 合作做了一些工作,确保 4BSD 能在这些 Comet 上运行,所以当 4BSD 发布时,大家都知道它能跑在 750 上,尽管伯克利当时还没有这台机器。事实上,后来 750 成为了该系的主力机器,因为你可以花大约 15 万美元买一整组六台。[参与者包括 Bill Joy、Bill Shannon 和 Armando。Armando 的故事在后面章节。]

4.1BSD 是性能的巅峰,可以看作是 4.0BSD 的精细调优版,尤其针对 750 优化。4.1BSD 被带回贝尔实验室,成为第 8、9 和 10 版 Unix 的基础。也是那次在 1983 年 6 月多伦多 USENIX 会议上,Rob Pike 因为伯克利 Unix 使用了 cat -v 功能而严厉批评的版本。(Pike 指责伯克利 Unix 风格差,称其为“癌性增长”,并说“cat -v 被认为是有害的。”过去十年里,代码膨胀更加严重:第 7 版内核只有 40KB,而 Ritchie 告诉我第 10 版内核大约有 150KB。)Armando Stettner 指出,在 4.1BSD 和第 7 版之间选择时,没有人愿意回到第 7 版。

随着 DARPA 资金就位,Fabry 给 Bill 提供了正式员工的薪水。支持人员开始出现,有人负责接电话、制作磁带和处理许可证。Bill 能专注于他想做的事情。项目开始扩展,Bill 雇佣了技术员工,最初是 Michael Toy,后来是 Sam Leffler。

4.1BSD 到 4.2BSD 之间的工作正是 DARPA 介入的原因。他们想要一些关键的改进,比如一个能够利用超过磁盘带宽 5% 的文件系统,以及基于 TCP/IP 的网络系统。

BBN 做了个初步原型,交给了伯克利。Bill 立刻开始改写,因为它在 750 上以 56KB/秒运行以太网时,占用了 CPU 的 100%。对 BBN 来说,这个速度适合主干链路,但对于以太网来说完全不行。Bill 削减了代码,性能提升到了大约 700KB/秒。

当 BBN 带着他们的“完成”版本回来时,Bill 拒绝接受,双方多年为哪个版本进入系统争执不休。最终伯克利版本胜出。[Ritchie 告诉我,当他在 DARPA 委员会时,这确实是个大问题,“每六个月我们都会说,使用 BBN 版本,但 Bill 总是说不。”]

4.2BSD 的第三个重要组成部分应该是款新的虚拟内存系统,支持共享的读写段等功能。

系统里有些功能不是 Bill 觉得应该有的,而是指导委员会强制要求的。比如通过消息传递传递文件描述符就是这样一个例子,Bill 并不认同,但也只好接受。

伯克利在引入 VAX 的同时还发生了另一件事:计算机邮件系统,也就是后来的 sendmail。由于这是由当时还是研究生的 Eric Allman 编写的,我们就让他来讲述这个故事。

Eric Schmidt 一直在做 BerkNet,而 BerkNet 是通过 9600 波特的 tty 线路连接的 —— 它是个批处理系统,类似 uucp —— 那时正是 Bell 与伯克利之间关系有些微妙的时候,所以我们拿不到 uucp。当然我们很快还是得到了。事情的经过通常是这样的:工业界说“哦,我们可不想让大学拿到这个,否则我们可能会失去控制权”;然后大学就自己做出来了,于是工业界就说“哦天哪,我们本来是想让我们这套成为标准的,我们最好还是把它给他们吧”。

BerkNet 在当时是个不错的网络,但它有些小问题,比如主机名都是单个字符。我们曾经觉得 ARPANET 限制最多 255 台主机已经很糟了 —— 而 BerkNet 只能有 26 台!“C”是 cory;“E”是 ernie kovacs;“I”和“J”是 Ingres 的 11/70 和 VAX;计算机中心获得了 A 到 F,分别叫 Unix-A 到 Unix-F,他们当时还自认为这个命名策略很有创意。

所以很多人在办公室里用终端,开始更多使用邮件和服务。我们有这个支持邮件、原始文件复制和更原始远程执行的网络。我说的“原始”是真的很原始,执行一条远程命令大概需要一小时。压力来自系里的教授们(EECS),他们希望接入 ARPANET。我记得那时 ARPANET 还连在 11/40 上,因为接口插不上 11/70。

结果就是我们不想给每个人发帐号,但被迫这样做了。我们必须想办法让 ARPANET 的邮件能通过 BerkNet 发出去,但反过来却不行。你要知道,那时候除了 ARPANET,没人会在邮件里写邮件头。而 ARPANET 使用 RFC822(Request for Comment 是网络界的标准),但也没什么人真正遵守。

那时你有 uucp 进来的邮件传给 ernie kovacs,通过 BerkNet 在 UC 校园内部传的邮件,还有发往 ARPANET 的邮件,这三种邮件格式都不一样。如果你想同时发给 ARPANET 和 uucp 的人,你唯一的办法就是发两次。这显然是个很糟糕的解决方案。

我纠结了很久,一直想不到该怎么解决。有一天我坐在客厅里,当时住在 Glen 街,我对自己说:“这太蠢了,我就把这段临时代码写出来吧。”然后我写着写着,突然发现有些模式可以归纳。那天午后我想明白了配置表应该长什么样。delivermail 的配置表是编译进去的 —— 它会检查字符。如果它看到“@”,就认为是 ARPANET;如果是“!”,那就是 uucp;如果是“:”,那就是 BerkNet。也就是说,每种网络都有它自己的“幻数”……

总之,delivermail 是跟 4.0/4.1 一起发布的。但很快就清楚了,这种配置方式在机器数量越来越多的情况下显得捉襟见肘。

于是我开始着手重写 delivermail,而 Bill Joy 不断嘲讽我。他说:“它根本没在投递邮件,它只是把邮件交给另一个代理。”所以我就把它改名叫 sendmail。sendmail 实际上就是 delivermail 的第二或第三个版本。

ARPANET 起始于 1968 年,来自一小型的研究实验,并在 1969 年交付给 ARPA。它证明了长距离分组交换网络的可行性,并最终发展成美国的主干网络 —— 即今天的互联网,包括 NSFNET 以及其他网络。它也展示了统一协议的必要性。ARPANET 的每个节点使用一种称为“接口消息处理器”(Interface Message Processor,IMP)的通信子网。这些最初是霍尼韦尔的硬件,随后是 BBN 的硬件,使用 BBN 1822 协议(得名于描述该协议的报告编号)与主机通信。最早的主机间协议是 NCP(Network Control Protocol)。

到了 1976 年,人们已经明确地看到将会有大量局域网需要互联,这促使了 TCP/IP 协议的开发。顺便提一下,世界上第一个公共数据网络是 Datapac —— 一个加拿大网络,始于 1976 年。由于 Vint Cerf 和 Robert Kahn 在 1974 年的才智与远见,加上对 BBN 实现协议的资助,以及对伯克利将协议集成入 Unix 软件发行版的资助,DARPA 得以连接约 90% 的研究型大学。

在这过程中,确实存在真正的协同效应:TCP/IP 提供了更强的连接能力,被集成入伯克利 Unix;而 Unix 越来越受欢迎,进一步推动了网络互联。我认为完全可以说,到了 1994 年初我们所看到的全球超过三千万用户组成的 Matrix,不可能在没有 Unix 的情况下出现。至于这些用户中有很大一部分运行的是 MS-DOS、Apple-OS 和 VMS,这并不重要。

当下,Internet 和其他 Matrix 网络提供了很多服务,但真正“关键”的服务只有几个:邮件、文件传输和远程登录是最重要的。而这一切都源自 Unix。

在回到 McKusick 的叙述之前,我先插入 Bostic 年表的剩余部分,以便为读者提供一个不那么发散的视角,来看各个 Berkeley 版本的历史。

e)4BSD,1980 年 10 月 —— 此版本包含性能改进,包括一个用于虚拟内存的更快文件系统、作业控制、可靠信号、自动重启、delivermail 程序,以及 Franz Lisp 系统。

f)4.1BSD,1981 年 6 月 —— 对 4BSD 进行了升级,加入了许多性能改进、新的 VAX 机型支持,以及自动配置功能。

g)4.1a —— 测试版本,包含 TCP/IP 和 socket 接口。它被发往相当多需要联网的 ARPANET 站点。

h)4.1b —— 据我所知,这是一款仅在伯克利内部使用的测试版本。它包含新的“快速文件系统”(Fast File System),通过簇(clustering)技术大幅提升了性能,还加入了新的网络代码。[4.1b 曾在一门研究生操作系统课程中使用,见下文。]

i)4.1c,1982/1983 年 —— 这是介于 4.1BSD 与 4.2BSD 之间的第三个测试版本,发往约 100 个站点。它包含了除新信号机制外的大部分 4.2BSD 新特性。

j)4.2BSD,1983 年 9 月 —— 一次重大的系统修订,引入了网络功能(包括 TCP/IP 与通用框架)、具有新特性的更快文件系统、大幅重新设计的系统接口,以及新的信号机制。

k)4.3BSD,1986 年 6 月 —— 4.3BSD 完善并优化了 4.2BSD 中的诸多特性,性能大为提升。新增特性包括 XNS 网络协议、目录名缓存机制,以及互联网域名服务器。

l)4.3-Tahoe,1988 年 6 月 —— 这是一个中间版本,新增对 CCI Power 6(Tahoe)架构的支持,这是 4BSD 首次支持非 VAX 架构。它还引入了若干内核内部机制,包括内存分配器、内核调试器和磁盘标签(disklabel)支持。TCP 算法经过 Van Jacobson(LBL)的大幅改进。

m)BSD Networking Release 1,1988 年 11 月 —— NET 1 —— 第一个 Networking Release 是当时 Berkeley 系统的一个子集,与 4.3-Tahoe 非常相似。它包含内核中的网络部分源代码与文档、C 库与工具程序,并附带一个可与新版 rlogin(远程登录)协作的登录程序。该版本可在无需任何现有许可证(AT&T 和伯克利)的情况下使用,并通过匿名 FTP 发布。源文件带有伯克利版权声明,并附带允许署名再发布的许可说明。

n)4.3-Reno,1990 年 6 月 —— 这是一个包含多个为 4.4BSD 准备的新特性的测试版本。主要变化包括引入 vnode 框架以支持多文件系统实现、NFS(网络文件系统)实现、网络框架中的诸多改动,以及 OSI 网络协议支持。内核文件、库源代码以及新写或重写的工具程序均附有伯克利版权声明,并包含类似第一版 Networking Release 的署名再发布许可说明。除了 VAX 与 Tahoe 外,4.3-Reno 还支持基于 Motorola 680x0 处理器的 Hewlett-Packard 9000/300 系列机器。

o)BSD Networking Release 2,1991 年 6 月 —— NET 2 —— 第二个 Networking Release 不仅仅包含网络代码。与第一版 Networking Release 一样,它无需任何先前许可证即可使用。该版本包含了超越 4.3-Reno 的当时最新 Berkeley 系统的子集。新特性包括从卡内基·梅隆大学 Mach 系统派生、由犹他大学移植的新虚拟内存系统,以及由 Bill Jolitz 开发的 Intel 386/486 系统移植版。

让我把 4.4 加入这个列表:它于 1993 年 6 月发布。

Kirk 向 Collinson 指出,有些东西是直到最近才实现的。

我们现在已经在 4.4BSD 中实现了 portals,Jan-Simon Pendry 刚刚把它们加了进去(见第 28 章)。此外,mmap 系统调用在最初的架构文档中就已描述,很多其他厂商在实现它方面领先于伯克利。不过我们在 Sun 实现这个功能时确实参与了进来,我们和他们争论了 flags 应该怎么设定、接口应该长什么样。我们可以说在这方面也有一份功劳,尽管是在实现之后才介入的……

Bill 最先着手的是 socket 接口和 TCP/IP 代码。接下来的任务是文件系统。在春季,他草拟了一个设计,采纳了 Mike Powell 在 Cray 上做的一个叫 DEMOS 的系统中的许多内容。

那时我还是一名研究生,我的导师是 Sue Graham。作为研究生,在学期中你应该每周做一半时间的工作,而到了夏天可以全职工作三个月,以便攒够学费交秋季学期的学费。按照惯例,6 月份应该领到四分之三的工资——前两周是兼职,后两周是全职。然而,当月末我拿到工资时,只有四分之一。我以为是工资部门搞错了,没意识到我会在夏天继续留在那儿,因为之前几个夏天我都没在那里。我到处去问到底怎么回事。工资部门把责任推到我导师身上,说她需要提供一个新的拨款号。我去找 Sue,说我需要一个新的拨款号,结果发现她忘了申请她的研究拨款续期了。显然拨款是一定会续的,但会需要几个月时间。在此期间,我整个夏天都拿不到工资。

于是我下楼去找 Bill,因为我知道他刚拿到一笔新的拨款。我问他我是否可以用 DARPA 的拨款在夏天干点事,让我写一篇论文。我们心照不宣地明白,我其实是在写毕业论文。他同意了,并建议我可以试着把他设计的文件系统做个原型。他完全清楚接下来会发生什么,尽管那时我还不知道。

我整个夏天都在用用户空间对磁盘上的原始分区进行访问,完成了 Bill 所设计的文件系统的原型。到秋天时,我有一个小小的演示程序能运行。你可能也猜得到,Bill 建议说“把它放进内核很简单”。于是我就真的这么做了。Bill 又说:“这真的很不错,人们肯定会想用它——但没有 dump、restore、fsck 就没什么用……”就这样一环套一环,18 个月之后,我们做出了 Fast File System(FFS,后来演化为 UFS)。当时这个系统相当复杂,文件系统的代码量增加了三倍……

Sam(Leffler)实际上有网络开发经验,他之前在一家网络公司工作过。他对 socket 接口做出了一些重要修改,使其能够支持高负载的网络环境,例如引入连接排队机制——Bill 原来设计的是串行的。这对于提升代码在高使用压力下的健壮性非常重要。

我们最终的一个测试平台是 ucbvax,当时它是邮件中继和 ARPANET 的 UUCP 联网机器。它的性能本来就比较低,导致有大量处理负载落在这台机器上。看到这台机器上有 50 或 60 个网络连接并不稀奇。现在看起来不算什么,但在当时对系统是极大的考验,不管是文件系统还是网络代码。

[4.2BSD 随后发布了。]

实际上,Bill 在 4.2BSD 发布前不久就离开了伯克利。他把当时的系统带去了 Sun。Sun 的系统最终在官方发布之后升级到了 4.2BSD。Sam 接替了主导工作,完成了 4.2BSD 的最后收尾,并将其正式发布。

这还远不是伯克利故事的全部。让我稍微倒回去一点,让 Sam Leffler 来讲述他的故事。

我当时在克利夫兰的凯斯西储大学。我是在 1975 年入学的。我参加了一个本硕连读项目,原计划三年毕业。我本来要和 Bill Shannon 一起做一个项目:我们打算建立一款 Unix 系统,买硬件并移植系统。是基于 Z8000 之类的东西。但资助方——那些提供所有支持的人——退出了。这把我整惨了,所以我后来去教了一阵书——直到我能找到另一个可以做的课题。所以我一直到 1980 年才毕业,尽管我其实 1979 年就完成了学业。我在 1980 年到了伯克利。但 Bill 早在 [1978 年] 就去了哥伦比亚大学的 USENIX 会议,第二年我们一起去了多伦多。那时候我们正在搞 overlays。在 PDP-11 上做透明 overlay ——那是第 7 版 Unix——我们在多伦多遇到了 Bill Joy,他当时也在做叠加层。我到现在还记得我们当时和他讨论这些东西的情形。我们解决了一些他还没解决的问题,他也带走了我们的那些成果。

后来我和 Shannon 都毕业了。我们做了很多项目。凯斯西储当时试图建立一个校园内的网络。他们非常超前。但那全是政治斗争。委员会和所有系本来都同意买 DEC 的设备,但有个什么董事会成员或者校长之类的人出来说:“你们必须买 Harris 的。”于是我们最终得到了一堆 Harris 的设备。那是你见过的最奇怪的设备。不能运行 Unix 及其他任何东西。那些设备根本就不能用。我们 Shannon 和我当时急切地在找有经费的项目,因为我们得赶紧离开学校。于是我们答应了做这个设备的移植。这是一台非常奇怪的机器。所以他做操作系统,我做编译器和语言支持。我们之间有种近乎乱伦——呃,互利共生的关系。谁也离不开谁,因为我需要操作系统来展示我的编译器,而他需要编译器才能让系统跑起来。

最后你知道,其实 Harris 是一台挺快的机器。但它不支持字节寻址,而且是 24 位字。我们基本上是把一台 PDP-11/70 级别的机器,改造成了带有请求分页的 11/34。我们一直和 Bill(Joy)保持联系,我们的系统甚至比他还先跑起来。

我和 Bill 毕业后,我们俩都在找工作。我们的背景很相似。我只看了两个地方——我想住在波士顿附近,或者加州。所以我去硅谷和 DEC 在 Merrimack 的分部面试。而 DEC 雇了 Bill,所以我就来了加州。

当时在 DEC 的 Armando Stettner 对这个决定提供了不同的视角:

Bill Munson 和我当时只有一个招聘名额。我记得我们在特拉华大学的 USENIX 招聘时,那些人在打排球。虽然我们只有一个名额,但我们都想要 Sam 和 Bill。我们很难做决定,于是就根据排球比赛来判断。我们观察到,这些想找工作的人里,一个很炫酷,另一个是个普通的团队型选手。于是我们决定录用 Shannon,那位团队型选手。Sam 则去了 Sytek。

Shannon 在 DEC 只待了一年多一点:他搬到了硅谷,加入了 Bill Joy 在 Sun Microsystems 的团队。Leffler 在硅谷的一家公司工作了一年左右。但因为他们当时在使用 VAX 系统,Leffler 一直和 Joy 保持联系,他所在的公司成了 4.0 的测试站点。所以当 Joy 失去几名成员且有资金可用时,Leffler“去了伯克利。我开始做 4.0,然后是 4.1 的工作。这就是我怎么来到伯克利的。”

1980 年夏天,伯克利的研究生 John Foderero 写了一个程序,用来检查新邮件是否到达。它会告诉用户“你有新邮件”。当时,Heidi Stettner 在 Evans Hall 工作,尚未开始研究生学习。Heidi 会带着她的狗去上课和办公室。那只狗非常友好,很多学生喜欢在走廊里给它扔球让它去捡。它的照片甚至挂在研究生的公告栏上,照片旁边写着它正在攻读“博士学位”,被戏称为“Ph.Dog”。John 决定把程序以这只狗的名字命名为 Biff。据 Heidi 所说,John 和 Bill Joy 花了很多时间试图为 biff 这个名字找一个解释,最终他们想出了“Be notified if mail arrives”(如果邮件到达则通知)的说法。Biff 于 1993 年 8 月去世,享年 15 岁,曾在一门编译器课上得过 B。Heidi 还说,关于 Biff 朝邮递员吠叫的故事其实是一个荒诞的谣言。

Kirk McKusick 于 1981 年夏天加入该项目。Leffler 从 1981 年秋季开始在伯克利工作,经历了大约六个月的时间,那时 Joy 很少在东湾,但名义上仍是团队成员(1982 年),直到 1983 年 4.2 发布。在此期间,伯克利的 DARPA 合同监督员 Duane Adams 成立了一个“指导委员会”,成员包括伯克利的 Bob Fabry、Bill Joy 和 Sam Leffler;Bolt, Beranek and Newman 的 Alan Nemeth 和 Bob Gurwitz;Dennis Ritchie;斯坦福的 Keith Lantz;MIT 的 Bert Halsted;卡内基梅隆的 Rick Rashid;信息科学研究所的 Dan Lynch;DARPA 的 Adams 和 Bob Baker;以及 UCLA 的 Jerry Popek。自 1984 年起,半年度委员会会议被一系列年度研讨会取代(1988 年前在伯克利举办,1990 年和 1992 年在科罗拉多大学博尔德校区举行)。

Joy 参与了 Gurwitz 早期的 TCP/IP 实现,这让 BBN 感到不满。1981 年,Joy 还参与了进程间通信的实现。Leffler 与他合作,支持多网络协议的同时使用。rcp、rsh、rlogin 和 rwho 纯粹是临时工具,最初出现在 1982 年 4 月的 4.1a 版本中。到 1982 年 6 月,McKusick 实现了他的新型快速文件系统,并将其整合到 4.1a 中。这个系统成为 4.1b,那个夏秋两季被用于操作系统研究生课程。Mike Karels 曾告诉我:

Robert Henry 和 Bob Kridle 后来去了 Mt Xinu,Kirk 以及所有这些实现了部分代码的人都参加了那个操作系统课程。我不确定系统是否真正运行过,但我们确实讨论了很多。当 Joy 离开后,Leffler 接管了责任。但他并没有被任命为 Joy 的职位,因此感到有些被冷落。Leffler 起初只兼职去了 Lucasfilm,以便完成 4.2 的工作,而曾参与过 2.9BSD 发布的 Mike Karels 则接手了这项工作。

4.2BSD 是一次巨大成功,正如 McKusick 所指出的:“在最初的十八个月内,4.2 的发行量超过了之前所有 Berkeley 软件发行版本的总和。”有几个商业操作系统是基于 4.2 的,最著名的是 DEC 的 Ultrix 和 Sun 在 UniSoft 之后的操作系统。尽管如此,4.2BSD 也遭到不少抱怨,Mike Karels 用他的大部分第一年时间对其进行了调优和打磨。

我也让他讲讲他的故事:

我只申请了两个研究生院(生物学方向):伯克利和威斯康星大学。在本科生时,我玩过一点计算机,但不多。我的一门编程课是 PL/I。当我到伯克利时,他们有一个习惯,第一季度会在一个实验室,第二季度会换另一个实验室,然后才选导师……在第二轮实习时,我加入了一个做细菌遗传学的团队。实验室尽头有个组在 PDP-11/40 上运行第 6 版 Unix 做数据采集。看起来挺有意思,我想在做细菌项目的同时,写个小程序。

后来,负责计算机的博士后离开了,而我正好表现出兴趣并写了个程序,所以被安排负责这部分。我们有个计算机科学本科生 Bill Jolitz,负责写软件和维护设备。偶尔我们会弄到新终端和硬盘,我就得学着弄。

后来磁盘崩溃,丢了很多定制的第 6 版软件。那时第 7 版出来了,Bill 正在地质调查局试着移植第 7 版。于是,我们决定不重建第 6 版,直接用第 7 版。如果 Bill 不在或者设备驱动不工作,或者赶期末,我就代替 Bill 操作。大多数时候我都是出于需要学会的。之后,我开始参与后来成为 2.8BSD 的项目,和 Bob Kridle 及很多不认识的人一起工作。

慢慢地,我在学位上的时间越来越少,花在计算机上的时间越来越多。后来计算机系统研究小组有个职位,我从 8 月 1 日开始工作,Sam 在月底开始兼职,然后离开。我想我是在 4.2 发布前两个月加入的(1983 年)。Bill 已经走了,实际上他最后一年几乎没怎么待过。但你知道,大约在我去计算机系统研究小组的前一年,我发表了第一篇论文(关于 vfork,1983 年 1 月 26 日在圣地亚哥的 USENIX 会议上发表)。Sam 走过来对我说:“你为什么不来给我工作?你可以用真机器(意思是 VAX,不是 11/40)工作。”开始用 VAX 既有趣又令人兴奋,调试一台新机器确实有点难度。

VAX 是一台真正的机器,但随着时间推移,也出现了其他真正的机器。

上一页第 7 版下一页商业 Unix

最后更新于7天前

值得一提的是,在这段时间里 ARPANET 正在从 NCP(Network Control Protocol)向 TCP(Transmission Control Protocol)过渡。那是一过程非常痛苦,从 mit-xx 到 mitxx.ARPA 再到 ,整整拖了几年。我很快就意识到,让 sendmail 更容易修改,就更容易跟上这些变化……我现在正在做一次重大的重构,因为 RFC1123 —— “主机要求”……

xx@mit.edu