Linux内核导览与简史

UNIX简史

​ 我们必须先提一嘴Unix操作系统的简史:

​ 1964年贝尔实验室(Bell Labs)、通用电气(General Electric)和麻省理工学院(MIT)联合启动研发第二代分时操作系统MULTICS(Multiplexed Information and Computing Service)(注:MULTICS正式研制始于1965年)

​ 1969年,贝尔实验室研究人员Ken Thompson(对,C语言的发明者之一)在退出MULTICS项目时,准备将原本在MULTICS系统上开发的“star travel”游戏转移到DEC PDP-7上运行。在转移游戏程序运行环境的过程中,Thompson和Dennis M. Ritchie共同动手设计了一套包含文件系统、命令解释器以及一些实用程序的支持多任务的操作系统。与Multics相对应,这个新操作系统被同事Brian Kernighan戏称为UNICS(UNiplexed Information and Computing System,非复用信息和计算机服务),之后大家取谐音便叫成了UNIX。

​ 1970年Thompson尝试用Fortran重写UNIX失败后整合BCPL成B语言,1971年他用B语言在PDP-11/24上重写UNIX,当年的11月3日,UNIX第1版(UNIX V1)正式诞生。

​ 1972年,UNIX发布了第2版,最大的改进是添加了后来成为UNIX标志特征之一的管道功能。在开发UNIX V2的时候,Ritchie给B语言加上了数据类型和结构的支持,推出了C语言。

​ 1973年,Thompson和Ritchie使用C语言重写了UNIX,形成第3版UNIX。在当时,为了实现最高效率,系统程序都是由汇编语言编写,所以Thompson和Ritchie此举是极具大胆创新和革命意义的。用C语言编写的Unix代码简洁紧凑、易移植、易读、易修改,为此后UNIX的发展奠定了坚实基础。

​ 1974年,Thompson和Ritchie合作在ACM通信上发表了一篇关于UNIX的文章,这是UNIX第一次出现在贝尔实验室以外。此后UNIX被政府机关,研究机构,企业和大学注意到,并逐渐流行开来。

​ 1975年,UNIX发布了4、5、6三个版本。1978年,已经有大约600台计算机在运行UNIX。Thompson应邀回母校——加州大学伯克利分校任客座教授,讲授的科目就是UNIX。同年,Bill Joy大学毕业来到伯克利分校。当UNIX V6安装在学校的PDP-11/70机器上后,Joy和他的同事便开始完善Pascal的性能,编写ex编辑器以及csh命令解释器等。1977年初,Joy制作了一卷包含新的Pascal编译器、ex等程序的磁带。这就是1BSD(1st Berkeley Software Distribution)。1983年,4.2BSD发布。它是UNIX历史上第一个包含TCP/IP协议栈以及rcp、rsh、rlogin和rwho等网络工具的系统。

​ 1979年,UNIX V7发布。这是历史上第一个完整意义上的UNIX版本,也是最后一个广泛发布的研究型UNIX版本。20世纪80年代相继发布的8、9、10版本只授权给了少数大学。此后这个方向上的研究导致了九号计划的出现,这是一个新的分布式操作系统。

​ 1980年,美国电话电报公司发布了UNIX的可分发二进制版(Distribution Binary)许可证,启动了将UNIX商业化的计划。

​ 1981年,美国电话电报公司基于UNIX V7开发了UNIX System III 的第一个版本(1982年发布)。这是一个商业版本,仅供出售。

​ 1983年,美国电话电报公司成立了UNIX系统实验室(UNIX System Laboratories,USL),并综合其他大学和公司开发的各种UNIX,开发出UNIX System V Release 1(简称SVR1)。这个新的UNIX商业发布版本不再包含源代码。美国电话电报公司开始积极地保护UNIX的源代码。从发布System III开始,该公司的所有UNIX版本转由一个强调稳定的商业发行版本小组进行维护。

​ 此后,其他一些公司也开始为其自己的小型机或工作站提供商业版本的UNIX系统,有些选择System V作为基础版本,有些则选择了BSD。BSD的一名主要开发者,Bill Joy,在BSD基础上开发了SunOS,并最终创办了SUN公司。

​ 1991年,一群BSD开发者(Donn Seeley、Mike Karels、Bill Jolitz和Trent Hein)离开了加州大学,创办了Berkeley Software Design, Inc (BSDI)。BSDI是第一家在Intel平台上提供全功能商业BSD UNIX的厂商。后来Bill Jolitz离开了BSDI,开始了386BSD的工作。386BSD被认为是FreeBSD、OpenBSD和NetBSD、DragonFlyBSD的先辈。。。

​ 当然,现在流行的操作系统都可以认为是Unix或大或小的变体,我们目前会说——Unix是一个现代的支持进程抢占的多进程的操作系统,它支持虚拟内存,与懒式的按需加载页面和动态加载动态库以及TCP/IP系列的网络通信等现代操作系统所拥有的一系列功能

Linux简史

​ 我们的下一位,也就是Linux的诞生,跟Unix的发展息息相关:有趣的是Linus(是的,这位就是Linux的第一位作者,他那个时候还是一位芬兰大学生)当时并不知道BSD可以被移植到80386微处理器上,买不起工作站的他选择自己手搓一个符合Unix系统标准的操作系统。也就是今天大名鼎鼎的Linux内核,深刻的改变了计算机世界。

​ 关于内核的发展,我放在了最后面的部分作为一个附录的参考。但是可以确定的是,我们熟知的书上的关于阐述经典操作系统的内容他基本上都有

