Linux内核编程——GNU/Linux 内核的历史

0 阅读23分钟

引言

本章介绍了Linux内核的起源与功能演变,旨在帮助读者不仅理解内核是什么,还能了解其结构是如何发展的。

章节结构

本章涵盖以下内容:

  • 灵感来源
  • Linux内核历史
  • 各版本/里程碑功能的演进
  • GNU/Linux的许可协议

目标

本章是理解Linux来源、历史以及为何要学习这一操作系统的重要序言。Linux因其开源代码、稳定性和性能而闻名。读完本章后,你将对Linux内核有一个整体的认识。Linux内核的创造者Linus Torvalds并非完全从零开始发明,而是受到当时已有技术的启发,因此了解这些灵感来源有助于更好地理解内核。

灵感来源

上世纪60至70年代,Unix是AT&T贝尔实验室开发的操作系统,以其模块化设计、稳定性和高效性著称。Unix(常大写为UNIX,尤其作为官方商标时)诞生于1969年,是贝尔实验室推出的交互式分时系统。

“Unix”一词是通过组合“uniplexed”(单一)与“multics”(早期操作系统项目)而来的双关语。Unix是Multics系统的继任者。

Ken Thompson和Dennis Ritchie被认为是Unix的发明者。

1974年,Unix成为首个使用C语言开发的操作系统。Linux内核创始人Linus Torvalds在大学期间使用Unix,并受到Unix多用户、多任务和资源管理概念的启发(见图1.1)。下图展示了Unix系统的同心圆视图,也称洋葱模型:

image.png

Unix 通常被认为基于洋葱模型。

Unix 系统提出的这个模型是分层的,从硬件开始,经由内核控制,最后到达用户。内核负责管理硬件及各种提供实用工具的软件。下图展示了洋葱模型的纵向视图:

image.png

Unix 系统架构的整体轮廓与实际的 Linux 系统相似。

正如我们将要探讨的,Linux 发行版众多,且相互借鉴。Unix 系统也是如此,因为提到 Unix 系统(对于那些了解它们的人来说),我们会想到 IBM AIX、HP UX、Irix、Solaris、UnixWare、Ultrix、Microsoft Xenix、SCO Unix、Net/OpenBSD 等众多系统。

所有这些系统各自发展演变,并以不同方式推动了现代操作系统的发展。下图展示了当时常见的众多 Unix 系统版本,而这些系统大多已被今天的 Linux 系统所取代:

image.png

1972年第二版Unix中的许多命令至今仍在Linux中使用。

另一个灵感来源是Minix(意为“小型Unix”),这是一款教育和实验性质的操作系统,由Andrew S. Tanenbaum(又称AST)于1984年为学生设计,用以拆解真实操作系统。实际上,AT&T禁止将Unix用于教育目的,也禁止其用于教学。

MINIX是用C语言编写的微内核,旨在重新实现Unix第7版(V7)。它设计用于配备256KB内存、360KB 5.25英寸软盘的IBM PC。相比Unix,MINIX采用了更模块化的结构,从用户角度来看兼容Unix,但内核实现完全不同。

其目标是提供一个开源、结构清晰、易于学生理解的设计;核心是一个小型微内核,操作系统的其余部分由用户进程组成,通过同步消息传递进行通信。许多基本程序如cat、grep、ls、make等以及shell均存在并执行与Unix相同的功能。

MINIX需要20MB硬盘分区。由于设计注重可读性,MINIX效率不及Unix。下图清晰展示了控制器在用户空间的定位,没有内核的设计,而Linux随后会认为这是效率低下的做法:

image.png

内核是操作系统的核心部分,负责管理系统资源。它就像应用程序与计算机硬件之间的桥梁。在单体内核(monolithic kernel)架构中,用户服务和内核服务都运行在同一个地址空间内。

Linus Torvalds 曾在 Minix 项目中工作过一段时间,积累了操作系统设计的实践经验。但他发现 Minix 在性能和功能上存在限制,这激励他创建自己的内核,几年后诞生了 Linux 内核。最初版本由于散热问题,运行一小时后会崩溃。

我们不应忘记另一个对 Linux 内核发展至关重要且较新的灵感来源,这也是 Linux 内核现有名称的由来——GNU/Linux,源于其所遵循的GPL许可权利。

