操作系统那些事儿③:Linux——一个大学生“写着玩”的 Kernel,为何改变世界

发布时间:2026/8/7 10:46:59
操作系统那些事儿③:Linux——一个大学生“写着玩”的 Kernel,为何改变世界 如果把操作系统的发展史比作《三国演义》那么本文更像《三国演义》而不是《三国志》。本系列尝试用故事化的方式讲述 Unix、Linux、BSD、GNU、Windows、macOS、Android 等操作系统背后的发展历程。文中的人物、事件和技术演进都尽量参考公开资料但为了让故事更容易理解会适当简化一些历史细节也会加入作者自己的理解。它不是一篇学术论文而是一段程序员视角的技术故事。如果读完之后你产生兴趣愿意继续查阅官方资料那么这篇文章的目的就达到了。引子GNU 几乎什么都有了只差最后一块拼图上一篇我们讲到了 GNU。Richard Stallman 希望创造一套完全自由的 Unix 兼容系统。于是从 1983 年开始GNU 项目陆续开发出了GCC 编译器GDB 调试器Bash ShellEmacs 编辑器C 标准库大量命令行工具。到了 1990 年前后GNU 已经拥有了构成一个操作系统所需的大部分软件。只差一个关键部分Kernel也就是操作系统内核。GNU 自己也在开发内核。它叫GNU Hurd。Hurd 的设计非常先进。它建立在 Mach 微内核之上希望把文件系统、网络、权限管理等功能拆分成多个独立服务。从理论上看这是一套漂亮而有野心的设计。但问题也出在这里它太复杂了。GNU 已经准备好了编译器、Shell 和各种系统工具Hurd 却迟迟无法成为普通用户可以稳定使用的内核。GNU 官方资料也承认到 20 世纪 90 年代初GNU 系统已经基本完成主要缺少的正是一个可用的 Kernel。这就像房子已经盖好了。家具也摆好了。水电线路也接好了。甚至连厨房里的锅都买好了。但是地基还没有完全完工。就在这个时候一位芬兰大学生打开了自己的电脑。他原本并没有打算改变世界。他只是觉得现在用的系统不太顺手。快速图解第一章赫尔辛基的大学生买了一台新电脑故事来到 1991 年。地点芬兰赫尔辛基。当时21 岁的 Linus Torvalds 还是赫尔辛基大学的一名学生。他买了一台新电脑。配置放到今天当然不值一提一颗 Intel 80386 处理器。几兆内存。一块容量不大的硬盘。但在当时80386 是一颗非常有意思的 CPU。它支持32 位运算内存保护分页机制多任务运行。简单来说它已经具备了运行现代操作系统的一些重要基础。Linus 对这台机器很感兴趣。准确地说他对 80386 处理器本身很感兴趣。他想知道CPU 是怎么切换任务的内存分页是怎么工作的程序怎样从用户态进入内核态操作系统又是怎样管理硬件的普通人买新电脑可能先装游戏。程序员买新电脑可能先装开发环境。而 Linus 的想法是要不我自己研究一下操作系统第二章老师写了 Minix学生却觉得还不够Linus 当时接触到了一套叫作 Minix 的操作系统。Minix 由计算机科学家 Andrew Tanenbaum 开发。它是一套类 Unix 系统。但它的主要目的并不是与商业 Unix 竞争而是用来教学。Tanenbaum 编写了一本著名教材《Operating Systems: Design and Implementation》为了让学生真正理解操作系统他不仅在书中介绍理论还配套实现了一套相对小巧、结构清晰的 Minix。学生可以阅读它的源代码。可以研究进程调度内存管理文件系统设备驱动系统调用。对于学习操作系统来说Minix 非常优秀。它像一辆拆掉外壳的教学汽车。发动机、变速箱、传动轴都摆在你面前。老师可以指着它说看这就是操作系统的大致结构。Linus 也使用 Minix。但用着用着他开始觉得不满足。因为 Minix 首先是一套教学系统。为了保持代码简洁、便于讲解它不会为了满足每一种实际需求不断加入复杂功能。而 Linus 想要的是一个更适合自己电脑的系统。尤其是他想更充分地使用 80386 的能力。于是程序员熟悉的一幕出现了。一开始他可能只是想我先写一点代码试试。然后变成再加一个功能应该也不难。接着变成既然都写到这里了要不再做个文件系统最后怎么好像快变成一个操作系统了第三章最开始它甚至不能算完整的操作系统Linux 并不是突然从 Linus 的脑海里完整跳出来的。它最初只是一个很小的实验项目。Linus 先写了一些底层代码用来测试任务切换终端输入输出处理器特性内存管理。最开始这套程序甚至没有真正的文件系统。它也不能运行今天意义上的大量应用程序。更像是一个正在逐渐长出四肢的内核实验。但是在不断开发的过程中它开始具备越来越多的能力。它可以运行两个进程。可以操作终端。可以读取磁盘。后来又开始支持文件系统。再后来Linus 把 Bash 和 GCC 移植了过来。这件事非常关键。因为一个 Kernel 自己其实做不了多少事情。它可以管理 CPU。可以管理内存。可以操作硬件。可以为程序提供系统调用。但是用户不能坐在 Kernel 上面直接工作。你需要 Shell 来输入命令。需要编译器来编译程序。需要命令行工具来管理文件。需要系统库连接应用程序和内核。而这些东西GNU 已经准备了很多年。于是一个奇妙的组合即将出现Linus 写出了 Kernel。GNU 提供了 Kernel 之外的大量系统组件。两条原本彼此独立的河流开始汇合。第四章那封著名的帖子——“我正在做一个免费的操作系统”1991 年 8 月。Linus 在comp.os.minix新闻组里发了一则帖子。大意是他正在为 386/486 电脑开发一套免费的操作系统。这只是一个个人爱好项目。不会像 GNU 那样庞大、专业。从今天回头看这段话很有戏剧性。因为后来Linux 不但变得非常庞大而且成为了软件史上最成功的协作项目之一。但在当时Linus 的确没有一个宏伟的商业计划。没有投资人。没有公司。没有市场部门。也没有一份写着“颠覆全球计算产业”的商业计划书。他只是告诉新闻组里的其他程序员我写了一个东西。你们有没有兴趣看看Linux 的早期历史材料显示Linus 在 1991 年开始开发这个内核并在 Minix 新闻组中公开项目到了 1992 年他回顾这段经历时还提到自己甚至没有正式宣布最初的 0.01 版本因为当时对它并不十分满意。这件事看起来很普通。今天 GitHub 上每天都会出现无数新项目My first operating systemA tiny kernel written for funJust another Unix-like OS绝大部分项目会在几周后停止更新。有些项目会停留在TODO有些则永远卡在Implement memory managementLinux 原本也完全可能成为其中之一。但它没有。因为恰好有一群人也在等待这样的东西。第五章GNU 准备好了柴火Linux 点燃了火堆Linux 出现时GNU 项目已经开发了大量自由软件。例如gcc bash gdb make glibc coreutils这些工具并不是 Linux 出现以后才开始编写的。相反Linux 出现之前它们中的许多已经存在。Linux Kernel 解决了一个问题如何让电脑启动起来管理 CPU、内存和硬件。GNU 工具则解决了另一个问题电脑启动以后用户拿它来做什么当 Linux 与 GNU 软件组合在一起后一个真正可用的自由类 Unix 系统逐渐形成。你可以用 GCC 编译程序。用 Bash 执行命令。用 GNU 工具管理文件。用 Linux Kernel 管理底层硬件。因此在操作系统命名上一直存在一个著名争论。很多人习惯把整个系统简称为Linux。GNU 项目则认为更准确的名字应该是GNU/Linux。因为 Linux 严格来说主要指 Kernel而普通用户使用的完整系统还包含 GNU 提供的大量组件。这个争论持续了很多年。直到今天不同的人仍然有不同习惯。不过如果暂时放下命名争论我们至少可以确认一件事没有 GNU 提供的大量工具早期 Linux 很难迅速成为一个完整系统。没有 Linux KernelGNU 的自由操作系统也可能还要继续等待 Hurd。GNU 官方对这段历史的表述也很明确Linux 出现后填补了 GNU 系统最后一个重要缺口而把这些组件整合成真正可以安装和使用的发行版同样需要大量工作。Linux 和 GNU 并不是谁“吞并”了谁。更像是一个人造好了发动机。另一个团队已经准备好了变速箱、方向盘和车身。当它们装到一起时车终于可以开了。第六章真正改变命运的决定——把代码交给所有人仅仅写出一个 Kernel还不足以改变世界。操作系统的历史上从来不缺少优秀项目。Linux 真正与众不同的地方在于它选择了一种开放协作的道路。Linux 最早采用的许可证并不是 GPL。早期许可证允许人们阅读和修改源代码但对商业分发有所限制。后来Linus 决定把 Linux 改为 GNU GPL 许可证。这个决定非常重要。GPL 允许任何人使用代码阅读代码修改代码重新发布代码。但如果你发布修改后的版本也必须按照 GPL 的要求提供相应源代码。这意味着公司可以使用 Linux。大学可以研究 Linux。个人可以修改 Linux。硬件厂商也可以为 Linux 添加驱动。但是任何人都很难把整个项目拿走改成一个完全封闭、其他贡献者再也看不到代码的私有版本。从商业角度看这似乎很奇怪。你写了这么多代码。为什么不把它藏起来卖钱但从生态角度看它产生了一个非常强大的效果每个人都可以在 Linux 上增加自己需要的东西。同时这些改进又有机会回到整个社区。有人添加网卡驱动。有人支持新的文件系统。有人改进内存管理。有人移植新的 CPU 架构。有人修复一个极其隐蔽的 Bug。有人只是发现我的声卡怎么没有声音然后顺着这个问题提交了人生中的第一个补丁。Linux 不再只是 Linus 一个人的项目。它开始成为全世界程序员共同维护的 Kernel。Kernel.org 对 Linux 的介绍也强调它是 Linus 从头编写、后来由互联网上松散协作的开发者共同参与的 Unix-like KernelLinux 内核文档则将其称为规模最大、最活跃的自由软件项目之一。第七章互联网成了 Linux 最大的办公室Linux 的诞生时间非常特殊。如果它早十年出现可能很难发展得这么快。因为那时候互联网还没有广泛普及。程序员之间交换代码可能需要邮寄磁带。沟通一次问题可能要等待很长时间。如果 Linux 晚十年出现它又可能面对已经更加成熟和封闭的软件生态。但 1991 年前后互联网和新闻组正好开始连接越来越多的大学、研究机构和程序员。于是Linux 找到了一个前所未有的开发模式。开发者不需要坐在同一间办公室。他们可能来自芬兰美国德国英国日本澳大利亚。他们甚至从未见过面。沟通方式也很朴素邮件。新闻组。补丁文件。代码压缩包。有人发现问题就发一封邮件。有人写好补丁就把 diff 发出去。有人不同意就开始讨论。有时是技术讨论。有时也会变成争吵。但代码仍在不断前进。传统软件项目通常是公司 ↓ 项目经理 ↓ 开发团队 ↓ 产品Linux 则更像全世界的用户 ↓ 发现问题 ↓ 提交代码 ↓ 社区评审 ↓ 进入 Kernel当然今天 Linux 的开发流程已经非常成熟。有子系统维护者。有代码评审。有合并窗口。有候选版本。有稳定版本维护者。Linus 也不可能亲自阅读和选择每一行进入 Kernel 的代码。Linux 内核文档曾以一个版本为例说明数千个补丁进入内核时真正由 Linus 直接选择的只占很小一部分绝大多数工作由各级维护者完成。但它最核心的协作方式并没有改变把问题交给最懂这个问题的人。某家公司的工程师最懂自家的网卡。某个文件系统团队最懂自己的存储设计。某位开发者可能只关注调度器中的一个角落。每个人贡献一小块。最后这些代码组成了世界上最复杂的软件系统之一。第八章发行版出现了——Kernel 终于穿上了衣服Linux 只是 Kernel。普通用户不可能下载一份 Kernel 源代码然后对着电脑说好了现在请给我一个桌面。一个完整系统还需要安装程序软件包管理器系统工具网络配置桌面环境应用程序更新机制。于是Linux 发行版出现了。早期出现过很多发行版。后来一些名字逐渐成为 Linux 历史的重要部分SlackwareDebianRed HatSUSE。再后来又出现了UbuntuFedoraArch LinuxLinux MintCentOSopenSUSE。发行版做的事情有点像组装电脑。Linux Kernel 是核心部件。GNU 工具提供大量基础能力。桌面环境负责图形界面。软件仓库提供应用程序。发行版则把它们整合起来并回答这些问题默认使用什么软件软件怎样安装系统怎样升级配置文件放在哪里出现安全漏洞后由谁提供补丁因此Ubuntu 不是一个“不同于 Linux 的 Kernel”。Fedora 也不是重新发明了一套 Kernel。它们大多使用 Linux Kernel再搭配各自选择的软件、工具和管理方式。这也解释了一个很多 Linux 新用户都会产生的疑问Linux 为什么有这么多版本因为 Linux 不是一家公司的单一商品。它更像一套公共基础设施。不同团队都可以在它上面建造自己的城市。Debian 强调自由软件与社区治理。Red Hat 面向企业市场。Ubuntu 希望降低桌面和服务器的使用门槛。Arch Linux 强调简洁、透明和用户自主配置。它们使用相似的 Kernel。但拥有不同的性格。第九章Linux 没有统治桌面却统治了看不见的世界Linux 发展起来以后很多人曾经期待Linux 桌面很快就会击败 Windows。这件事并没有完全发生。至少在普通个人电脑市场Windows 长期占据主导地位。macOS 也拥有自己的稳定用户群体。Linux 桌面虽然不断进步但始终没有在普通消费市场占据绝对优势。于是有些人得出结论Linux 没有成功。但如果只盯着桌面就会错过 Linux 真正改变世界的地方。当你打开一个网站时后面的服务器很可能运行 Linux。当你使用云计算时云平台的大量基础设施很可能运行 Linux。当你启动一台 Kubernetes Node 时底层通常也是 Linux。当你使用路由器、NAS、智能电视时里面可能藏着一个 Linux Kernel。当你使用 Android 手机时它的底层同样使用 Linux Kernel。当科学家运行超级计算机时Linux 也是最重要的平台。Linux 官方文档对它的描述早已不再局限于 PC从小型设备、桌面电脑到大型超级计算机各类系统都在运行 Linux。Linux 没有以一个统一桌面产品的形式走进所有人的视线。它选择了另一种方式藏在互联网、云计算、手机和各种设备的背后。很多人每天都在使用 Linux。只是他们自己不知道。第十章为什么偏偏是 Linux现在回头看会发现 Linux 的成功并不只是因为它“免费”。历史上免费的软件很多。开源的操作系统也不只有 Linux。Linux 能够脱颖而出是很多因素恰好在同一时间汇合。1. 它出现得正是时候80386 个人电脑开始普及。普通程序员第一次有机会在自己的房间里研究现代操作系统。互联网也开始把全世界的开发者连接起来。2. GNU 已经准备好了大量工具Linux 不需要从 Shell、编译器和命令行工具开始全部重写。GNU 多年的积累让 Linux Kernel 很快就能组成一套可用系统。3. Linus 选择了开放协作他没有试图一个人控制所有代码。只要补丁足够好就有机会进入项目。Linux 因此不断吸收来自世界各地的技术。4. GPL 保护了共同成果每个人都可以使用和修改 Linux。同时公开发布的衍生代码通常也需要继续保持开放。这让企业、个人和社区之间形成了一种微妙但有效的合作关系。5. Linux 很务实GNU Hurd 追求的是一种更先进、更优雅的内核架构。Linux 则采用了更接近传统 Unix 的宏内核路线。在理论讨论中哪种架构更漂亮可以争论很久。但 Linux 优先解决的问题是它现在能不能运行驱动能不能工作性能够不够好用户的问题能不能解决Linux 并不总是最优雅的设计。但它通常愿意接受现实。而工程世界最终奖励的往往不只是最漂亮的方案。还有真正能用、有人维护而且可以不断进化的方案。第十一章Linus 写出了 Linux但 Linux 早已不只属于 Linus直到今天Linus Torvalds 仍然是 Linux Kernel 最重要的维护者。但今天的 Linux早已不可能由一个人完成。大型科技公司、芯片厂商、云服务商、设备厂商和个人开发者都在向 Linux 提交代码。他们的动机并不完全相同。有人相信自由软件。有人需要 Linux 支持自己的硬件。有人希望提升服务器性能。有人需要改善云计算平台。有人只是想修复自己遇到的 Bug。这并不是一个纯粹由理想主义驱动的世界。里面有商业利益。技术理想。公司竞争。个人荣誉。现实需求。甚至还有开发者之间的争吵。但奇妙的是这些不同的力量最终可以围绕同一份代码协作。竞争对手可能同时向 Linux Kernel 贡献代码。云厂商可能在业务上激烈竞争却共同维护底层基础设施。硬件厂商希望卖出更多芯片因此主动改善 Linux 支持。Linux 的强大不在于所有参与者想法一致。而在于即使大家目的不同仍然可以共同建设同一个 Kernel。写在最后最初只是“写着玩”后来整个世界都用上了回头看 Linux 的诞生似乎没有任何宏大叙事。没有一家巨头宣布我们将创造下一代全球操作系统。没有商业发布会。没有精心设计的品牌宣传片。没有人预测它会运行在手机、服务器、云平台、路由器、汽车和超级计算机上。一开始只是一个大学生买了一台新电脑。他想研究 80386。觉得 Minix 不完全符合自己的需求。于是开始写一点底层代码。写着写着有了任务切换。有了终端。有了内存管理。有了文件系统。有了一个 Kernel。然后他把代码放到了互联网上。更多人加入进来。GNU 提供了早已准备好的工具。GPL 提供了开放协作的规则。互联网提供了遍布全球的开发团队。发行版把这些软件组装成真正可用的系统。企业又把 Linux 带进服务器、数据中心和各种设备。于是一个原本“写着玩”的项目逐渐成为现代数字世界最重要的地基之一。这可能也是 Linux 最传奇的地方。它并不是一开始就完美。也不是一开始就拥有最先进的架构。它甚至不是一开始就知道自己要去哪里。但它允许任何人参与。允许不断修改。允许失败。也允许重新再来。它像一个永远没有真正完工的城市。每天都有人修路。有人盖楼。有人拆掉旧建筑。有人抱怨设计太乱。也有人在某个不起眼的角落提交一小段代码。然后这段代码可能随着下一个 Kernel 版本运行在数以亿计的设备上。Unix 留下了一套思想。GNU 发起了一场自由软件运动。而 Linux 做了一件更直接的事情它把这些思想变成了一个真正能够运行的世界。不过Linux 的崛起也带来了一个新的问题既然 Unix 的思想可以被重新实现既然开放协作可以创造出如此强大的系统那么传统商业 Unix 又会走向哪里BSD、Linux 和各大 Unix 厂商之间又会展开怎样的竞争另一边一家卖个人电脑的公司也正在寻找属于自己的操作系统道路。它的名字叫Apple。而它未来的命运将与 Unix 的另一条支脉重新汇合。