​ 我们当然主要是把目光放在学习Linux0.11(作为入门的理解)和Linux2.6上,他们更加的简单与便于理解。

快速导览

​ 在这里,我将会默认诸位已经学习过操作系统了。或者,如果对一些概念不熟悉,那也没关系。我们将会很快的速通一次基本的内容。

​ 我们来看看《Linux Kernel Development》是如何给操作系统下定义的

The Operating system is considered the parts of the system responsible for base use and administration. This includes the kernel and device drivers, boot loader, command shell and other user interface, and basic file and system utilities. It is the staff you need - not a web browser or music player. The term system, in turn, refers to the OS and all the applications running on top of it.

​ 人话就是:我们将要展开讨论的内核实际上就是给我们在操作系统上做的一切的事情:不管是开命令行裸奔指令还是访问文件修改文件,还是使用构成了今天纷乱复杂的各种各样的私人的公共的计算机服务的根基。没有内核提供的服务,上述事情都是白日梦。他是一切我们看到的浮于表面的应用服务的根基。

内核,也就是我们操作系统的核心,也被叫做监管者(Supervisor)或者是Core,还是其他什么非常凸显他重要性的东西。一个经典的内核组成有:

中断处理句柄(嗯,说白了就是有人得管硬件发出的中断)

调度器(进程调度器,这对多进程的操作系统就是命根子)

内存管理子系统(负责管理虚拟内存分配和处理来自MMU的分配表)