GNU 是由 Richard Stallman 于1983年创建的自由操作系统(如图1.5所示),由 GNU 项目维护。GNU涵盖了Unix的理念和运行机制。该项目已有一个名为 HURD 的内核,这名字是个双关语,意指“herd”(一群动物),体现了摆脱Unix单体内核模型的愿望。HURD 与 Linux 竞争,但最终被 Linux 所掩盖。

image.png

Linus Torvalds 使用了 GNU 项目(GNU’s Not Unix,简称 GNU)提供的开发工具。GNU 项目是由 Richard Stallman(简称 RMS)于1983年发起的,旨在创建一个完全自由且开源的操作系统。

虽然 Linux 本身并非 GNU 项目的一部分,但它与 GNU 工具结合,构建成了一个完整的操作系统,因此被称为 GNU/Linux。GNU 工具在 Linux 早期开发中发挥了关键作用。

正如我们所见,Linux 并非凭空诞生,而是汲取了当时已有技术的灵感,但其创造者 Linus Torvalds 知道如何构建一个单体内核,兼顾其优点并避免其他内核的缺点。因此,Linux 可以被视为70、80年代被认为是前卫且现代的各种理念的融合。与 Minix 不同,下图清晰展示了大量控制器被移入内核地址空间的变化:

image.png

Linus Torvalds 受到了开源和代码共享理念的影响。他选择将内核源码以 GNU 通用公共许可证(GPL)发布,鼓励全球开发者的协作与贡献。

这些理念促成了 Linux 内核的诞生,Linux 内核在开发过程中秉持开源原则、模块化设计和高效性。它基于现有 UNIX 系统的最佳实践,同时不断引入创新和改进。

Linux内核历史

很久以前,有一个名为Linux的项目,于1991年在赫尔辛基大学启动,起初是芬兰人Linus Torvalds基于自己的论文而开展的个人项目,旨在创建一个新的单体免费操作系统内核。

他专门为自己使用的硬件编写了程序,且独立于任何操作系统,因为他希望利用自己配备80386处理器的新PC的功能。开发工作是在MINIX系统上,使用GNU C编译器完成的。

自1991年首次发布源码以来,Linux内核经历了持续稳步的发展。从最初只包含少量受许可限制且禁止商业分发的C语言文件,到2018年发布的4.15版本,源码行数超过2330万行(不含注释),代码依然遵循GNUv2许可协议。

1991年4月,时年21岁的芬兰赫尔辛基大学计算机科学学生Linus Torvalds开始为个人电脑着手开发一个受Unix启发的操作系统的简单构想。项目最初是基于Intel 80386汇编语言实现的任务切换器和终端驱动。

1991年7月3日,为了在项目中实现Unix系统调用,Linus Torvalds向comp.os.minix新闻组提交请求,试图获取POSIX标准文档的电子版,但未能找到。他于是先根据大学拥有的SunOS文档确定系统调用,以操作Sun Microsystems服务器,并从Tanenbaum的MINIX教材中学习部分系统调用,这本教材是Unix课程的一部分。

1991年8月25日,Torvalds在Usenet新闻组comp.os.minix发布了如下内容:

大家好,使用minix的朋友们——
我正在开发一个(免费)操作系统(仅仅是业余爱好,不会像gnu那样大且专业),面向386(486)AT兼容机。从四月开始筹备,现在开始成型。我希望听到大家对minix喜欢或不喜欢的地方,因为我的操作系统与它有些相似(例如文件系统的物理布局相同,这是出于实用考虑)。
我目前已移植了bash(1.08)和gcc(1.40),运行情况不错。这意味着几个月内我会有一个实用的版本,我想知道大家希望它具备哪些功能。欢迎提出建议,但我不能保证一定会实现。
对了——这完全没有使用minix代码,且具有多线程文件系统。但它不可移植(使用386任务切换等),可能永远只支持AT硬盘,因为我只有这一套硬件。
— Linus Torvalds

1991年9月17日,Torvalds发布了Linux 0.01版本,并将其上传到芬兰大学与研究网络(FUNET)的ftp.funet.fi FTP服务器。该版本不可执行,因为代码需要MINIX编译和测试。

