madobet / webooru

Web Danbooru
32 stars 6 forks source link

最详细的Linux简史来了——Linux大神带你领略它的前世今生 - 知乎 #242

Open madobet opened 3 years ago

madobet commented 3 years ago

作者简介:陈华才,博士,高级工程师,《用芯探核 基于龙芯的 Linux 内核探索解析》的作者,负责龙芯 3 号处理器的内核开发。作为 Linux 内核中 MIPS/ 龙芯 3 号的 Maintainer,向 Linux 内核官方提交了大量的代码。

1991 年,芬兰大学生 Linus Torvalds 开发出最初的 Linux,这个操作系统适用于基于 Intel 80386 微处理器的 IBM PC 兼容机。经过多年的发展,Linux 已经可以在许多其他平台上运行,包括 Alpha、Itanium(IA64)、MIPS、ARM、SPARC、MC680x0、PowerPC 以及 zSeries。

Linux 最吸引人的一个优点就在于它是一个自由的操作系统:它的源代码基于 GNU 公共许可证(GNU Public License,GPL),是开放的,任何人都可以获得源码并研究它;只要得到源代码,就可以深入探究这个成功而又现代的操作系统。

Linux 提倡自由、开源、共享、人人为我,我为人人。 在 GPL 的号召下,全世界的 Linux 开发者组成了一个虚拟的开源社区。这是一种非常优秀的组织结构,尽管大家分布在世界各地,但是可以通过源代码和互联网进行高效的无障碍交流。大家既从开源社区获取资源,也把自己的贡献回馈给开源社区。

接下来,本文主要从Linux 内核的特点、Linux 内核发展简史和 Linux 内核的开发模式三个方面进行介绍,最后简单讲述什么是长期维护稳定版

Linux 内核的特点

从技术角度来说,Linux 只是操作系统内核,而不是一个完全的类 UNIX 操作系统,这是因为它不包含全部的 UNIX 应用程序,诸如文件系统实用程序、命令解释器、窗口系统、图形化桌面、系统管理员命令、文本编辑程序、编译开发程序等。以上这些应用程序大部分都可在 GNU 公共许可证下免费获得,因此包含 Linux 内核、基础运行环境(运行时库如 GLibc)、编译环境(如 GCC)、外壳程序(Shell,即命令解释器)和图形操作界面(GUI)的完整操作系统套件被称为GNU/Linux。尽管如此,在大多数情况下,仍用 Linux 来指代完整的 GNU/Linux。

Linux 内核遵循 IEEE POSIX 标准(POSIX 全称是 Portable Operating System Interface of UNIX)。它包括了现代 UNIX 操作系统的全部特点,诸如虚拟存储、虚拟文件系统、内核线程、轻量级进程、UNIX 信号量、SVR4 进程间通信、支持内核抢占、对称多处理器(Symmetric Multi-Processor,SMP)系统等。

Linux 内核是一体化内核(或称宏内核)操作系统,宏内核的设计风格是 “凡是可以在内核里实现的都在内核里实现”。 因此,除了异常 / 中断处理、内存管理和进程管理三大基本功能以外,文件系统、设备驱动和网络协议也放在内核层实现。

宏内核的优点是内核内部的各种互操作都可以通过函数调用实现,因此性能较好;而缺点是体积较大且理论上健壮性不太好(因为内部耦合性太高)。与宏内核相对的是微内核,最常见的是实现是 GNU Hurd,其设计风格是 “凡是可以不在内核里实现的都不在内核里实现”,因此很多功能子系统被设计成了一种服务(进程)。

微内核的优点是体积较小且理论上更健壮(因内核本身的功能较少而不容易出错);而缺点是操作系统的大量互操作都依赖于进程间通信(Inter-Process Communication, IPC),因此性能较差。微内核虽然把一些内核的核心功能剥离到了服务进程中,但重要的服务崩溃后实际上跟内核崩溃类似,因为整个系统也同样处于一个基本不可用的状态。

Linux 虽然是宏内核,但是也吸收了一些微内核的优点,比如从 1.0 版本开始就可以通过模块化(将一些非核心的功能设计成可以运行时动态加载 / 卸载的内核模块)来减少内核核心部分的体积。

Linux 内核发展简史

Linux 内核从最初发布的 0.01 版直到 4.4.x 版,经历了 “史前时代”“奇偶时代”“快速演进时代” 和 “极速演进时代” 四个阶段(如图 1 所示)。

图 1 Linux 内核版本演进图

1. 史前时代(0.01~1.0.0)

版本更迭过程为:

其中重要的版本有:

2. 奇偶时代(1.0.0~2.6.10)

这个时期的版本号用 a.b.c 表示,其中 a 为主版本号,b 为次版本号,c 为修订号。

版本号变更的原则是:发生重大改变时升级主版本号,发生非重大改变时升级次版本号;次版本号为奇数表示开发版,次版本号为偶数表示稳定版;稳定版和开发版在修订号上各自升级演进,开发版达到稳定状态时,发布下一个稳定版。

