作者简介:陈华才博士,高级工程师,作者《用芯探核 基于龙芯的Linux内核探索解析》,负责龙芯3处理器核心开发。作为MIPS/龙芯3 Linux内核的维护者,我为官方Linux内核贡献了大量代码。
1991年,芬兰大学生Linus Torvalds开发了最初的Linux,这是一个适用于基于Intel 80386微处理器的IBM PC兼容机的操作系统。经过多年的发展,Linux 现在可以运行在许多其他平台上,包括Alpha、Itanium (IA64)、MIPS、ARM、SPARC、MC680x0、PowerPC 和zSeries。
Linux 最吸引人的优点之一是它是一个免费的操作系统。其源代码遵循GNU 公共许可证(GPL),任何人都可以获取和研究源代码。下面的代码可以让您更深入地了解这个成功的现代操作系统。
Linux代表自由、开源、共享、一为所有人、一为所有人。在GPL的号召下,来自世界各地的Linux开发者组成了一个虚拟的开源社区。这是一个非常好的组织架构。虽然我们都分布在世界各地,但我们能够通过源代码和互联网进行高效、无障碍的沟通。每个人不仅从开源社区获取资源,而且还为其做出贡献。
接下来,本文主要介绍Linux内核的特点、Linux内核开发简史、Linux内核的开发模型,最后简要说明什么是长期维护稳定版本。
Linux内核的特点
从技术角度来看,Linux只是一个操作系统内核,而不是一个完整的类UNIX操作系统。这是因为它不包括所有UNIX 应用程序,例如文件系统实用程序、命令解释器和窗口系统。图形桌面、系统管理员命令、文本编辑程序、编译和开发程序等等。上面列出的大多数应用程序都可以在GNU 公共许可证下免费使用。因此,它是一个完整的操作系统套件,具有Linux内核、基本执行环境(运行时库,如GLibc)、编译环境(如GCC)和shell程序(shell,即命令解释器)图形用户界面(GUI)称为GNU/Linux。尽管如此,在大多数情况下,Linux 仍然用来指代完整的GNU/Linux。
Linux内核遵循IEEE POSIX标准(POSIX的正式名称是Portable Operating System Interface for UNIX)。其中包括虚拟存储、虚拟文件系统、内核线程、轻量级进程、UNIX 信号量、SVR4 进程间通信、内核抢占支持和对称多处理器(SMP) 系统。
Linux 内核是一个集成的内核(或宏内核)操作系统。宏内核的设计风格是“凡是能在内核中实现的都将在内核中实现。”因此,内核层除了实现异常/中断处理、内存管理、进程管理这三个基本功能外,还实现了文件系统、设备驱动、网络协议等功能。
宏内核的优点是可以通过函数调用来实现内核内部的各种互操作,从而提高性能。缺点是尺寸大,理论上鲁棒性较差(由于内部耦合太高)。与宏内核相反的是微内核。最常见的实现是“如果内核不能实现,就不要在内核中实现”的设计风格。因此,很多功能子系统被设计为服务。过程)。
微内核的优点是它们更小,理论上更健壮(内核本身的功能更少,因此更不容易出错)。缺点是操作系统的大部分互操作性依赖于进程间通信。由于进程间通信(IPC),性能会降低。关键服务的崩溃实际上类似于内核崩溃,因为微内核将内核的一些核心功能移至服务进程,但也使整个系统基本上无法使用。
尽管Linux是一个宏内核,但它也吸收了微内核的一些优点。例如,从1.0版本开始,可以通过模块化(将一些非核心功能设计成可以动态执行的内核模块)来减少内核核心数量。运行时加载/卸载的零件量)。
Linux内核发展简史
Linux 内核从最初发布的0.01 版到4.4 版经历了四个阶段。
图1 Linux内核版本演变图
1.史前时期(0.01~1.0.0)
版本变更流程如下:
重要版本有:
0.01:第一个版本,0.02:第一个发布版本,0.11:《Linux内核完全注释》中使用的版本。 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
重要版本包括:
1.0.0:第一个正式版本,支持模块化并开始支持联网。 1.2.0:开始支持非X86架构。 2.2.0:开始支持对称多处理(SMP)。它已经发布了多个版本并被广泛使用。 2.4.5:开始使用“中国制造”代码(如LVS)。 2.4.18:开始使用《深入理解Linux内核(第2版)》。世界各地听到的:完全抢占式、O(1) 调度程序、SYSFS、X86_64 支持、NUMA 支持、NPTL 支持. 3. 快速演进时代(2.6.11-2.6.39)
自2.6.11以来,Linux内核世界发生了两件重大事件。第一个大事件是BitKeeper 的退役和使用Git 进行源代码管理。第二件大事是取消奇偶版本制度。其中,a 是主版本号,b 是次版本号,c 是主修订号,d 是次修订号。升级到主要修订版号c 包括新功能介绍和错误修复,而升级到次要修订版号d 仅包括错误修复。
现阶段,开发速度不断加快,即使三段相邻,版本号也会有明显差异。在奇偶时代,2.4.5和2.4.6的差别并不是很大,但在快速演化的时代,2.6.36和2.6.37的差别就变得很大,2.6.36和2.6.36的差别就变得很大。 2.6.37 等于差值。 2.4.x 和2.5.x。
在这个快速进化的时代继续使用奇偶版本方法有什么问题呢?
首先,2.7版本的开发时间较长,2.7中添加的新功能要等到2.8发布后才能使用。其次,将2.7版本的新功能向后移植到2.6版本也很困难,因为代码差异太大。
现阶段重要的版本有:
2.6.11.0:《深入理解Linux内核》第3版使用的版本;2.6.20.0:开始支持KVM虚拟化技术;2.6.24.0:引入i386和x86_64。它集成到x86架构中,默认使用SLUB内存分配器。 2.6.33.0:开始支持龙芯2F,支持MIPS系列处理器上的内核压缩。引入AutoGroup机制,大幅提升桌面应用体验。引入透明大页(THP)。 4.快速进化时代(3.0-5.x)
在快速演进阶段,内核版本号a.b仍为2.6,两者可以合二为一。与此同时,越来越多的个人和组织参与到Linux内核的开发中,Linux内核开始进入快速演进的时代。在此阶段,版本号恢复为a.b.c 表示法。其中a是主版本号,b是次版本号,c是修订号。
从语义上来说,新的a等价于之前的a.b,新的b等价于之前的c,新的c等价于之前的d。升级到次要版本b 包括新功能介绍和错误修复,而升级到次要版本c 仅包括错误修复。
要了解每个版本的Linux 内核引入了哪些新功能,请参阅官方内核版本摘要。
Linux 版本- Linux 内核Newbieskernelnewbies.org
现阶段重要的版本有:
3.6.0:开始支持龙芯1;3.8.0:引入调度实体负载跟踪机制(PELT),MIPS系列处理器开始支持透明大页。视频解码(UVD);3.13.0:显着提高NUMA调度性能。 3.14.0:MIPS系列处理器现已支持FP64/O32,并支持龙芯3A1000。 ); 3.16.0:开始引入快速排队读/写锁(qrwlocks)。 3.17.0:新增对龙芯3B1500的支持,新增对MIPS硬件页表遍历器(HTW)的支持。 3.18.0:添加了对使用GCC5 进行内核编译的支持。 4.0.0:开始在线修补(LivePatching)和内核支持。地址净化器(KASan));4.2.0:开始实现高速排队自旋锁(qspinlock),达到2000万行代码。 4.5.0:MIPS开始支持IEEE754-2008标准并引入CGroup_V2。从龙芯3A2000开始,MIPS开始支持可变长度ASID、48位虚拟地址空间、可重定位内核和内核地址空间布局随机化(KASLR),CPUFreq增加了schedutil策略。 4.8.0:开始支持龙芯1C,基于软件MIPS KVM重建内存页面,基于NUMA节点的管理区域。 4.9.0:MIPS开始引入通用内核,并引入TCP拥塞控制算法BBR。 LivePatching 使用的位虚拟地址空间和硬件虚拟化(KVM/VZ)。 每进程一致性模型(最初称为全局一致性模型)。 4.13.0:开始支持龙芯3A3000,MIPS开始支持qspinlock/qrwlock。 X86 开始支持RISC-V,引入了KPTI(解决Meltdown 漏洞)和Retpoline(解决Spectre 漏洞)。 5.0.0:调度器引入了EAS(节能意识)功能,并且完全支持块设备层。已经切换到多队列模型(blk-mq)的AMDGPU显卡驱动支持FreeSync,并且完全支持零拷贝网络。
Linux内核的开发模式
Linux内核开发目前正处于快速发展时期。代码仓库的管理方式有四种:主线仓库、稳定仓库、未来仓库(Linux-next)、子系统仓库(Linux-mips等子系统)两大类,它们的关系如图所示。 2.
图2 Linux内核中的四种代码仓库及其关系
大多数开发人员贡献的代码在进入特定的子系统仓库之前必须首先经过子系统管理员(维护者)的审查。进入子系统仓库后,通过未来仓库进行第二次审查。如果通过审查,最终会进入主仓库(有些情况,以后可能会跳过仓库,直接从子系统仓库进入主仓库)。代码只有进入子系统仓库后才可以说处于alpha状态,但一旦进入主线仓库就达到了beta状态,就相当于达到了RC状态或最终状态。并被正式通过。通过这种多层次、严格的审查,Linux内核的代码质量得到了显着的保证。
下面分别介绍这四种类型的代码仓库。
1.主仓库
主线仓库是最重要的仓库,其升级规则根据两个正式版本之间的小版本号进行升级和演化:
一个正式版本和下一个候选版本之间的时期称为合并窗口期。例如,3.0 和3.1-rc1 之间的时期是3.1 合并窗口。仅允许在合并窗口中添加新功能,其他阶段仅允许修复错误。也就是说,如果开发者想要在3.1内核中引入新功能,就必须确保在3.1-rc1之前引入。如果没有,你所能做的就是等待3.2 合并窗口。
维护者:Linus Torvalds
Git仓库地址:git://http://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
2.稳定的仓库
稳定仓库是基于主线仓库正式版本生成的,并根据修订号进行升级进化。例如3.0.x分支与3.1.x稳定分支仓库的版本演化关系如下:
稳定仓库中的所有代码更改都是错误修复,不会引入新功能。
管理员:Greg Kroah-Hartman 等人。
Git仓库地址:git://http://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git
3.Future(Linux-next)仓库
未来仓库的前身是Linux-mm,由Andrew Morton 维护,代码更改在进入下一个版本的主线内核之前到达。如果说主线仓库在功能上类似于奇偶时代的偶版本(稳定版),那么未来仓库在功能上也将类似于奇偶时代的奇版本(开发版本)。未来仓库版本命名约定是日期,例如next-20151212。未来仓库会不定期合并来自主线仓库的代码,作为新添加的基础代码。
维护者:斯蒂芬·罗斯韦尔
Git仓库地址:git://http://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
4.子系统仓库
子系统仓库有很多,通常按架构(arch)和驱动程序类型(driver)分类。龙芯内核开发者比较关心的两个子系统仓库包括:
MIPS子系统:由Ralf Baechle维护Git仓库地址:git://http://git.kernel.org/pub/scm/linux/kernel/git/ralf/linux.git
GPU子系统:由David Airlie维护Git仓库地址:git://http://people.freedesktop.org/~airlied/linux
与未来仓库一样,子系统仓库随着时间的推移合并来自主线仓库的代码,并将其用作新添加的基础代码。
内核根目录下的MAINTAINERS文件列出了当前所有的Maintainers及其相关信息。例如,MIPS架构下的三个龙芯相关子架构(龙芯1、龙芯2、龙芯3)的Maintainer信息如下:
MAINTAINERS 文件包含子系统的条目。
每个条目的第一行是子系统的描述。例如龙芯1号为MIPS/LOONGSON1架构,龙芯2号为MIPS/LOONGSON2架构,龙芯3号为MIPS/LOONGSON3架构。
以M 开头的行是维护者的姓名和电子邮件地址。龙芯一号的维护者是张克光,龙芯二号的维护者是杨家勋。两人都是开源社区的龙芯爱好者和龙芯维护者。 3 是:010 - 30000 的作者。以L 开头的行是子系统用于开发通信的邮件列表,以S 开头的行指示子系统的维护状态,以F 开头的行是子系统中包含的主要源代码文件的路径。
长期维护稳定版
所谓的长期稳定(LTS)实际上是一种特殊的稳定。稳定版本中的缺陷修订版(Bugfix)实际上是主线版本中的缺陷修订版的向后移植(Backport)。典型的稳定维护时间约为3个月,因此当主线仓库中的下一个版本正式发布时,上一个版本的稳定分支将不再升级(EOL,支持结束)。 LTS 版本的维护期可能需要大约两年或更长时间。同时维护了大约5 个LTS 版本。选择新的LTS 版本后,通常不再升级(EOL) 最旧的LTS。
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。
相关阅读