1991年10月5日,Torvalds宣布发布Linux第一个官方版本0.02。此时,Linux能够运行Bash、GCC和一些GNU实用工具:

正如我一个月前提到的,我正在开发一个类似Minix的免费系统,针对AT-386电脑。现在它已经达到可以使用的阶段(虽然功能取决于需求),我愿意发布源码以供更广泛传播。它只是0.02版本……但我已成功运行bash、gcc、gnu-make、gnu-sed、compress等程序。

image.png

尽管最初版本功能有限,Linux 很快赢得了开发者和用户的青睐。许多人为该项目贡献了代码,其中包括一些来自 MINIX 社区的开发者。

在 0 版本中,Linux 明确表示主要用于测试,而非生产使用。1991 年 12 月发布的 0.11 版本是首个自举(self-hosted)版本,因为它能够在运行相同内核的计算机上编译自身。

据 Torvalds 说,Linux 在 1992 年开始崭露头角,这得益于 Orest Zborowski 将 X Window 系统移植到 Linux,使 Linux 首次支持图形用户界面(GUI)。Linux 长期以来一直是一个只能通过命令行使用的系统,就像当年的 MS-DOS 系统一样,X Windows 最终为 Linux 系统带来了图形界面,这使得 Linux 得以广泛普及:

image.png

正是从那时起,Linux 的历程开始了,催生了越来越多的发行版。正如我们在Unix版本时间线上看到的,这些发行版彼此相互借鉴,融合了最优秀的特性,打造出现今我们所拥有的最佳系统。

如今,Linux(如图1.9中绿色部分所示)已跻身 *nix 系统中最重要的名字之列:

image.png

这也是一场在当今各种发行版之间的冒险。有些发行版曾风光一时,如今已不复存在;而另一些则持续发展至今,如下图所示:

image.png

按版本/里程碑的功能演进

了解Linux内核功能发展的不同阶段非常重要,这有助于理解它是如何随着时间演变的。以下各节将详细介绍Linux内核各版本的重要特点。

早期开发(1991-1993)

重要发展包括:

  • 1991年:Linus Torvalds宣布Linux项目。
  • 1992年:首次公开发布Linux 0.01,仅支持Intel 386处理器。
  • 1993年:Linux 0.99.1在GNU GPL许可下发布,标志着项目正式开源。

GNU/Linux内核的早期版本,如Linux 0.01和0.99,功能非常有限,相较后期版本较为简陋。这些早期版本更像概念验证,主要提供基础操作系统的核心功能。早期Linux内核的一些关键特性包括:

  • 基础硬件支持:主要支持Intel 386架构,重点是让内核能在该硬件上运行。
  • 多任务处理:Linux 0.01引入了基本多任务,允许多个进程同时运行。
  • 内存管理:包含分页和进程内存分配等基础内存管理,但远不及后期高级内存管理。
  • 文件系统:实现了简单文件系统,但缺乏后续版本丰富的文件系统支持。
  • Shell及基本工具:包括简单Shell和少量基本工具,用于系统交互。
  • 无网络支持:早期版本不支持网络,后续逐步添加。
  • 无模块支持:尚未引入可加载内核模块的概念。

这些版本功能和硬件支持受限,主要作为Linus Torvalds的业余项目,有意保持简单以便管理开发。后续版本增加了众多功能,扩展了硬件支持,提高了性能,使Linux成为多用途且强大的操作系统。

内核版本1.0(1994)

1994年发布Linux 1.0,标志着稳定性和成熟度。虽未引入革命性特征,但这一里程碑意味着Linux具备了更广泛应用的可靠性和稳健性,赢得用户和软件社区的信任。同时,它作为专有Unix类系统的可行且稳定替代方案,吸引了更多开发者、企业和组织,促进了Linux生态系统的快速发展。

内核版本2.0(1996)

