目 录
序言 i
0.1 序言 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . i
0.2 为什么选择 BSD? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . iii
0.3 谁需要这本书 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . iii
0.4 关于作者 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . iv
1 FreeBSD 的 make 1
1.1 FreeBSD 的 make . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2 Makefile 布局 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.3 语法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.4 目标 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.5 求值规则 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.6 变量 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.7 命令 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.8 条件语句(#if,#ifndef 等等) . . . . . . . . . . . . . . . . . . . . . . . . 9
1.9 系统 Makefiles,模板以及 .include 指令 . . . . . . . . . . . . . . . . . . . 12
1.10 高级选项 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.11 转换规则(后缀规则) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
1.12 有用的命令行选项 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
1.13 一个最后的例子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2 自举 BSD 20
2.1 自举 BSD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2.2 FreeBSD 的自举过程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2.3 加载器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
2.4 开始内核服务 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
3 进程和内核服务 28
3.1 进程和内核服务 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
3.2 调度 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
3.3 系统进程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
3.4 进程创建和进程 ID 系统 . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.5 子进程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
3.6 运行二进制程序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
4 高级进程控制和信号 39
4.1 高级进程控制和信号 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
4.2 信号 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
4.3 系统调用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
4.4 信号处理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
4.5 信号掩码(阻塞与开启信号) . . . . . . . . . . . . . . . . . . . . . . . . 48
4.6 自定义行为 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
4.7 等待信号 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
4.8 Alarms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
5 基本 I/O 55
5.1 基本输入输出 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
5.2 I/O . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
5.3 文件上锁 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
5.4 为什么用 FLOCK . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
5.5 进程间通信 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
5.6 消息队列 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
5.7 结论 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
6 高级 I/O 68
6.1 高级 I/O 和进程资源 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
6.2 select . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
6.3 poll . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
6.4 kqueue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
6.5 结论 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
7 进程资源和系统限制 81
7.1 进程资源和系统限制 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
7.2 确定系统限制 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
7.3 确定进程资源使用量 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
7.4 小结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
8 FreeBSD 5.x 88
8.1 FreeBSD 5.X . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
8.2 启动布局 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
2
8.3 Devfs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
8.4 a.out . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
8.5 gcc-3.2 工具链 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
8.6 SMPng . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
8.7 内核调度实体 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
8.8 小结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
3
序言
1
0.1 序言
BSD 是一个基于原先 AT&T UNIX 操作系统的一个修改增强版的操作系统家
族。BSD 自己复杂的历史已经被核心内核开发成员 Marshall Kirk McKusick 在
其“Open Source: Voice from the Open Source Revolution”(O’Reilly, 1999)一书中的
短文集中叙述过。它是围绕这个最流行的开源工程之一的历史和技术细节上全面的纵
览。完整的章节可以在线获取。
概括来说,BSD 操作系统要追述到 20 世纪 70 年代末,当时 AT&T 拥有 Unix。
虽然 Unix 是私有的,却可以得到源代码,这鼓舞了用户修改他们自己的系统。其中
一个这样的用户就是加洲伯克利大学的计算机系统研究组。他们的 Unix 版本被称为
伯克利系统发行版(berkeley System Distribution BSD)。任何拥有 Unix 源代码授权
的人都可以通过象征性的费用得到 BSD 磁带。BSD 受到了美国国防部的大力推动,
他们选择 BSD 作为基础来实现 TCP/IP,这后来演变为 Internet。TCP/IP 的源代码
通过 1989 年的网络发行第一版(Net/1)自由传播。
以前,BSD 需要一份 AT&T Unix 系统和源代码授权来编译和运行;但是现
在,BSD 代码几乎完全替代了所有的 Unix OS 子系统,演变为一个独立的操作系
统。一个几乎完整的,没有 AT&T 代码的系统被发行为网络发行版 2. Net/2,发行
于 1991 年,只差 6 个文件就是一个完整的系统并且是自由传播的。一个叫 386/BSD
的发行很快就出现了,它补全了那六个文件。386/BSD 的后续开发非常有限;其他几
个分支很快出现,包括 NetBSD、FreeBSD,都是自由软件,还有商业的 BSDI。
1992 年,AT&T 的 Unix 系统实验室(USL)起诉 BSDI 和加洲大学,宣告 BSDI
和 Net/2 使用了它的私有代码和知识产权。1994 年的判决结果导致一个叫 4.4BSD-
Lite 的 Net/2 修改发行版。所有基于这个版本的工程都免于被 USL 起诉,那时候
USL 属于 Novell。结果,NetBSD、FreeBSD 和 BSDI 都以 4.4BSD-Lite 为基础来开
发他们的系统。在 1995 年又发行一个版本,4.4BSD-Lite release 2,然后 CSRG (计
算机科学研究组)永久性的关闭了。BSD 开发及后期的 CSRG 后来分化为几个不同
的种类。虽然开发模式(一个核心,许多环绕)类似 Linux,各种 BSD 家族分支和各
种 Linux 发行是很不相同的。其中最广为所知的是 FreeBSD、OpenBSD、NetBSD 和
Darwin。他们都在积极的开发中,附加源代码并且所有人都可以自由获取。FreeBSD
1
译者:meilincore@chinaunix