比如 1.0.x 在尽量不引入新功能的前提下不断升级;同时 1.1.x 在不断开发新功能的状态下不断升级;当 1.1.x 的开发到足够稳定时,转变成 1.2.x 成为稳定版;同时新的开发版 1.3.x 诞生……

稳定版:1.0.x, 1.2.x, 2.0.x, 2.2.x, 2.4.x, 2.6.x

开发版:1.1.x, 1.3.x, 2.1.x, 2.3.x, 2.5.x

其中重要的版本有:

3. 快速演进时代(2.6.11~2.6.39)

从 2.6.11 开始,Linux 内核界发生了两件大事:第一件大事是抛弃了 BitKeeper,转而开始用 Git 管理源代码;第二件大事是抛弃了奇偶版本法,转而使用 a.b.c.d 表示,其中 a 为主版本号,b 为次版本号,c 为主修订号,d 为次修订号。主修订号 c 的升级既包括新特性引入,也包括缺陷修订(Bugfix),次修订号 d 的升级只包括 Bugfix。

这个阶段开发速度加快,版本号即便第三段相邻,差别也很大。在奇偶时代,2.4.5 和 2.4.6 的差异不是很大;而在快速演进时代,2.6.36 和 2.6.37 的差别会非常大,甚至堪比 2.4.x 和 2.5.x 之间的差异。

在演进如此迅速的时代,如果继续采用奇偶版本法会有什么问题?

首先,2.7 版本开发持续时间会很长,不到 2.8 发布时,2.7 加入的新特性无法得到利用。其次,2.7 版本新特性同样很难后向移植(Backport)到 2.6,因为代码差异太大。

这个阶段的重要版本有:

4. 极速演进时代(3.0~5.x)

在快速演进阶段,内核版本号的 a.b 一直保持为 2.6 没变,完全可以合二为一。与此同时,参与 Linux 内核开发的个人与单位越来越多,开始进入极速演进时代。在这个阶段,版本号回归 a.b.c 表示法,a 为主版本号,b 为次版本号,c 为修订号。

在含义上,新的 a 相当于之前的 a.b,新的 b 相当于之前的 c,新的 c 相当于之前的 d。次版本号 b 的升级既包括新特性引入,也包括缺陷修订(Bugfix),修订号 c 的升级只包括 Bugfix。

关于每个版本的 Linux 内核都引入了什么新功能,可以参考官方的内核发行概述:

LinuxVersions - Linux Kernel Newbies​kernelnewbies.org

这个阶段的重要版本有:

Linux 内核的开发模式

目前,Linux 内核开发处于极速演进时代。在代码仓库管理上,有主线仓库(Mainline)、稳定仓库(Stable)、未来仓库(Linux-next)和子系统仓库(Subsystem,如 Linux-mips)4 大类,其关系如图 2。

图 2 Linux 内核的四类代码仓库及其关系

绝大多数开发者所贡献的代码首先要接受子系统管理员(Maintainer)的审核,才能进入某个特定的子系统仓库;在进入子系统仓库以后,会通过未来仓库进行二次审核;二次审核通过以后,最后将进入主线仓库(偶尔也有跳过未来仓库,从子系统仓库直接进入主线仓库的情况)。可以说,代码进入子系统仓库以后才仅仅处于 Alpha 状态;进入未来仓库以后才算达到 Beta 状态;如果进入了主线内核,就相当于达到 RC 状态或者 Final 状态,算是被官方采纳了。通过这种多层次的严格审核,Linux 内核的代码质量得到了极大的保证。

下面分别介绍这 4 类代码仓库。

1. 主线(Mainline)仓库

主线仓库是最重要的仓库,其升级规则是在次版本号上面升级演进,两个正式版之间会发布若干个候选版(RC 版),如:

某一个正式版和下一个候选版之间的时期叫做合并窗口期,比如 3.0 至 3.1-rc1 之间就是 3.1 的合并窗口。只有在合并窗口里面才允许增加新特性,其他阶段只允许缺陷修订(Bugfix)。也就是说,如果开发者想让某个新特性进入到 3.1 内核,那么必须保证在 3.1-rc1 之前进入,否则就只能等待 3.2 的合并窗口了。

Maintainer(管理员):Linus Torvalds

Git 仓库地址:git://http://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git

2. 稳定(Stable)仓库

稳定仓库基于主线仓库的正式版产生,在修订号上面升级演进,如 3.0.x 分支和 3.1.x 稳定分支仓库中的版本演进关系分别为:

稳定仓库的代码变更全都是缺陷修订(Bugfix),不引入新的特征。

Maintainer(管理员):Greg Kroah-Hartman 等

Git 仓库地址:git://http://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git

3. 未来(Linux-next)仓库

未来仓库的前身为 Andrew Morton 维护的 Linux-mm,代码变更在进入下一版主线内核之前先到达这里。 如果说主线仓库在功能上类似于奇偶时代的偶数版本(稳定版)的话,那么未来仓库在功能上类似于奇偶时代的奇数版本(开发版)。未来仓库的版本命名规则是日期,如 next-20151212。未来仓库会不定期合并主线仓库的代码,将其作为新一轮添加特性的基础(Base)代码。