1996年发布Linux 2.0,带来了更好的硬件支持和性能提升。主要特点包括:

  • 扩展硬件支持:支持更多硬件平台和设备,提高可访问性。
  • 对称多处理(SMP):支持多处理器系统,大幅提升多CPU机器的可扩展性和性能。
  • 改进网络功能:增强网络能力,适合服务器应用,改进TCP/IP协议栈和网络设备支持。
  • 优化内存管理:提升系统内存利用率和性能。
  • 虚拟文件系统(VFS):引入VFS层,支持多种文件系统(如ext2、NFS等)灵活集成。
  • 增加文件系统支持:新增ext2作为默认文件系统。
  • 提升系统稳定性:适应更广泛的生产环境。
  • 内核模块改进:支持动态加载卸载内核组件,无需重编译。
  • 软件兼容性增强:更好支持各种软件,吸引更多开发者和用户。

Linux 2.0为内核发展迈出重要步伐,增强了能力,使其成为服务器和桌面领域成熟可靠的选择,奠定了Linux持续增长的基础。

内核版本2.2(1999)

1999年发布Linux 2.2,提升稳定性、性能及硬件支持,显著优于前一版本。关键特性:

  • 稳定性与漏洞修复:大量修复及改进,增强可靠性。
  • 硬件支持扩展:兼容更多处理器、芯片组和外设。
  • 网络功能提升:支持更多网络设备和协议,增强性能和可扩展性。
  • 高级文件系统:引入日志文件系统ext3,增强文件系统鲁棒性和崩溃恢复能力。
  • 内核抢占:支持内核抢占,提高响应性和实时应用支持。
  • USB支持:初步支持USB设备,奠定未来扩展基础。
  • 可扩展性提升:性能优化,适应复杂工作负载和企业环境。
  • PCMCIA支持:改进对笔记本等设备的支持。
  • 内存管理优化:改进内存分配与利用。
  • 内核模块完善:持续完善动态加载系统。

Linux 2.2巩固了Linux作为稳定高性能操作系统的地位,改进的硬件支持和稳定性吸引了更多用户和开发者,是后续内核发展的跳板。

内核版本2.4(2001)

2001年发布Linux 2.4,内存管理和文件系统支持有显著提升。主要特点:

  • 先进内存管理:支持大量内存和改进虚拟内存处理。
  • 扩展页表(高内存支持):允许32位系统访问超过1GB物理内存。
  • SMP可扩展性提升:多CPU系统性能更优。
  • 文件系统支持:引入日志文件系统ext3,支持XFS和ReiserFS。
  • 网络栈增强:支持更多网络设备,提升IPv6支持和网络性能。
  • 防火墙和IP过滤:引入Netfilter框架,实现强大防火墙功能。
  • USB支持增强:兼容更多USB设备。
  • 驱动程序支持扩展:支持更多硬件。
  • 性能优化:整体提升响应速度和效率。
  • 内核抢占优化:更好响应性及实时支持。

Linux 2.4使Linux成为成熟且强大的操作系统,特别适合服务器和企业环境,推动了广泛应用。

内核版本2.6(2003)

2003年发布Linux 2.6,带来重大性能和资源管理提升。重点:

  • 可扩展性改进:优化多处理器系统及大型服务器配置,提升并发处理能力。
  • 新的I/O调度器:引入完全公平调度器(CFS)和预期调度器,提升磁盘I/O性能。
  • 电源管理增强:支持高级电源管理,改进ACPI,适合笔记本和移动设备。
  • udev引入:简化设备管理,方便动态硬件处理。
  • 内核异步I/O:内核内异步I/O操作,提升I/O密集型应用性能。
  • 内核抢占和实时支持改进:提高响应性,适合实时及高性能计算。
  • 大文件支持:支持超大文件,满足企业和科研需求。
  • 安全增强:引入SELinux及基于能力的安全机制。
  • inotify机制:监控文件和目录变化,支持文件同步和监控。
  • IPv6支持改进:持续提升IPv6协议支持。
  • 新文件系统:引入JFS、XFS及ext4文件系统,提升可扩展性、性能和稳定性。
  • 网络功能增强:改进网络栈性能、服务质量(QoS)支持及协议支持。

Linux 2.6是内核发展的重大里程碑,使其更具适应性、可扩展性和性能,适用于从桌面到服务器及嵌入式系统的多种环境。

内核版本3.0(2011年)

