# 第 7 版

Unix 第 7 版于 1979 年 6 月从实验室发布，带来了若干重大改进：支持大型文件系统；不限制用户账户数量；提高了系统的可靠性。Steve Johnson 称第 7 版为“首个可移植的 Unix”。正因为这些改进及其包含的大量新命令，第 7 版产生了巨大影响。以下是若干精选命令：

命令：

* at
* sed
* awk
* tail
* calendar
* tar
* cb
* touch
* cd
* uucp
* cpio
* uux
* cu

系统调用：

* deroff
* ioctl
* expr

子程序：

* malloc
* find
* stdio
* lex
* lint
* string
* m4
* make

游戏：

* backgammon

awk（Aho-Weinberger-Kernighan）、lint（Johnson）、make（Feldman）和 uucp（Lesk）本身就已经足够强大，但第 7 版还包含了更多内容。《第七版程序员手册》已扩展到近 400 页，并配有两本 400 页的补充卷。这一版本的 Unix 配备了完整的 Kernighan 和 Ritchie C 语言编译器；更为复杂的 Bourne shell（sh）；Dick Haight 的 find、cpio 和 expr 命令，以及大量的 include 文件。

然而，第 7 版 Unix 也有一个重大缺陷：其性能比大多数经过“调优”的第 6 版系统更差。用户们开始着手改进这一状况。Bill Joy（在伯克利）改变了 VAX-11/780 文件系统中数据块的大小，他的实现随后由 Jeff Schriebman 于 1980 年 4 月移植到 PDP-11/70（Schriebman 当时已从伯克利加入 UniSoft）。1979 年 12 月，Ed Gould（当时在伯克利）将缓冲区移出了内核地址空间。Joy 改进了 VAX 上的 stdio 库，Tom Ferrin（在加州大学旧金山分校）则将这些改动移植到 PDP-11。Holmdel 的 Tom London 改进了从用户空间到内核空间的输出字符传输。Ferrin 还编写了动态 unibus 分配方案。新南威尔士大学的 John Lions 提出了一种新的目录路径名处理方法，UNSW 也提供了新的进程表搜索代码。RAND 公司 Bruce Borden 提供了 symorder 程序。Ferrin 还重写了 `copyseg()` 和 `clearseg()` 的部分代码。

这一整套改进通过 PDP-11 发行版 2.8.1BSD 提供给了社区，并由 Ferrin 在 1982 年 1 月于加州圣莫尼卡举办的 USENIX 会议上宣布。用户极大地提升了第 7 版的性能。

我详细叙述这些内容，是因为这些对第 7 版的改进来自工业界与学术界，来自美国和澳大利亚，且全部被纳入了后续 BSD 和 AT\&T Unix 的版本中。

第 7 版还催生了多款 Unix 移植版本：32 位实现版本，以及 XENIX2（微软与 Santa Cruz Operation 合作开发的第一个针对 Intel 8086 芯片的 Unix 实现，XENIX1 基于第 6 版）；还包括针对 Z8000 和 68000 芯片的 Unix 实现。Holmdel 版本的 32V 也催生了 3BSD 及其所有后代。

32 位 Unix 的演变由 Steve Johnson 向我叙述。

> 我最早知道的 Unix 移植版本是由两名普林斯顿大学的学生完成的。他们将大量重要的 Unix 命令和操作系统接口——shell 移植到了 IBM 360 系统上，我记得是一个 TSS 系统。他们在那个系统上运行了相当多的 Unix 代码，并且使用了我们的 IBM C 编译器，同时借助我们的技术支持。这项工作非常有吸引力。我们还雇佣了其中一名学生 Tom Lyon 在夏季做实习，他将所有第 6 版的命令移植到了中心的 Amdahl 机器上。
>
> 我记得我们决定移植 Unix 时选择了 Interdata 机器，这段经历很有意思，因为 IBM 曾经愿意免费给我们提供一台 360 机用两年半，但 Dennis 不喜欢 IBM 的通道程序，他试着写过这些程序。

Marc Donner 向我解释道：

> IBM 360 是多处理器系统。输入输出并非直接在 CPU 和设备之间进行，而是由称为“通道”的辅助处理器控制。通道处理器是一种专用引擎，能直接与各种设备通信（通过所谓的“通道程序”，其实就是类似机器码的代码）……它通过写入主内存并向 CPU 发送中断的方式向处理器传输数据；CPU 则用类似的方式向通道发送数据……
>
> 早期，通道较为简单，只有通道命令而非通道程序，但随着设备变得越来越复杂，需要更复杂的处理，通道编程的功能也越来越复杂。
>
> 我认为从未有过适合通道编程的高级编程工具，因此通道编程一直是一项极其晦涩的工作，只有极少数人能够胜任。

回到 Johnson 的叙述：

