> For the complete documentation index, see [llms.txt](https://book.bsdcn.org/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://book.bsdcn.org/4.3bsd/di-wu-bu-fen-xi-tong-yun-xing/13.5.-xi-tong-qi-dong-xiang-guan-hua-ti.md).

# 13.5 系统启动相关话题

本节讨论与系统启动过程相关的话题。

**内核配置**

组成 4.3BSD 内核的软件由配置文件定义，该配置文件由 **/etc/config** 程序解释。配置文件指明内核应支持的软硬件组件。**config** 程序用配置文件生成一组数据文件和一个 **make** 程序的输入文件，用来编译链接内核装入映像。

图 13.3 展示一台 VAX 计算机的配置文件样例。最重要的 **全局** 配置参数包括：

* 系统运行所在的机器类型：本例为 `vax`。
* 要支持的 CPU 类型。可以指定多种 CPU 类型，系统会尝试支持自举时所用的那一种。本例指定的 CPU 类型是 `VAX780` 和 `VAX750`。
* 系统运行的时区，以及可选的夏令时校正算法。系统通常按协调世界时（UTC）运行；时区和夏令时校正算法由应用程序用来计算本地时刻。图 13.3 中，太平洋标准时区指定为比 UTC 晚 8 小时，并请求标准的夏令时算法（另见 3.5 节）。
* 系统中同时活跃用户数的预期上限。这个值用来计算众多数据结构的大小。

还可以指定附加参数以纳入可选代码。例如，文件系统磁盘配额支持通常不会编入系统；若要强制编译进系统，须指定一行 `options QUOTA`。

```sh
machine          vax
cpu              "VAX780"
cpu              "VAX750"
timezone         8 dst
maxusers         16

config           vmunix        root on hp0

controller       mba0          at nexus ?
controller       uba0          at nexus ?
controller       uba1          at nexus ?
disk             hp0           at mba? drive 0
disk             hp1           at mba? drive 1
controller       hk0           at uba? csr 0177440          vector rkintr
disk             rk0           at hk0 drive 0
device           dz0           at uba? csr 0160120 flags 0xff   vector dzrint dzxint
controller       zs0           at uba? csr 0172520          vector tsintr
device           ts0           at zs0 drive 0
```

**图 13.3 VAX 的配置文件样例**

图 13.3 中的 `config` 规格指明 **/etc/config** 应在文件 **vmunix** 中创建内核装入映像，其根文件系统位于名为 `hp0` 的磁盘驱动器上。配置文件的其余部分描述机器上可能有的硬件设备。带问号的规格充当通配符：例如 `uba?` 表示设备可能出现在配置文件描述的两个 UNIBUS 适配器中的任一个上。

磁盘和磁带按控制器和设备配置。这一划分反映机器上实际的硬件拓扑。`csr` 规格标识控制器寄存器组的基址；`vector` 规格标识设备的中断处理程序（亦即向量）的名字和数目——这些名字实际就是设备驱动中中断服务例程的名字，而这些设备驱动是为支持相应硬件而编写的。

**/etc/config** 用配置文件生成若干输出文件，其中几个会被编译链接进内核的装入映像：

* 一个描述硬件设备拓扑以及机器上可能存在设备的文件
* 一个含汇编语言例程、把硬件中断向量入口连接到配置文件指定的设备驱动中断处理程序的文件
* 一个定义根文件系统及交换调页所用设备的文件
* 若干控制源代码条件编译的小头文件
* 一个供 **make** 程序编译链接内核装入映像所用的文件

配置过程与 **/etc/config** 的完整描述见 \[Leffler & Karels, 1986]。

**系统关闭与自动重启**

4.3BSD 提供若干实用程序来停机与重启，或把系统从多用户运行转到单用户运行。安全停机与重启需要内核支持，这一支持由 `reboot` 系统调用提供。

`reboot` 系统调用是特权调用。单个参数指定系统应如何关闭和重启。该参数是 **boot** 程序最初自举系统时传给系统的标志的超集（见表 13.1）。系统可以停机（通常做法是强制它执行无限循环），也可以重启后转入单用户或多用户运行。此外还有若干控制项，可以强制在重启前生成崩溃转储（见下一小节），也可以禁止把缓冲区高速缓存中的数据写回磁盘（以防缓冲区高速缓存中的信息是错的）。

在多数硬件上，重启需要控制台处理器或监视器的支持。重启操作通常由一条传给控制台处理器的命令发起——这条命令使系统重启，就像有人在控制台终端输入了相应的命令一样。识别到灾难性故障时，控制台处理器也常常自动重启系统。系统在正常运行中识别到不可恢复故障时也会自动重启自己。这类故障称为恐慌（panic），全部由 `panic()` 子例程处理。4.1BSD 是最早能自动从灾难性故障中恢复的 UNIX 系统之一，恢复过程是重启、修复文件系统的损坏，然后恢复正常运行。一些厂商（如 Cray Research）加入了相应设施，可以为活跃进程的状态建立检查点，并在系统重启后自动恢复这些进程的执行。

**系统调试**

4.3BSD 提供多种调试系统故障的设施。最常用的是崩溃转储（crash dump）——灾难性故障发生时内核保存在辅存上的内存副本。崩溃转储由 `doadump()` 例程创建，产生于两种情况：一是 `reboot` 系统调用指定了 `RB_DUMP` 标志，二是系统遇到不可恢复且出乎意料的错误。

`doadump()` 例程先禁用虚拟地址转换，把处理器优先级提到最高值以屏蔽全部设备中断，然后调用 `dumpsys()` 例程把物理内存内容写入辅存。崩溃转储的确切位置可配置，多数系统把它放在主交换分区的尾部。这一操作通过设备驱动的 `dump` 入口点进行。

系统重启、文件系统检查完毕之后，崩溃转储便从它在磁盘上的位置取回。**/etc/savecore** 程序专司此职：它创建一个文件，并把崩溃转储映像复制进去；**savecore** 还会复制初始内核装入映像 **/vmunix** 的一份副本，供调试使用。崩溃转储可用 4.3BSD 的两个调试程序 **adb** 或 **dbx** 检查。这两个程序也可以通过 **/dev/mem** 特殊文件检查和修改运行中的系统。**adb** 在内核调试中的用法另见 \[Leffler & Joy, 1986]。

## 习题

13.1 **boot** 程序的用途是什么？

13.2 机器语言启动程序起什么作用？为什么这个程序要用机器语言编写？

13.3 内核消息缓冲区的用途是什么？

13.4 系统引导时最先启动的三个进程是什么？

13.5 假设 **/boot** 是从控制台介质读入的。请指出除此之外，为把系统引导到单用户模式还必须存在的三个文件。

13.6 内核数据结构为什么在系统引导时定大小，而不是在内核编译时？

13.7 配置文件提供的哪些信息无法在系统引导时确定？

13.8 `reboot` 系统调用使系统停机或重启。给出这个系统调用有用的三条理由。

\*13.9 假设机器没有带电池后备的当日时刻时钟。请提出一种判定当日时刻时钟不正确的方法，并描述一种初始化其当日时刻的办法。你的方法有什么局限？

## 参考文献

Elz, 1984. K. R. Elz, “Resource Controls, Privileges, and Other MUSH,” *USENIX Association Conference Proceedings*, pp. 183–191 (June 1984).

Leffler & Karels, 1986. S. J. Leffler & M. J. Karels, “Building Berkeley UNIX Systems with Config,” pp. 2:1–32 in *UNIX System Manager's Manual, 4.3 Berkeley Software Distribution, Virtual VAX-11 Version*, USENIX Association, Berkeley, CA (1986).

Leffler & Joy, 1986. S. J. Leffler & W. N. Joy, “Using ADB to Debug the UNIX Kernel,” pp. 3:1–11 in *UNIX System Manager's Manual, 4.3 Berkeley Software Distribution, Virtual VAX-11 Version*, USENIX Association, Berkeley, CA (1986).


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

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

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://book.bsdcn.org/4.3bsd/di-wu-bu-fen-xi-tong-yun-xing/13.5.-xi-tong-qi-dong-xiang-guan-hua-ti.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

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.