Linux 3.0发布,主要是为了简化版本号,没有引入重大技术变化。2011年发布的GNU/Linux内核3.0版本,主要特征是版本号变更,而非革命性功能或架构变动。相比2.x版本,3.0未带来显著的新技术特性或核心功能改动。版本号变更主要具有象征意义,旨在简化编号体系。主要特点包括:

  • 版本号简化:从2.x系列(如2.6.x)升级到3.0,体现内核的成熟与稳定,而非架构变革。功能上,3.0与2.6.x极为相似。
  • 稳定性和渐进改进:虽然主版本号变更,3.0继续在性能、驱动更新和漏洞修复等方面持续改进,提升整体稳定性和可靠性。
  • 象征性变化:版本号调整象征内核成熟发展,未代表开发或架构上的重大转变。
  • 持续开发:版本号变更后,Linux开发照常进行,后续版本(如3.1、3.2等)以渐进方式引入新功能和改进。

总结:Linux 3.0主要是版本号变更,反映内核成熟,延续了持续开发和优化的传统,提升性能、硬件支持和稳定性,后续版本在此基础上增加新特性。

内核版本4.0(2015年)

2015年发布Linux 4.0,重点提升性能和稳定性。它不是单一革命性功能,而是一系列渐进改进、漏洞修复和优化,旨在提升整体性能、稳定性和硬件支持。主要亮点:

  • 内核模式设置(KMS):虽非4.0首次引入,但该版本标志Linux图形支持的一个里程碑,广泛采用KMS,改进显示分辨率管理和图形硬件支持。
  • 硬件支持提升:扩展更多处理器、芯片组、显卡和外设支持。
  • 内核动态修补(live patching):引入关键安全补丁无需重启即可应用,大幅提升系统正常运行时间和安全性。
  • 支持Intel Skylake架构:提升兼容性和性能。
  • 文件系统挂载速度提升:尤其是Btrfs和NFS,缩短启动时间,提升响应速度。
  • 电源管理改进:增强能效,适合笔记本和移动设备。
  • 新增硬件驱动:支持更多设备。
  • 性能优化:内核整体性能提升。
  • 安全补丁:持续修复安全漏洞,如Spectre和Meltdown缓解措施。

Linux内核开发采用渐进方式,每次发布都建立在前一版本基础上。4.0虽无革命性新功能,但显著提升稳定性、性能和硬件兼容性,是广泛适用的稳健内核。

内核版本5.0(2021年9月)

Linux 5内核引入多项重要特性和改进。注意此后可能还有更新版本带来更多功能。主要内容包括:

  • 性能提升:降低延迟,优化资源利用,更适合桌面和服务器负载。
  • 硬件支持增强:支持AMD Navi GPU、Intel Icelake CPU、树莓派4等新硬件,同时提升对现有设备支持。
  • 安全增强:持续防护各类漏洞,包括Spectre和Meltdown的缓解。
  • I/O优化:引入io_uring接口,提升磁盘和网络I/O性能。
  • 实时抢占:实时抢占补丁合入主线,更适合实时和低延迟应用。
  • 文件系统更新:ext4改进,Btrfs、XFS等文件系统修复和优化。
  • 图形与GPU支持:支持新AMD、Intel GPU,改进NVIDIA开源驱动Nouveau。
  • 能效提升:加强电源管理,提升设备续航。
  • 无线和网络改进:支持新无线芯片组,提升网络性能。
  • 硬件监控改进:新增传感器和监控功能,方便系统管理。
  • 安全强化:引入内核地址空间布局随机化(KASLR)等硬化措施。
  • 新系统调用和API:支持更复杂应用和服务开发。

内核版本6.0(2022年10月)

2022年10月2日,Linus Torvalds宣布发布Linux 6.0,包含大量更新,尤其是提交数量众多。尽管版本号变更,但他强调并非重大基础变革:
“版本号变更主要是因为我数不过来手指脚趾,而非真正的重大变化。”——Linus Torvalds

Linux 6.0的主要新特性和改进包括:

  • 支持Intel第四代Xeon Sapphire Rapids处理器和第十三代Raptor Lake核心。
  • 对OpenRISC和LoongArch架构的PCI支持。
  • 支持Intel SGX2。
  • 支持高通Snapdragon 8xc Gen3。
  • 支持即将发布的AMD处理器温度监控。
  • 调度器改进,包括对AMD Zen的NUMA负载均衡优化。
  • 支持NVMe内带认证。
  • RISC-V架构新增默认配置,支持开箱即用运行Docker。
  • 多项运行时验证。
  • ext4文件系统新增ioctl()操作:EXT4_IOC_GETFSUUID和EXT4_IC_SETFSUUID。
  • 支持树莓派4的V3D内核驱动。
  • 移除限制跨CPU进程迁移的能耗边际启发式算法,提升能效。
  • 自2022年12月内核6.1版本起,首次支持除C和汇编之外的其他语言开发内核。