Maintainer(管理员):Stephen Rothwell

Git 仓库地址:git://http://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git

4. 子系统(Subsystem)仓库

子系统仓库为数众多,一般按体系结构(arch)、驱动类型(drivers)进行分类。 龙芯内核开发者比较关心的子系统仓库主要有以下两个。

Git 仓库地址:git://http://git.kernel.org/pub/scm/linux/kernel/git/ralf/linux.git

Git 仓库地址:git://http://people.freedesktop.org/~airlied/linux

和未来仓库一样,子系统仓库会不定期合并主线仓库的代码,将其作为新一轮添加特性的基础(Base)代码。

内核根目录的 MAINTAINERS 文件中列出所有现任的 Maintainer 及其相关信息,比如 MIPS 架构下面龙芯相关的三个子架构(即龙芯 1 号、龙芯 2 号和龙芯 3 号)的 Maintainer 信息如下。

MAINTAINERS 文件中包含一个个子系统的条目。

每个条目的开头第一行是关于子系统的描述,比如,龙芯 1 号的 MIPS/LOONGSON1 ARCHITECTURE,龙芯 2 号的 MIPS/ LOONGSON2 ARCHITECTURE 和龙芯 3 号的 MIPS/LOONGSON3 ARCHITECTURE。

M 开头的行是 Maintainer 的姓名和电子邮箱,龙芯 1 号的 Maintainer 是张科广,龙芯 2 号的 Maintainer 是杨嘉勋,这两位都是开源社区的龙芯爱好者,而龙芯 3 号的 Maintainer 就是《用 “芯” 探核:基于龙芯的 Linux 内核探索解析》的作者。L 开头的行是该子系统用于开发交流的邮件列表;S 开头的行是该子系统的维护状态;F 开头的行是该子系统所涉及的主要源代码文件的路径。

长期维护稳定版

所谓的长期维护稳定版版(Long Term Stable,LTS),实际上是一种特殊的稳定版本(Stable)。Stable 版本的缺陷修订(即 Bugfix)实际上是 Mainline 版本中缺陷修订的后向移植(即 Backport)。普通的 Stable 版本的维护时间为 3 个月左右,因此当 Mainline 仓库中下一版的正式版发布,上一版的 Stable 分支就不再继续升级(EOL,End Of Life)。而LTS 版本的维护时间为 2 年左右,也可能更长。同时维护的 LTS 版本为 5 个左右,当一个新的 LTS 版本被选中时,一般最老的 LTS 就不再继续升级(EOL)。

Linux 内核官方选择长期维护稳定版本的依据大致有几点:具有里程碑意义(如 3.0),是过去一段时间内引入的新特性的集大成者,或者是被 Redhat、Debian 等著名发行版采用的版本。曾经被选为长期维护版本的内核有:2.6.16.x、2.6.27.x、2.6.32.x、2.6.33.x、2.6.34.x、2.6.35.x、3.0.x、3.2.x、3.4.x、3.10.x、3.12.x、3.14.x、3.16.x、3.18.x、4.1.x、4.4.x、4.9.x、4.14.x、4.19.x 和 5.4.x。

相关阅读

《用 “芯” 探核 基于龙芯的 Linux 内核探索解析》

作者:陈华才

[

](https://union-click.jd.com/jdc?e=jdext-1282343906685186048-0&p=AyIGZRprFQEaBVIZXBYyVlgNRQQlW1dCFFlQCxxKQgFHRE5XDVULR0UVARoFUhlcFh1LQglGa2lmRlJQZ11iYGFlM28ackMTfSxuMnUOHjdVElsXChMGVRxYJQITBlUfXhYBFAZlK1sQMkRpVRpaFAMTAlEcXCUDIgdRE1IRAhcAVRhbHQoiB10fa8OshtLdpIKlp8St%2B87WpdebrIGl3SUyIgRlQA5BS1cbVRhSFgAXBV0aXBILFgdcHFoQCw4GZRhaFAcSBFYbUxxsFwZUGlsdBREPVnVZFAMRA1QSWxMLIgdlGGtLbBNUVhIOQAAXaQ9PCU1RUFhXdVwTAxsGXBNYJQATBlcZ)

这是一本基于龙芯平台,结合 Linux-5.4.x 版本的内核源代码来解析 Linux 内核的书籍。

本书首先介绍了有关龙芯处理器和 Linux 内核的基础知识,然后重点讲解了内核启动、异常与中断、内存管理、进程管理、显卡驱动、网卡驱动和电源管理这 7 大板块的内容。本书甚少涉及代码的细枝末节,而是重点关注代码实现的主干流程,并且创造性地引入了树形视图和链式视图这两种比流程图更好用的代码解析方法。

本书适合 Linux 系统相关的开发人员,特别是基于龙芯处理器做内核开发的技术人员学习参考。

========

赠人玫瑰,手留余香,不要忘记点赞、收藏、关注 哦~

一键三连,感恩有你~ https://zhuanlan.zhihu.com/p/200892988