> 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.3-bsd-unix-cao-zuo-xi-tong-she-ji-yu-shi-xian/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** 程序解释的配置文件（configuration file）定义。配置文件指明内核应支持的软硬件成分。**config** 程序用配置文件生成一组数据文件和一个 **make** 程序的输入文件，用来编译链接内核装入映像。

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

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

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

图 13.3 VAX 的配置文件样例

```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 中的 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()` 例程创建，发生在指定了 RB\_DUMP 标志的 reboot 系统调用时，或系统遇到不可恢复、未预期的错误时。

`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.3-bsd-unix-cao-zuo-xi-tong-she-ji-yu-shi-xian/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.