如需了解Linux内核新增支持详情,可访问该网站的提交摘要:Kernelnewbies.org/LinuxChange…

GNU/Linux的许可协议

最初,Torvalds发布Linux时采用了一种禁止任何商业用途的许可协议。
在版本0.12中,这一许可改为GNU通用公共许可证第二版(GPLv2)。该许可证允许分发和销售可能经过修改或未修改的Linux版本,但要求所有副本必须在相同许可下发布,并附带完整的对应源代码,或应要求公开访问。Torvalds称,将Linux许可为GPLv2是他做过的“最棒的决定”。

Linux内核明确采用GNU通用公共许可证第二版(GPL-2.0)唯一版本授权(GPL-2.0 only),并附带明确的系统调用例外(linux-syscall-note),不允许被许可方选择使用后续版本。贡献代码必须采用与GPL兼容的许可证。

GNU通用公共许可证第二版(GPL-2.0)是自由软件基金会(FSF)制定的广泛使用的开源软件许可证。其要点简述如下:

  • 分发与修改:GPL-2.0允许任何人使用、修改和分发被许可软件。你可自由修改代码并共享修改成果。
  • 版权许可(Copyleft):作为一种版权许可协议,若分发软件的修改版本,必须在相同GPL-2.0条款下公开修改后的源代码,确保软件及其衍生品保持开源。
  • 商业使用:允许GPL-2.0许可软件用于商业目的,分发、支持或相关服务收费无禁令。
  • 署名:分发GPL-2.0许可软件或衍生品时,必须保留原始版权声明、免责声明及GPL-2.0许可副本。
  • 兼容性:GPL-2.0与部分更宽松的开源许可不兼容,若与不兼容许可代码合并,结果作品须完全在GPL-2.0下授权。
  • 无担保:GPL-2.0声明软件按“现状”提供,无任何担保,用户和分发者自行承担使用风险。
  • 许可终止:若违反GPL-2.0条款,使用和分发权限可被终止,但可通过遵守许可重新获得权利。

需注意,GPL-2.0为法律文件,其条款具法律约束力。使用或分发该许可软件的开发者和组织应仔细阅读理解其规定,确保合规。GPL-2.0在开源社区被广泛采纳,推动了自由和开源软件的发展。

关于GPLv2唯一版本许可的更多信息,请访问:spdx.org/licenses/GP…

关于是否应允许许可升级至后续GPL版本(包括GPLv3),社区存在较大争议。Torvalds本人在发布2.4.0版本时明确表示其代码仅采用版本2授权。然而GPL条款规定,如未指定版本,则不允许使用其他版本;Alan Cox指出,极少数Linux贡献者指定了具体GPL版本。

2006年9月对29名核心内核程序员的调查显示,其中28人偏好GPLv2而非GPLv3。Torvalds评论道:“我认为外界很多人……认为我个人只是个怪人,因为我公开不支持GPLv3。”这批顶级内核开发者,包括Torvalds、Greg Kroah-Hartman和Andrew Morton,在媒体上表达了对GPLv3的反对,提及涉及数字版权管理(DRM/tivoization)、专利、附加限制等条款,并警告GPLv3可能导致开源宇宙分裂。Linus Torvalds多年后仍重申其对GPLv3的批评,并决定Linux内核不采纳GPLv3。

总结

在本章中,我们了解了Linux内核创建的历史背景,它借助GNU项目的工具,逐渐发展成了一个完整的发行版。我们还看到了当时技术的影响,这些推动了发展和创新,克服了诸多限制,并采纳了积极的因素,最终形成了我们今天所熟知的系统。

在下一章中,我们将详细探讨Linux系统的结构,尤其是内核本身,这是本书的核心目标。

现在,我们已准备好乘坐下一班列车,开启探索Linux内核内部世界的旅程。