> IBM 比 Interdata 更能理解我们当时提出的方案。另一个有力竞争者是 DEC 20，那是一台 36 位机器，Dennis 对它的评论是，除非有人发明出 10 轨磁带驱动器，否则他不会移植到 DEC 20。因为将 36 位写入 8 位宽的字节，这个问题对于 Unix 文件系统来说实在超出了它所能处理的范围……
>
> Interdata 是我用过的最后一台真正使用带有穿线钢环（core-steel donuts）的机器。后来 Interdata 被 Perkin-Elmer 收购，接着又卖给了 Concurrent，我想是这样。
>
> 有一天，我们收到了一封来自一个我们从未听说过的地方——澳大利亚伍伦贡的信，说他们已经移植了 Unix 并做了些什么。他们采用了一种相当不同的系统开发方法，更像是一种自顶向下的方式。他们先在现有系统上实现了一个 Unix 系统调用层，然后慢慢地逐步替换内核中的部分，直到它看起来像 Unix 内核。这种方法很有趣，因为它使他们能很快在机器上运行起来。但总体来说，我们完成工作所用的时间差不多。
>
> 我指出，当时伍伦贡大学还非常新。Johnson 笑了。
>
> 他说：“那确实是我收到过最令人震惊的一封信。你简直无法想象。我们以为自己在科学上开辟了新天地，结果一个我们从未听说过的、远在地球另一端的大学写信来说‘我们觉得你们会对我们在做的这件事感兴趣’。”
>
> 关于 Interdata，有一个有趣的小插曲——那台机器有很多问题，其中一些是我遇到过最奇怪的问题，涉及分页硬件。在第六版 Unix 中，常见的错误处理方式是通过返回 -1 作为指针值来表示错误。一个常见的程序错误就是忘了检查这个返回的指针是否为错误值，结果直接使用了这个指针。
>
> 而在 Interdata 上，如果你尝试访问地址为 -1 的字，实际上会触发两个错误：一是对齐错误，因为 -1 不是对齐的；另一个是内存错误，因为访问超出了内存边界。问题是，这两个错误信号间隔几拍时钟，导致微码引擎在处理第一个错误时收到了第二个错误，结果引擎的状态完全紊乱了。它不仅完全丢失了之前的位置，还使接下来几条指令执行错乱，直到自己重新同步。
>
> 这是硬件本身的缺陷。任何用户程序只要把 -1 放进寄存器，就能让它陷入疯狂状态。我们还遇到过这种机器，只有关机再开机才能恢复正常。
>
> 于是 Dennis 和我去找 Interdata 交涉。
>
> 我说：“看，我们整个贝尔系统有上百台机器在用 Unix，还有这些应用软件。你们这儿有台 32 位机器，我们的 Unix 系统需要硬件做几点改动，然后你们就可以大卖 Unix 系统了。”他们说：“不行。”
>
> 于是，Dennis 和我成为那段历史上的第一批人——做过一次 Unix 移植后，决定再也不想做第二次的人。

标注为 1979 年 1 月的第七版 UNIX 程序员手册封面上，没有写上 Dennis 和 Ken 的名字。封面标题是：

> UNIX™ 分时系统

Unix 已经将近十年历史。

有趣的是，那时 Unix 已经进入高中阶段了。1979 年 1 月，Brian Harvey 来到波士顿郊区的林肯 - 萨德伯里区域高中，负责“建立计算机部门”。他说服了校董会通过债券筹资购买设备，还说服了 DEC 给高中大幅度折扣。结果是用 5 万美元买到了价值约 20 万美元的设备。

不过，安装过程中“需要几个地方的计算机科学家共同合作……因为我们的 PDP-11 使用了一种第 7 版原版 Unix 不能支持的磁盘驱动器类型。”Harvey 的 15 岁学生们解决了这个问题以及其他几个难题；他们开始编写实用程序，成为 Unix 社区的一部分，分享他们的软件。Harvey 说：

> 几个月后，我们的系统终于上线了，当时孩子们和我都感到非常激动，因为我们接到了另一个刚购买了 Unix 系统、遇到和我们相同磁盘问题的计算中心的电话。我们能够给他们发送一盘根据他们配置量身定制的启动磁带。从那时起，我们通过 USENIX 贡献了学生编写的软件……
>
> 高中生从 Unix 中受益，原因和成年程序员一样：它的灵活性、能够修改其工作方式的能力，以及支持它的各种工具。

第 7 版带来了比当地糖果店还要多的“好东西”——无论程序员的“商店”在哪里。第 8 版从 BSD 移植了 vi（由 Bill Joy 编写）、curses（Ken Arnold 编写）和 termcap（Joy 编写）。Arnold 的 curses 又是游戏对软件开发影响的一个例子：curses 是一款屏幕处理和优化程序，Arnold 写它是为了让玩 rogue 游戏更方便。顺便一提，Arnold 还写了 fortune 和许多其他有用且有趣的程序。但是尽管第 7 版很有用，它也让人烦恼。不因为代码，完全不是这样。正如 Andy Tanenbaum 所说：

> 当 AT\&T 发布第 7 版时，开始意识到 UNIX 是一个有价值的商业产品，因此它以一种许可证发布了第 7 版，该许可证禁止在课程中研究源代码，以避免危及其作为商业秘密的地位。许多大学因此选择直接放弃 UNIX 的学习，只教授理论知识。\[《操作系统》（1987 年）第 13 页]

Tanenbaum 的解决方案是“从头编写一个新的操作系统，使其与 UNIX 兼容”，但“不含一行 AT\&T 的代码”。Tanenbaum 将其命名为 MINIX。


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://book.bsdcn.org/unix-si-fen-zhi-yi-shi-ji/unix-de-chuan-bo-yu-fa-zhan/17-version_7.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