其他基础的系统服务:网络数据处理(其实在上面的中断处理中已经有所包含,但是他的复杂程度值得我们单独谈谈)与跨进程交流(在进程之间交换数据)(IPC, InterProcess Communication

(当然关于虚拟文件系统(VFS)算不算,嗯,我懒得参与意识形态的竞争,这里我姑且按照不算处理,但是仍然会在后续提到)

​ 当然,内核作为真正管理计算机上层建筑访问计算机底层资源的掌管人,具有全权的访问计算机硬件的特权。我的另一层意思很明显了:其他的用户程序(也就是不涉及到可能会使计算机直接崩溃的危险操作)是没有权力直接访问硬件的,他们的Request(服务请求)必须汇报给内核,内核来完成基础的检查后再“代替”上层的软件执行。(PS: 不是空穴来风的说法,爱来自On Behalf Of<Linux Kernel Development>

​ 举个例子:我们打算往Shell上打印依一些字符:任何入门C语言的人,都知道单纯的走一个printf(const char* format, ...)就可以很好的完成这个任务。但事实上,他的调用很复杂,抛开那些更加底层的晦涩的细节,我们只看中间的那一步:write函数调用的那一步,他将会调用一个叫做open的系统调用来打开对一个文件的操作。这里,我们就是向内核请求了服务:歪!帮我打开一个文件!我写东西!我们的内核受到请求之后检查了操作是安全的(不会往邻居家写东西,不会发生未定义的内存访问)后,带着我们的需求完成了我们的操作让程序陷入了内核态(也就是此时此刻是一个更加高级的进程来让我们完成这个操作),完成之后,我们的程序流返回到普通的用户进程,带着已经完成操作的结果继续我们的程序。

​ 内核当然也管理我们的硬件,也就是我们说的处理这些硬件发出来的中断。此时此刻,当我在写这篇博客的时候,我的键盘就在反复的发出中断信号让操作系统处理我的输入,这个就是由实际上的内核代之驱动程序完成。当然,这又不同于单纯的内核态:

用户层次上我们跑的是最低权限的用户代码

在内核非中断态:我们的内核进程就在忙碌的处理各种各样的需求和维护系统的运转

在内核中断态:我们的内核就在处理我们的中断,将外界收集到的数据分发给内核需要的部分进行处理

​ 以上就是简单的内核简介了。

内核版本号说明:

3.10.0-1160.108.1.el7.x86_64

第一个组数字:3, 主版本号
第二个组数字:10, 次版本号,当前为稳定版本
第三个组数字:0, 修订版本号
第四个组数字:1160.108.1,表示发型版本的补丁版本
el7:则表示我正在使用的内核是 RedHat / CentOS 系列发行版专用内核
x86_64:采用的是64位的CPU

也想查看自己的版本号?你可以尝试

uname -r

附录1:内核各个版本的简单论述

内核版本号:0.00,时间:1991.2-4,内核发展情况:两个进程分别显示AAABBB

内核版本号:0.01,时间:1991.9,内核发展情况:第一个正式向外公布的Linux内核版本

内核版本号:0.02,时间:1991.10.5,内核发展情况:LinusTorvalds将当时最初的0.02内核版本发布到了Minix新闻组,很快就得到了反应。LinusTorvalds在这种简单的任务切换机制上进行扩展,并在很多热心支持者的帮助下开发和推出了Linux的第一个稳定的工作版本。

内核版本号:0.03,时间:1991.2-4

内核版本号:0.10,时间:1991.10,内核发展情况:Linux0.10版本内核发布,0.11版本随后在1991年12月推出,当时它被发布在Internet上,供人们免费使用。

内核版本号:0.11,时间:1991.12.8,内核发展情况:基本可以正常运行的内核版本

内核版本号:0.12,时间:1992.1.15,内核发展情况:主要加入对数学协处理器的软件模拟程序

内核版本号:0.95(0.13),时间:1992.3.8,内核发展情况:开始加入虚拟文件系统思想的内核版本

内核版本号:0.96,时间:1992.5.12,内核发展情况:开始加入网络支持和虚拟文件系统

内核版本号:0.97,时间:1992.8.1

内核版本号:0.98,时间:1992.9.29

内核版本号:0.99,时间:1992.12.13

内核版本号:1.0,时间:1994.3.14,内核发展情况:Linux1.0版本内核发布,使用它的用户越来越多,而且Linux系统的核心开发队伍也建起来了。

内核版本号:1.2,时间:1995.3.7

内核版本号:2.0,时间:1996.2.9

内核版本号:2.2,时间:1999.1.26

内核版本号:2.4,时间:2001.1.4,内核发展情况:Linux 2.4.0版本内核发布。

内核版本号:2.6,时间:2003.12.17,内核发展情况:Linux 2.6版本内核发布,与2.4内核版本相比,它在很多方面进行了改进,如支持多处理器配置和64位计算,它还支持实现高效率线和处理的本机POSIX线程库(NPTL)。实际上,性能、安全性和驱动程序的改进是整个2.6.x内核的关键。

内核版本号:2.6.15,时间:2006,内核发展情况:Linux 2.6.15版本内核发布。它对IPv6的支持在这个内核中有了很大的改进。

内核版本号:2.6.30,时间:2009.6,内核发展情况:改善了文件系统、加入了完整性检验补丁、TOMOYOLinux安全模块、可靠的数据报套接字(datagramsocket)协议支持、对象存储设备支持、FS-Cache文件系统缓存层、nilfs文件系统、线程中断处理支持等等。

内核版本号:2.6.32,时间:2009.12,内核发展情况:增添了虚拟化内存de-duplication、重写了writeback代码、 改进了Btrfs文件系统、添加了ATIR600/R7003D和KMS支持、CFQ低传输延迟时间模式、perftimechart工具、内存控制器支持softlimits、支持S+Core架构、支持IntelMoorestown及其新的固件接口、支持运行时电源管理、以及新的驱动。

内核版本号:2.6.34,时间:2010.5,内核发展情况:添加了Ceph和LogFS两个新的文件系统,其中前者为分布式的文件系统,后者是适用于Flash设备的文件系统。Linux Kernel 2.6.34的其他特性包括新的Vhostnet、改进了Btrfs文件系统、对Kprobesjump进行了优化、新的perf功能、RCUlockdep、GeneralizedTTLSecurityMechanism(RFC5082)及privateVLANproxyarp(RFC3069)支持、asynchronous挂起恢复等等。

内核版本号:2.6.36,时间:2010.10,内核发展情况:Tilera处理器架构支持、新的文件通知接口fanotify、Intel显卡上实现KMS和KDB的整合、并行管理工作队列、Inteli3/5平台上内置显卡和CPU的智能电源管理、CIFS文件系统本地缓存、改善虚拟内存的层级结构,提升桌面操作响应速度、改善虚拟内存溢出终结器的算法、整合了AppArmor安全模型(注:与SELinux基于文件的标注不同,AppArmor是基于路径的)。

内核版本号:2.6.37,时间:2011.1.4,内核发展情况:Linux2.6.37包含了对Ext4和XFS的几个SMP可伸缩性改进,一个在禁用大内核锁的情况下编译内核的选项,对每个cgroup IO限制的支持,一个基于Ceph集群文件系统的网络设备,几个Btrfs改进,更有效的静态探测,对探测模块的性能支持和可访问列表本地和全局变量、使用LZO压缩的图像休眠、IPv4支持的PPP、一些网络微优化和许多其他小的更改、改进和新的驱动程序。

内核版本号:2.6.38,时间:2011.3.14,内核发展情况:此版本增加了对自动进程分组(在新闻中称为“wonder patch”)的支持、VFS的显著可扩展性改进、Btrfs LZO压缩和只读快照、对B.a.T.M.a.N.mesh协议(有助于在发生自然灾害、军事冲突或互联网审查时提供网络连接,)、透明的大页面支持(不使用hugetblfs)、在多个cpu上自动传播即将到来的网络流量、支持AMD Fusion apu、许多驱动程序和其他更改。

内核版本号:2.6.39,时间:2011.5.18,内核发展情况:EXT4 SMP的可伸缩性改进,初始TCP拥塞窗口的增加,一种称为Unicore-32的新架构,一种允许创建称为IPset的网络资源组的功能,Btrfs更新,一种允许将崩溃信息存储在固件中的功能,以便在重新引导后恢复它,通过handle syscalls打开,perf更新,以及许多其他的小变化和新的驱动。

内核版本号:3.0,时间:2011.7.21,内核发展情况:除了一个新的版本编号方案,Linux3.0还有几个新的特性:Btrfs数据清理和自动碎片整理,XenDOM0支持,ECHO中没有特权的ICMP,WakeonWLAN,Berkeley包过滤器JIT过滤,一个类似memcached的页面缓存系统,一个对sendmsg()调用和setns()进行批处理的sendmsg()系统调用,一个系统调用允许更好地处理轻量级虚拟化系统,如容器。增加了新的硬件支持:例如,Microsoft Kinect、AMD Llano Fusion APU、Intel iwlwifi 105和135、Intel C600串行连接scsi控制器、Ralink RT5370 USB、多个Realtek RTL81xx设备或Apple iSight网络摄像头。增加了许多其他驱动和小的改进。

内核版本号:3.1,时间:2011.10.24,内核发展情况:支持OpenRISC 开源 CPU,对写回限制的性能改进,slab分配器中的一些加速,新的iSCSI实现,支持用于移动支付的近场通信芯片,通用软件RAID层中的坏块管理,一个新的用于电源管理的“cpupowerutils”用户空间实用程序、默认情况下在ext3中启用的文件系统屏障、Wii遥控器支持和新的驱动程序以及许多小的改进。

内核版本号:3.2,时间:2012.1.4,内核发展情况:此版本包括对大于4KB和小于1MB的ext4块的支持,这将提高大文件的性能;btrfs已更新为更快的清理、关键文件系统元数据的自动备份和用于手动检查文件系统的工具;进程调度器添加了对设置CPU时间上限的支持;在大量写操作的情况下,桌面的响应能力得到了改进,TCP被更新为包括一个算法,该算法可以在丢失数据包后加快连接的恢复;分析工具“perf-top”增加了对任务和库的实时检查的支持,并可以看到带注释的程序集代码;设备映射器增加了对任务和库的支持对于存储的“精简配置”,我们增加了一个新的架构:高通公司的Hexagon DSP处理器。在这个版本中还提供了其他驱动程序以及一些小的改进和修复。

内核版本号:3.3,时间:2012.3.18,内核发展情况:这个版本最重要的特点是合并了Android项目的内核代码。但是,它还包括对新体系结构(TI C6X)的支持、大大改进的平衡和Btrfs中不同RAID配置文件之间的重排能力,以及一些网络改进:为虚拟化场景设计的虚拟交换机实现(Open vSwitch),一种比“绑定”驱动程序更快、更可扩展的替代方案,对网络设备的传输队列进行可配置的限制,以抵抗缓冲区膨胀,网络优先级控制组和每个cgroup的TCP缓冲区限制。也有许多小功能和新的驱动程序和修复程序也可用。

内核版本号:3.4,时间:2012.5.20,内核发展情况:此版本包括几个Btrfs更新:支持大于4KB的元数据块,大大提高了元数据性能,更好的错误处理和更好的恢复工具;还有一个新的X32 ABI,它允许在64位模式下运行带有32位指针的程序;对GPU驱动程序的几项更新:Nvidia GeForce 600“开普勒”的早期模式设置,AMD Radeon 7xxx和AMD Trinity APU系列的支持,以及Intel Medfield graphics的支持;还支持x86 CPU驱动程序自动robing,一个设备映射器目标,它存储块的加密散列以检查入侵,另一个目标是使用外部只读设备作为精简配置的LVM卷的源,一些性能改进,如GTK2报表GUI和新的“Yama”安全模块。也有许多小功能和新的驱动程序和修复程序也可用。

内核版本号:3.5,时间:2012.7.21,内核发展情况:此版本包括对Ext4中的元数据校验和的支持,使用诸如StaseTAP或PERP之类的工具进行性能分析的用户空间探针,沙盘机制允许过滤SysCurts,设计了一种新的网络队列管理算法,用于打击Buffer-BuLAT,支持检查点和恢复TCP连接,支持TCP早期重传(RFC 5827)、支持Android风格的机会挂起、btrfs I/O故障统计以及通过Firewire和USB的SCSI。许多小功能和新的驱动程序和修复程序也可用。

内核版本号:3.6,时间:2012.9.30,内核发展情况:这个Linux版本在Btrfs中包含了一些新特性:子卷配额、配额组和快照差异(也称为“发送/接收”)。它还包括支持同时挂起到磁盘和内存、TCP“快速打开”模式、“TCP小队列”功能以防止缓冲区膨胀;支持通过NFS/NBD进行安全交换、更好的Ext4配额支持、支持PCIe D3cold电源状态;以及VFIO,允许从客户机驱动程序安全访问裸机主机设备。许多小功能和新的驱动程序和修复程序也可用。

内核版本号:3.7,时间:2012.12.10,内核发展情况:此Linux版本包括对ARM 64位体系结构的支持,ARM支持使用同一内核引导到不同系统,签名的内核模块,Btrfs支持使用chattr和faster fsync()在每个文件的基础上禁用写时拷贝,这是一个模仿strace的新“perf trace”工具,支持服务器端的TCP快速打开功能、实验性的SMBv2协议支持、稳定的NFS4.1和并行的NFS支持、允许通过UDP传输第2层以太网数据包的新隧道协议,以及支持Intel“管理器模式访问保护”(SMAP)安全功能。许多小功能和新的驱动程序和修复程序也可用。

内核版本号:3.8,时间:2013.2.18,内核发展情况:这个Linux版本在Ext4中支持在inode中嵌入非常小的文件,这大大提高了这些文件的性能并节省了一些磁盘空间。还有一个新的Btrfs特性,允许快速替换磁盘,一个为ssd优化的新文件系统F2FS,支持文件系统挂载,UTS,IPC,PIDs,以及为没有特权的用户提供的网络堆栈名称空间,内存资源控制器中的内核内存,XFS中的日志校验和,改进的NUMA策略重新设计和取消了对386处理器的支持。许多小功能和新的驱动程序和修复程序也可用。

内核版本号:3.9,时间:2013.4.28,内核发展情况:这个Linux版本包括对实验性RAID5/6模式的支持,以及对Btrfs中快照共享的文件进行更好的碎片整理;对Android SDK使用的“金鱼”模拟器的支持,能够将固态硬盘存储作为缓存设备;两个新的架构端口:Synopsys ARC 700和Meta Imagination处理器;ARM中的KVM虚拟化支持体系结构,一个Intel驱动程序,它“注入”空闲状态以提高每瓦特的性能,支持Chrome OS笔记本电脑,一个新的挂起电源状态,并删除过时的配置实验配置选项。许多小功能和新的驱动程序和修复程序也可用。

内核版本号:3.10,时间:2013.6.30,内核发展情况:此版本增加了对bcache的支持,它允许使用SSD设备缓存来自其他块设备的数据;Btrfs格式的改进,使专用于存储数据块信息的树小30-35%;支持XFS元数据校验和自描述元数据、无时钟多任务、SysV IPC,rwlock和mutex可伸缩性改进,减少短事务尾部延迟的TCP尾部丢失探测算法,MIPS体系结构中的KVM虚拟化支持,混合不同类型cpu的ARM big.LITTLE体系结构,跟踪快照,新驱动程序和许多小改进。

内核版本号:3.11,时间:2013.9.2,内核发展情况:此版本增加了对一个新的O_TMPFILE open(2)标志的支持,该标志允许轻松创建安全的临时文件,自r600以来所有Radeon GPU的实验性动态电源管理,对NFS4.2和标记为NFS的SELinux的初步支持,对Lustre分布式文件系统的实验性支持,对程序写入的页的详细跟踪,ARM对ARM64的巨大页面支持和KVM/Xen支持,SYSV IPC消息队列可伸缩性改进,低延迟网络轮询机制,压缩交换缓存,新驱动程序和许多小改进。

内核版本号:3.12,时间:2013.11.2,内核发展情况:此版本增加了对Btrfs中离线重复数据消除的支持,双GPU笔记本电脑中的自动GPU切换,对AMD Radeon图形的性能提升,更好的RAID-5多核性能,改进了对内存不足情况的处理,改进了VFS路径名分辨率的可扩展性,改进了无时间多任务模式,在图形DRM层中独立的模式设置和渲染设备节点,改进了虚拟化客户机的锁定性能,XFS目录递归可伸缩性改进,IPC可伸缩性改进,tty层锁定改进,新驱动程序和许多小的改进。

内核版本号:3.13,时间:2013.4.28,内核发展情况:此版本包括nftables,iptables的后续产品,为高性能固态硬盘设计的块层的改进,英特尔RAPL设备功耗上限框架,改进的squashfs性能,默认启用的AMD Radeon电源管理和自动Radeon GPU交换,改进的NUMA性能,改进的性能与庞大的网页工作负载,TCP快速开放默认启用,支持NFC支付,支持高可用性无缝冗余协议,新的驱动程序和许多其他小的改进。

内核版本号:3.14,时间:2014.5.30,内核发展情况:此版本包括实时任务的截止时间任务调度策略、内存压缩机制现在被认为是稳定的、锁定验证器到用户空间的端口、存储属性(如Btrfs中每个inode的压缩)的能力、对跟踪事件的触发器支持、对用户空间探测的改进,内核地址空间随机化,TCP自动合并某些类型的连接,一个新的网络包调度程序来对抗缓冲区膨胀,新的驱动程序和许多其他小的改进。

内核版本号:3.15,时间:2014.6.8,内核发展情况:这个版本在有硬盘的系统中恢复得更快,它增加了对原子交叉重命名两个文件的支持,它增加了新的fallocate(2)模式,允许删除一个文件的范围或将其设置为零,它增加了一个新的文件锁定API,内存管理更好地适应工作集大小的变化,它提高了FUSE写性能,它还增加了支持zram中的LZ4算法,允许从32位EFI固件加载64位内核,增加了对即将加入英特尔CPU的AVX-512矢量指令的支持,增加了新的驱动程序和许多其他小改进。

内核版本号:3.16,时间:2014.8.3,内核发展情况:此版本通过支持动态切换Nvidia卡上的时钟频率来提高性能,它还支持将用户空间内存映射到Intel设备上的GPU,XFS有一个免费的inode btree用于更快的inode分配,ARM64内核可以用作EFI存根,IPv6支持TCP Fast Open,一些radeon设备有更好的性能得益于改进的电源管理支持,支持Intel Cherryview图形,控制组获得了可选的统一层次结构模式,还添加了新的驱动程序和许多其他小的改进。

内核版本号:3.17,时间:2014.10.5,内核发展情况:此版本增加了对IP上USB设备共享的支持,对Xbox One控制器的支持,对Apple的thunderbolt的支持,一个新的sealing API,它限制了对共享内存文件描述符的操作,使开发人员可以更容易地进行共享内存编程,支持perf trace中的页面故障跟踪,在kexec中只支持使用有符号的内核、getrandom()系统调用以生成更安全的随机数以及图形“渲染节点”不再是实验性的。也有新的驱动和许多其他小的改进。

内核版本号:3.18,时间:2014.12.7,内核发展情况:此版本增加了对overlayfs的支持,它允许在单个装载点组合两个文件系统;支持将用户空间内存映射到Radeon设备上的GPU,一个bpf()系统调用,它允许上载可附加到事件的类似bpf的程序;一个为数据中心优化的TCP拥塞算法;Geneve虚拟化封装,支持在UDP上嵌入IP协议,通过批处理套接字缓冲区提高网络性能,以及可选的多队列SCSI支持。也有新的驱动和许多其他小的改进。

内核版本号:3.19,时间:2015.2.8,内核发展情况:此版本增加了对Btrfs清理和用RAID 5和6快速替换设备的支持,对帮助阻止缓冲区溢出的Intel内存保护扩展的支持,对AMD HSA体系结构的支持,对调试ARM Coresight子系统的支持,对Altera Nios II CPU体系结构的支持,用于路由和交换卸载的网络基础设施、有助于支持Beaglebone或Raspberry Pi等消费者开发板上的扩展总线的设备树覆盖、NFSv4.2中对穿孔和预分配的支持,以及Android活页夹已从暂存区移到稳定区。也有新的驱动和许多其他小的改进。

内核版本号:4.0,时间:2015.4.12,内核发展情况:此版本增加了对内核代码进行实况补丁的支持,主要目的是在不重启的情况下修复安全更新;DAX,当文件系统在具有持久内存存储的系统上运行时,避免使用内核缓存的方法;KASAN,一种动态内存错误检测器,允许在空闲和越界bug之后找到使用;lazytime,relatime的一种替代方法,它只会在缓存中进行访问、修改和更改时间更新,并有机会写入磁盘;允许overlayfs具有多个较低层,支持并行NFS服务器体系结构;以及dm-crypt CPU可伸缩性的改进。也有新的驱动和许多其他小的改进。

内核版本号:4.1,时间:2015.6.21,内核发展情况:此版本增加了对Ext4加密的支持,对管理群集raid阵列的实验性支持,一个记录所有对设备的写入并允许重放它们的新设备映射器目标,一个在块设备中打开持久性内存系统中的内存的驱动程序,对禁用多用户支持的支持,支持基于路径标签而不是长网络地址路由数据包的多协议标签交换,允许将BPF程序附加到kprobes以进行更好的探测,ACPI支持ARM64体系结构,以及允许改进软件rasterizer的虚拟GEM驱动程序。也有新的驱动和许多其他小的改进。

内核版本号:4.2,时间:2015.8.30,内核发展情况:此版本为现代AMD Radeon硬件添加了一个新的amdgpu驱动程序,一个使用客户机内部主机GPU功能的virtio GPU驱动程序,新的原子模式设置图形API已声明稳定,支持堆叠安全模块,更快和更可扩展的自旋锁实现,cgroup写回支持,以及重新引入H8/300架构。也有新的驱动程序和许多其他小的改进。

内核版本号:4.3,时间:2015.11.1,内核发展情况:此版本删除ext3文件系统,并保留Ext4作为主Ext文件系统,Ext4还可以挂载ext3文件系统;它还添加了userfaultfd(),一个用于处理用户空间中的页面错误的系统调用;membarrier(),一个用于在一组线程上发出内存屏障的系统调用;一个用于限制cgroup中的PID数量的PID控制器,更易于使用的“环境”功能;空闲页跟踪,更精确地跟踪应用程序使用的内存;支持IPv6标识符定位器寻址;网络轻量级通道、虚拟路由和转发精简版支持,以及许多其他改进和新驱动程序。

内核版本号:4.4,时间:2016.1.10,内核发展情况:此版本增加了对虚拟GPU驱动程序中3D支持的支持,该驱动程序允许虚拟化客户机中的3D硬件加速图形;对直接I/O和异步I/O的循环设备支持,该支持节省内存并提高性能;对开放通道ssd的支持,该设备共享Flash转换层的职责在操作系统中,TCP侦听器处理是完全无锁的,允许更快和更可扩展的TCP服务器;MD层中的日志RAID5修复了RAID写入漏洞;eBPF程序现在可以由没有特权的用户运行,它们可以被持久化,perf还增加了对eBPF程序的支持;一个新的mlock2()系统调用,允许用户请求在页面错误时锁定内存;并阻止轮询支持,以提高高端存储设备的性能。也有新的驱动和许多其他小的改进。

内核版本号:4.5,时间:2016.3.13,内核发展情况:此版本添加了一个新的copyfilerange(2)系统调用,允许在不通过用户空间传输数据的情况下复制文件;现代Radeon GPU的实验性Powerplay电源管理;Btrfs可用空间处理的可扩展性改进;支持GCC的未定义行为Sanitizer(-fsanitize=Undefined);设备映射器的verity目标中的转发错误更正支持;在madvise()中支持MADVFREE标志;新的cgroup统一层次结构被认为是稳定的;SOREUSEPORT UDP套接字的可伸缩性改进;epoll的可伸缩性改进,以及内存控制器中套接字的更好的内存计算。也有新的驱动和许多其他小的改进。

内核版本号:4.6,时间:2016.5.15,内核发展情况:此版本增加了对USB 3.1 SuperSpeedPlus(10 Gbps)的支持、新的分布式文件系统OrangeFS、更可靠的内存不足处理、对Intel内存保护密钥的支持、使应用层协议实现更简单和更快的功能、对802.1AE MAC级加密(MACsec)的支持、对V版的支持BATMAN协议的一个OCFS2在线inode检查器,支持cgroup名称空间,支持pNFS SCSI布局,以及许多其他改进和新的驱动程序。

内核版本号:4.7,时间:2016.7.24,内核发展情况:此版本增加了对最近RADON RX 480 GPU的支持,支持同一目录中的并行路径名查找,一个新的实验“SeeDuuls’频率调速器,它应该比现有的管理者更快和更精确,支持EFI ‘Capsule’升级固件的机制,支持USB/IP中的虚拟USB设备,使模拟的手机像真正的USB设备一样工作;新的安全模块“LoadPin”,确保所有内核模块都从同一个文件系统加载;在ftrace接口中创建事件直方图的接口;支持将BPF程序附加到内核跟踪点;支持调用链perf trace实用程序中的事件,对Android的sync_文件围栏机制的稳定支持,以及许多其他改进和新的驱动程序。

内核版本号:4.8,时间:2016.10.2,内核发展情况:此版本增加了对在页面缓存中使用透明的大页面的支持,对eXpress Data Path的支持,这是一个高性能、可编程的网络数据路径;对XFS反向映射的支持,它是几个即将推出的功能的构建块;使用强化的usercopy对内存副本进行更严格的检查;支持IPv6安全标签(CALIPSO,RFC 5570);GCC插件支持;virtio vsocks,以方便客户/主机通信;新的Vegas TCP拥塞控制算法;文档已移动到reStructuredText格式,以及许多其他改进和新驱动程序。

内核版本号:4.9,时间:2016.12.11,内核发展情况:这个版本增加了对共享扩展数据块(cp——reflink支持)和XFS上的写时拷贝支持;虚拟映射的内核栈使内核更加可靠和安全;一个更高效的BPF分析器,使Linux部分地支持Dtrace;基于带宽测量而非数据包丢失的新的可选BBR-TCP拥塞控制算法;使用保护密钥硬件功能的系统调用;对Ara项目中的Greybus总线的支持;用于检测固件引起的延迟的硬件延迟跟踪程序,以及许多其他改进和新的驱动程序。

内核版本号:4.10,时间:2017.2.19,内核发展情况:此版本增加了对虚拟化GPU的支持,一个用于NUMA系统中缓存行冲突分析的新“perf c2c”工具,一个用于任务调度详细历史记录的新“perf sched timehist”命令,改进的写回管理应该使系统在重写负载下更具响应性,一个新的混合块轮询方法使用更少CPU比纯轮询,支持ARM设备,如Nexus5&6或Allwinner A64,允许将eBPF程序附加到cGroup的功能,一个实验性的MD RAID5写回缓存,支持Intel缓存分配技术,以及许多其他改进和新驱动程序。

内核版本号:4.11,时间:2017.4.30,内核发展情况:此版本增加了对多队列块层中可插入IO调度程序框架的支持,在关闭write hole的MD RAID5实现中的日志支持,对在SSD中放置的交换进行更可扩展的交换实现,一个新的STATx()系统调用,解决了stat()的缺陷,作为ftrace接口前端的新perf ftrace工具,对实现OPAL存储规范的驱动器的支持,对RFC7609中定义的共享内存通信RDMA协议的支持,所有VGA控制台的持久滚动缓冲区,以及许多新的驱动程序和其他改进。

内核版本号:4.12,时间:2017.7.2,内核发展情况:此版本包括一个新的BFQ I/O调度程序,它提供了更好的交互体验;它还包括对Radeon RX Vega图形卡的初步支持和对USB Type-C连接器的支持;对实时内核修补功能的改进,对允许关闭RAID5 write hole的Intel IMSM部分奇偶校验日志的支持;支持将OpenChannel ssd公开为设备块,并支持另一个I/O调度程序Kybe,它允许为读写配置延迟目标。

内核版本号:4.13,时间:2017.9.3,内核发展情况:这个版本增加了Ext4对大量目录项的支持,Ext4对64k以下扩展属性的支持,异步I/O的改进,后台写入的错误处理的改进,块层的错误处理的改进,内核TLS加速,以及许多其他改进。

内核版本号:4.14,时间:2017.11.12,内核发展情况:此版本包括支持x86硬件中更大的内存限制(128PiB虚拟地址空间,4PiB物理地址空间);支持AMD安全内存加密;提供更好内核跟踪和更小内核大小的新放卷机;一种cgroup“线程模式”,允许在一组进程的线程之间分配资源;对zstd压缩算法的支持已添加到Btrfs和Squashfs中;支持从用户内存到套接字的数据零拷贝;更好的异步缓冲I/O支持;支持未来GPU所需的异构内存管理;在某些情况下更好的cpufreq行为;使用PCID CPU特性的更长生命周期的TLB条目;异步非阻塞缓冲读取;以及许多新的驱动程序和其他改进。

内核版本号:4.15,时间:2018.1.28,内核发展情况:除了处理Meltdown/Spectre的最新代码外,此版本还包括amdgpu驱动程序的模式设置和高级显示功能;改进了对具有SATA积极链路电源管理的系统的电源管理支持;开放RISC-V cpu的端口;对AMD cpu中虚拟内存加密的初始支持;对Intel的支持用户模式指令预防功能;cgroups v2中对CPU控制器的支持;允许直接写入由文件系统管理的持久内存的新mmap(2)标志;以及许多新的驱动程序和其他改进。

内核版本号:4.16,时间:2018.4.1,内核发展情况:除了处理CPU安全漏洞的最新代码外,此版本还宣布反向映射和reflink功能稳定,membarrier(2)添加了快速支持,SMB3 Direct(RDMA)支持,添加了x86 jailhouse hypervisor,它能够静态地将多核系统划分为多个所谓的单元,支持PowerPC内存保护密钥、AMD安全加密虚拟化的管理程序部分,以及许多新的驱动程序和其他改进。

内核版本号:4.17,时间:2018.6.3,内核发展情况:此版本增加了对AMD Radeon Vega 12的支持,并在支持的AMD Radeon GPU中默认启用“显示代码”;还添加了内核TLS接收路径;更有效的空闲循环,防止CPU在shallow idle states下花费太多时间;删除了八个未维护的体系结构,另一个,添加了Andes NDS32体系结构;XFS获得了lazytime支持;修改了CPU负载估计;支持Intel Cannonlake gpu并添加了内核内存一致性模型;以及许多新的驱动程序和其他改进。

内核版本号:4.18,时间:2018.8.12,内核发展情况:此版本包括新的“可重新启动序列”系统调用,它使编写可扩展的用户空间代码变得更容易;对未授权的装载的支持;旨在使用BPF提供netfilter功能的bpfilter项目的开始;零拷贝TCP接收API;对高性能网络的新AF-XDP地址系列的支持;对高通Snapdragon 845 SoC的支持;以及许多新驱动程序和其他改进的支持。

内核版本号:4.19,时间:2018.10.22,内核发展情况:此版本还增加了:CAKE network queue management用于对抗bufferbloat,其设计初衷是为了从最慢的ISP链路和路由器中挤出最大的带宽和延迟;支持保证cGroup的最小I/O延迟目标;对未来Wi-Fi 6(802.11ax-drafts)的实验性支持;overlayfs用户的内存使用得到了改进;一个实验性的、为只读使用而优化的EROFS文件系统;一个新的异步I/O轮询接口;支持避免对攻击者控制的FIFO或世界上可写的粘性目录中的常规文件的无意写入;支持一个Intel特性,它将部分CPU缓存锁定为一个应用程序;以及许多新的驱动程序和其他改进。

内核版本号:4.20,时间:2018.12.23,内核发展情况:此版本包括对测量系统负载的新方法的支持;它增加了对未来AMD Radeon Picasso和Raven2的支持,并启用了对Radeon Vega20的非实验性支持;它增加了对C-SKY CPU体系结构和x86 Hygon Dhyana CPU的支持;TLB微优化在某些工作负载中带来了小的性能优势;TCP已经切换到“提前离开时间”模式;一种将memfd区域转换为dma buf的机制允许qemu改进虚拟化图形性能;它还包括针对CPU安全漏洞的最新一轮修复;它还添加了许多新的驱动程序和其他改进。

内核版本号:5.0,时间:2019.3.3,内核发展情况:此版本包括对energy-aware调度的支持,该调度将任务唤醒到phone中更节能的CPU;它还包括对低功耗设备的adiantum文件系统加密;它增加了对amdgpu驱动程序中AMD Freesync(可变刷新率)的支持;它增加了对UDP中接收卸载和MSG_ZEROCOPY支持的支持;它增加了对ARM指针认证的支持;它增加了对cgroupv2中的cpuset资源控制器(它可以约束任务的CPU和内存节点位置)的支持;它增加了对binderfs的命名空间支持,它允许运行多个android实例;它增加了对btrfs中交换文件的支持;它还增加了许多新的驱动因素和其他改进。

内核版本号:5.1,时间:2019.5.5,内核发展情况:此版本包括用于异步I/O的高性能接口io_uring;它还增加了fanotify的改进,以提供在大型文件系统上监视更改的可伸缩方式;它增加了一种方法,允许在PID重用的情况下安全地传递信号;持久内存现在可以用作热插拔RAM;Zstd压缩级别可以在Btrfs中配置;它还添加了一个新的cpuidle调控器,比菜单调控器做出更好的电源管理决策;所有32位体系结构都添加了处理y2038问题所需的系统调用;现在可以在没有initramfs的情况下引导到设备映射器设备;而实时补丁增加了对创建累积补丁的支持。一如既往,还有许多其他新的驱动因素和改进。

内核版本号:5.2,时间:2019.7.7,内核发展情况:此版本包括Sound Open Firmware,这是一个将开源固件引入到DSP音频设备的项目;还包括许多英特尔产品的开放固件。此版本还改进了Pressure Stall Information资源监控,使其可供Android使用;通过新的系统调用重新设计了mount API;BFQ I/O调度程序获得了一些性能改进;新的CLONEPIDFD标志允许CLONE(2)返回PIDFDsend_signal(2)可用的pidfs;Ext4已经获得了对不区分大小写的名称查找的支持;还有一个新的设备映射器目标,它模拟有失败扇区和/或读取失败的设备;已经添加了ARM Mali t4xx和更新的6xx/7xx的开源驱动程序。一如既往,有最新的CPU错误(MDS)和许多其他新的驱动程序和改进。

内核版本号:5.3,时间:2019.9.15,内核发展情况:此版本包括对AMD Navi gpu的支持;对umwait x86指令的支持,该指令允许进程在短时间内等待而无需spinning loops;一种“利用率限制”机制,用于增强手机中使用的功率不对称cpu的交互性;一个新的PIDFDXOPEN(2)系统调用,完成了让用户处理PID重用问题的工作;在0.0.0.0/8范围内提供了16百万个新的IPv4地址;支持Zaxin x86 CPU;支持英特尔速度选择,以便在Xeon服务器中更容易地进行电源选择;以及支持轻量级管理程序ACRN,这是为嵌入式物联网设备构建的。一如既往,还有许多其他新的驱动和改进。

内核版本号:5.4,时间:2019.11.24,内核发展情况:此版本包括kernel lockdown mode,旨在加强UID 0和内核之间的边界;virtio fs,一个高性能virtio驱动程序,它允许一个虚拟化的客户机去装载已导出到主机上的目录;fs-verity,用于检测文件篡改,如dm-verity,但是可以在文件上工作,而不是在块设备上工作;dm-clone允许对dm目标进行实时克隆;两个新的madvise()标志用于改进Android上的应用程序内存管理,支持新的Intel/AMD gpu,支持exfat文件系统,并删除EROFS文件系统的实验状态;一个新的haltpoll cpuidle驱动程序和调控器,大大提高了虚拟化客户机在空闲循环中进行客户机端轮询的性能;blk-iocost,一个I/O cgroup控制器,试图更准确地计算I/O的成本。一如既往,还有许多其他新的驱动和改进。

由此可见,Linux内核不断支持新的功能,不断变得更加的复杂。

Reference

UNIX操作系统发展史简介 (qq.com)

第二期-Linux内核发展史(1) - 知乎 (zhihu.com)