第 1 章 历史与标准 (History and Standards)
核心结论
-
UNIX 起源:1969 年 Ken Thompson 在贝尔实验室开发第一版 UNIX;1973 年 Dennis Ritchie 设计 C 语言,UNIX 几乎完全用 C 重写,成为最早用高级语言实现的主流操作系统。
-
UNIX 分支:第七版 (1979) 后分裂为 BSD (Berkeley) 与 System V (AT&T) 两大支;BSD 贡献了 TCP/IP 与 sockets API;System V 集成了 BSD 网络特性。
-
GNU 项目:1984 年 Richard Stallman 启动 GNU,目标是用自由软件重建 UNIX;1985 年成立 FSF;GPL 许可证保障软件自由。
-
Linux 内核:1991 年 Linus Torvalds 在赫尔辛基大学发布 Linux 内核;与 GNU 用户态工具组合形成完整的类 UNIX 系统——「GNU/Linux」才是完整称呼。
-
标准化动机:UNIX 厂商众多(SunOS、AIX、HP-UX、XENIX 等),应用可移植性差;POSIX、SUS、X/Open、LSB 等标准应运而生。
-
Linux 标准:Linux 遵循 POSIX.1-2008 (SUSv4) 的核心;LSB (Linux Standard Base) 进一步定义发行版间的二进制兼容性。
|
本章主旨
本章是全书的导论——理解 UNIX 的演化、GNU/Linux 的诞生、标准化进程。Linux 是 UNIX 家族成员之一,但又是 GNU 项目与 Linux 内核的组合。掌握历史脉络有助于理解「为什么 Linux 系统调用长得像这样」「为什么 SUSv3/v4 标准如此重要」以及「为什么 LSB 解决了发行版兼容性问题」。 |
一、核心概念
本章围绕 6 个核心概念展开:从 UNIX 起源到 GNU/Linux 形成,再到标准化进程。
| 概念 | 定义 + 重要性 | 实现提示 |
|---|---|---|
UNIX 起源 |
1969 年 Thompson 在 PDP-7 上写第一版 UNIX;1973 年用 C 重写成为第一个高级语言实现的主流 OS。 |
§1.1;C 与 UNIX 共同演化,互相塑造。 |
UNIX 分支 (BSD vs System V) |
1979 年后 UNIX 分裂为 BSD (Berkeley) 与 System V (AT&T) 两大支;两者 API 各有差异。 |
§1.1;sockets API 来自 BSD;SysV IPC 来自 System V。 |
GNU 项目与 GPL |
Stallman 1984 启动 GNU;1985 成立 FSF;GPL 许可证保障软件自由(copyleft)。 |
§1.2.1;GCC、glibc、Bash、coreutils 都是 GNU 项目产物。 |
Linux 内核 |
1991 年 Linus Torvalds 在赫尔辛基大学发布;GPL v2 许可证;与 GNU 工具组合形成完整 OS。 |
§1.2.2;与 GNU 用户态的组合 = 完整的类 UNIX 系统。 |
POSIX 与 SUS 标准 |
POSIX.1 (IEEE) 定义 API;SUS (X/Open) 合并 POSIX + 扩展;SUSv3 (2001) → SUSv4 (2008)。 |
§1.3;本书主要参考 SUSv4; |
LSB (Linux Standard Base) |
在 POSIX/SUS 基础上进一步统一 Linux 发行版的二进制接口与文件层次。 |
§1.3.8;保证商业软件能在不同发行版运行。 |
二、详细笔记
2.1 UNIX 与 C 语言的共同演化
What:UNIX 是 1969 年由贝尔实验室开发的操作系统;C 是为重写 UNIX 而设计的语言;两者共同塑造。
Why:理解 UNIX 的设计哲学(「小而美、组合工具、文本流」)和 C 的哲学(「贴近硬件、可移植、程序员友好」),能帮助理解 Linux 系统调用的设计选择。
How:UNIX 关键时间线(§1.1):
-
1969:Ken Thompson 在 PDP-7 写第一版 UNIX;名字是对 MULTICS 的双关。
-
1970:重写为 PDP-11 汇编版。
-
1973:Dennis Ritchie 的 C 成熟,UNIX 内核几乎完全用 C 重写——成为最早用高级语言写的主流 OS(便于移植)。
-
1971-1975:第一至第六版 UNIX;第六版开始在大学分发。
-
1977-1979:Thompson 在 UC Berkeley 教学,BSD 诞生。
-
1983:4.2BSD 包含完整 TCP/IP + sockets API;SunOS 基于 BSD。
-
1983:AT&T 因反垄断被拆分,开始商业化 UNIX;System V 系列诞生;SVR4 (1989) 集成了 BSD 网络特性。
-
1984:Richard Stallman 启动 GNU 项目。
-
1991:Linus Torvalds 发布 Linux 内核(GPL v2)。
-
1992-至今:GNU 用户态工具 + Linux 内核 = 完整的自由 UNIX 系统。
When:理解「为什么 Linux 系统调用长得像这样」——它是 UNIX 哲学 + C 语言哲学的产物。
Example:Linux 的 read/write/open/fork 系统调用与 1970 年代的 UNIX 几乎一致——这是 ABI 稳定性的体现。
2.2 BSD vs System V
What:UNIX 在 1979 年后分裂为 BSD 和 System V 两大分支;各自的 API 风格有差异。
Why:Linux 同时支持两套 API(BSD sockets + SysV IPC),应用程序员需要知道「这是 BSD 风格还是 SysV 风格」。
How:核心差异:
| 特性 | BSD | System V |
|---|---|---|
Sockets API |
✓ 1983 年 BSD 4.2 引入 |
较晚引入 |
IPC(消息队列、信号量、共享内存) |
无原生支持 |
SysV IPC |
终端 API |
termios |
termio(旧) |
进程创建 |
|
同 BSD |
信号 |
|
同 BSD |
调度 |
4.4BSD 引入优先级调度 |
SysV 引入 nice |
When:使用 IPC 时——管道/FIFO 用 POSIX;消息队列/信号量/共享内存可选 POSIX(mq_open/sem_open/shm_open)或 SysV(msgget/semget/shmget),两者 API 风格差异显著。
Example:第 44 章管道(POSIX) vs 第 46-48 章 SysV 消息队列/信号量/共享内存——本书并行介绍两套机制,让读者理解历史脉络。
2.3 GNU 项目与自由软件
What:1984 年 Richard Stallman 启动 GNU(GNU’s Not UNIX)项目,目标是构建一个完整的自由 UNIX 系统;1985 年成立 FSF(Free Software Foundation);GPL(GNU General Public License)是其法律基础。
Why:GNU 项目是 Linux 生态的支柱——GCC、glibc、Bash、coreutils、Make、GDB、Emacs 等核心工具都来自 GNU。没有 GNU,Linux 只是一个内核,不是完整的 OS。
How:GNU 四项基本自由(FSF 定义):
-
自由 0:为任何目的运行程序的自由。
-
自由 1:研究程序如何工作并改写以满足需要的自由(源代码访问是前提)。
-
自由 2:重新分发副本的自由。
-
自由 3:改进程序并向公众发布的自由,使整个社区受益。
GPL 通过 copyleft 机制保障这些自由:派生作品必须同样以 GPL 发布。
When:选择开源许可证时——GPL 强 copyleft(传染性);LGPL(库)、MIT、BSD 是更宽松的许可证。
Example:GCC 编译器是 GPL;Linux 内核是 GPL v2;libc 是 LGPL;许多 BSD 工具是 BSD 许可证。
2.4 Linux 内核的诞生
What:1991 年 8 月,芬兰赫尔辛基大学的 Linus Torvalds 在 Usenet 公告 Linux 内核(最初用于运行 GCC);GPL v2 许可证。
Why:Linux 是 GNU 项目的最后一块拼图——之前 GNU 用户态工具齐备但缺一个自由的内核(Hurd 项目迟迟未成熟)。
How:Linux 关键节点:
-
1991.08:Linus 在 comp.os.minix 公告 v0.01。
-
1992:采用 GPL v2(最初只计划给 Minix 用户学习用,改为 GPL 后引发更多贡献)。
-
1994:v1.0 发布;网络栈加入。
-
1996:v2.0 支持多架构(Sparc、Alpha)。
-
2003:v2.6 采用新的版本号方案,引入 CFS 调度器、Inotify、epoll 等。
-
2011:v3.0 版本号方案;之后每 ~2-3 个月一个版本。
-
至今:由 Linux 基金会协调;数千贡献者;几乎所有超级计算机、Android、云计算都运行 Linux。
When:理解 Linux 内核版本——uname -r 显示如 5.15.0-78-generic;主版本号变更代表 ABI 不兼容(罕见);次版本号偶数为稳定、奇数为开发。
Example:cat /proc/version、uname -a 查看当前内核版本和构建信息。
2.5 POSIX、SUS 与 Linux 标准
What:POSIX(Portable Operating System Interface for Unix)是 IEEE 制定的一系列标准;SUS(Single UNIX Specification)由 The Open Group 维护,合并 POSIX + X/Open 扩展。
Why:标准让应用程序「一次编写,到处运行」;Linux 努力遵循 POSIX.1-2008 + SUSv4,是「类 UNIX」而非「UNIX」商标的原因。
How:UNIX 标准时间线(§1.3):
-
1980s:BSD 与 SysV 互不兼容——业界需要标准。
-
1988:IEEE 启动 POSIX 工作组;最初是 IEEE Std 1003.1-1988(POSIX.1)。
-
1990:X/Open 公司出版《X/Open Portability Guide》。
-
1992:POSIX.1-1990;后来扩展为 POSIX.1a/c(实时)。
-
1995/96:X/Open 与 OSF 合并;推出 SPEC 1170(1170 个 UNIX API 集合)。
-
2001:POSIX.1-2001 + X/Open 合并为 SUSv3。
-
2008:POSIX.1-2008 + SUSv4。
-
2017+:POSIX.1-2017 进一步整合与修订。
Linux 标准:
-
POSIX.1-2008:Linux 内核基本遵循(详见
sysconf/pathconf)。 -
LSB (Linux Standard Base):在 POSIX 之上进一步定义 Linux 发行版的二进制 ABI + 文件系统层次标准(FHS);商业软件可基于 LSB 编译并在任何兼容发行版运行。
-
FHS (Filesystem Hierarchy Standard):定义
/bin/etc/var等目录的标准用途。
When:写可移植 UNIX 程序——使用 POSIX.1 定义的 API;查询实现支持的能力用 sysconf/pathconf/fpathconf。
Example:
// 查询系统支持的最大进程数(POSIX 标准化查询)
long n = sysconf(_SC_CHILD_MAX);
if (n == -1) {
/* _SC_CHILD_MAX 未定义或错误 */
} else {
printf("Max child processes: %ld\n", n);
}
2.6 Linux 作为 UNIX 系统
What:「UNIX」一词有两种含义:(1) 通过 Open Group 认证的商标 UNIX;(2) 看起来像经典 UNIX(Bell Labs、System V、BSD)的系统。Linux 属于第二种。
Why:理解「Linux 不是 UNIX,但遵循 UNIX 哲学」——这解释了为什么 Linux 系统调用与 POSIX/SUS 标准高度一致。
How:Linux 与经典 UNIX 的差异:
-
许可证:Linux 是 GPL v2(自由软件);经典 UNIX 多是商业软件。
-
代码来源:Linux 是从头写的新实现(参考 POSIX/SUS 与 MINIX),不是任何 UNIX 版本的衍生品。
-
厂商:Linux 由社区开发(Linux 基金会协调);经典 UNIX 由单一厂商控制。
-
标准化:Linux 努力遵循 POSIX.1-2008 + LSB,但内核本身持续演进(新系统调用不断加入)。
-
GNU/Linux:严格说,完整的「GNU/Linux 系统」= GNU 用户态工具(glibc、coreutils、Bash)+ Linux 内核。
When:写商业 UNIX 程序迁移到 Linux——大部分 POSIX/SUS API 都可用;少量商业 UNIX 扩展(如 Solaris Zones、AIX WPAR)需要 Linux 替代方案(容器/cgroups)。
Example:man 2 syscalls 查看 Linux 支持的所有系统调用;与 man 3 库函数区分。
三、关键图表
|
非可视化条目(表 / 工具)
|
|
核心标准对照表
|
四、思维导图
mindmap
root((第 1 章 历史与标准))
UNIX 起源
Thompson 1969
C 重写 1973
第七版 1979
分支演化
BSD Berkeley
System V AT&T
POSIX 工作组
GNU 项目
Stallman 1984
FSF 1985
GPL copyleft
GCC glibc Bash
Linux 内核
Torvalds 1991
GPL v2
多架构支持
标准体系
POSIX.1
SUSv3 SUSv4
LSB
FHS
Linux 地位
类UNIX非UNIX
GNU + Linux
LSB 发行版兼容
五、重点与易错点
-
「Linux 不是 UNIX」但「Linux 是类 UNIX 系统」——这是商标 vs 实质的区分;SUSv4 商标 UNIX 与 Linux 是不同的概念。
-
GNU/Linux 才是完整称呼——Linux 只是内核;完整的 OS 包括 GNU 用户态工具(glibc、coreutils、Bash、GCC)。
-
GPL 与 BSD 许可证的区别:GPL 强 copyleft(派生作品必须 GPL);BSD/MIT 宽松(可商用闭源);Linux 内核是 GPL v2,BSD 用户态工具是 BSD 许可证。
-
POSIX.1-2008 = SUSv4——两者本质同一套标准,由 IEEE 与 The Open Group 共同维护;不同组织出版,但内容基本一致。
-
BSD sockets vs SysV IPC:BSD 1983 引入 sockets API;SysV IPC(消息队列、信号量、共享内存)由 AT&T 在 System V 中引入;Linux 同时支持两套。
-
Linux 内核版本号:
uname -r输出如5.15.0;主版本变更罕见;偶数次版本为稳定版(如 2.6、4.19、5.15);CFS 调度器自 2.6.23。 -
「UNIX 时间线」关键年份:1969 起源 / 1973 C 重写 / 1979 BSD+SVR 分裂 / 1983 TCP/IP / 1984 GNU / 1988 POSIX / 1991 Linux / 2001 SUSv3 / 2008 SUSv4。
-
本书主要参考 SUSv4——大多数代码示例符合 SUSv4;少量 Linux 特有扩展会显式标注。
-
LSB 的目标:让商业 Linux 软件「一次编译,到处运行」;LSB 5.0 (2015) 是较新版本;LSB 工作组在 2020 年代活动较少。
-
跨章衔接:第 2 章基本概念 → 解释 UNIX/Linux 的核心抽象(文件、进程、内存、IPC、信号、线程);第 3 章系统编程概念 → 介绍系统调用与库函数的区别、错误处理约定。