《Linux设备驱动开发详解 A》一一3.1 Linux内核的发展与演变

简介:

本节书摘来华章计算机出版社《Linux设备驱动开发详解 A》一书中的第3章,第3.1节,作者:宋宝华 更多章节内容可以访问云栖社区“华章计算机”公众号查看。1

3.1 Linux内核的发展与演变

Linux操作系统是UNIX操作系统的一种克隆系统,是一种类UNIX操作系统,诞生于1991年10月5日(第一次正式向外公布的时间),起初的作者是Linus Torvalds。Linux操作系统的诞生、发展和成长过程依赖着5个重要支柱:UNIX操作系统、Minix操作系统、GNU计划、POSIX标准和Internet。
1.?UNIX操作系统
UNIX 操作系统是美国贝尔实验室的Ken. Thompson和Dennis Ritchie于1969年夏在DEC PDP-7小型计算机上开发的一个分时操作系统。Linux操作系统可看作UNIX操作系统的一个克隆版本。
2.?Minix操作系统
Minix操作系统也是UNIX的一种克隆系统,它于1987年由著名计算机教授Andrew S. Tanenbaum开发完成。有开放源代码的Minix系统的出现在全世界的大学中刮起了学习UNIX系统的旋风。Linux刚开始就是参照Minix系统于1991年开发的。
3.?GNU计划
GNU计划和自由软件基金会(FSF)是由Richard M. Stallman于1984年创办的,GNU是“GNU's Not UNIX”的缩写。到20世纪90年代初,GNU项目已经开发出许多高质量的免费软件,其中包括emacs编辑系统、bash shell程序、gcc系列编译程序、GDB调试程序等。这些软件为Linux操作系统的开发创造了一个合适的环境,是Linux诞生的基础之一。没有GNU软件环境,Linux将寸步难行。因此,严格来说,“Linux”应该称为“GNU/Linux”系统。
下面从左到右依次为前文所提到的5位大师Linus Torvalds、Dennis Ritchie、Ken. Thompson、Andrew S. Tanenbaum、Richard M. Stallman。但愿我们能够追随大师的足迹,让自己不断地成长与进步。Linus Torvalds的一番话甚为有道理:“Most good programmers do programming not because they expect to get paid or get adulation by the public, but because it is fun to program.”技术成长的源动力应该是兴趣而非其他,只有兴趣才可以支撑一个人持续不断地十年如一日地努力与学习。Linus Torvalds本人,虽然已经是一代大师,仍然在不断地管理和合并Linux内核的代码。这点,在国内浮躁的学术氛围之下,几乎是不可思议的。我想,中国梦至少包含每个码农都可以因为技术成长而得到人生出彩的机会。
image

4.?POSIX标准
POSIX(Portable Operating System Interface,可移植的操作系统接口)是由IEEE和ISO/IEC开发的一组标准。该标准基于现有的UNIX实践和经验完成,描述了操作系统的调用服务接口,用于保证编写的应用程序可以在源代码级上在多种操作系统中移植。该标准在推动Linux操作系统朝着正规化发展,是Linux前进的灯塔。
5.?互联网
如果没有互联网,没有遍布全世界的无数计算机骇客的无私奉献,那么Linux最多只能发展到Linux 0.13(0.95)版本的水平。从Linux 0.95版开始,对内核的许多改进和扩充均以其他人为主了,而Linus以及其他维护者的主要任务开始变成对内核的维护和决定是否采用某个补丁程序。
表3.1描述了Linux操作系统重要版本的变迁历史及各版本的主要特点。
image

Linux内核通常以2~3个月为周期更新一次大的版本号,如Linux 2.6.34是在2010年5月发布的,Linux 2.6.35的发布时间则为2010年8月。Linux 2.6的最后一个版本是Linux 2.6.39,之后Linux内核过渡到Linux 3.0版本,同样以2~3个月为周期更新小数点后第一位。因此,内核Linux 3.x时代,Linux 3和Linux 2.6的地位对等,因此,Linux 2.6时代的版本变更是Linux 2.6.N~2.6.N+1以2~3个月为周期递进,而Linux 3.x时代后,则是Linux 3.N~3.N+1以2~3个月为周期递进。Linux 3.x的最后一个版本是Linux 3.19。
在Linux内核版本发布后,还可以进行一个修复bug或者少量特性的反向移植(Backport,即把新版本中才有的补丁移植到已经发布的老版本中)的工作,这样的版本以小数点后最后一位的形式发布,如Linux 2.6.35.1、Linux 2.6.35.2、Linux 3.10.1和Linux 3.10.2等。此类已经发布的版本的维护版本通常是由Greg Kroah-Hartman等人进行管理的。Greg Kroah-Hartman是名著LDD3(《Linux设备驱动(第3版)》的作者之一。
关于Linux内核从Linux 2.6.39变更为Linux 3.0的变化,按照Linus Torvalds的解释,并没有什么大的改变:“NOTHING. Absolutely nothing. Sure, we have the usual two thirds driver changes, and a lot of random fixes, but the point is that 3.0 is just about renumbering, we are very much not doing a KDE-4 or a Gnome-3 here. No breakage, no special scary new features, nothing at all like that.”因此,简单来说,版本号变更为“3.x”的原因就是“我喜欢”。
关于Linux内核每一个版本具体的变更,可以参考网页http://kernelnewbies.org/LinuxVersions,比如Linux 3.15针对Linux 3.14的变更归纳在:http://kernelnewbies.org/Linux_3.15
就在本书写作的过程中,2015年2月23日,也迎来了Linux 4.0-rc1的诞生,而理由仍然是那么“无厘头”:

.. after extensive statistical analysis of my G+ polling, I've come to
   the inescapable conclusion that internet polls are bad.
   
   Big surprise.
   
   But "Hurr durr I'ma sheep" trounced "I like online polls" by a 62-to-38%
   margin, in a poll that people weren't even supposed to participate in.
   Who can argue with solid numbers like that? 5,796 votes from people who
   can't even follow the most basic directions?
   
   In contrast, "v4.0" beat out "v3.20" by a slimmer margin of 56-to-44%,
   but with a total of 29,110 votes right now.
   
   Now, arguably, that vote spread is only about 3,200 votes, which is less
   than the almost six thousand votes that the "please ignore" poll got, so
   it could be considered noise.
   
   But hey, I asked, so I'll honor the votes.

从表3.1可以看出,Linux的开发一直朝着支持更多的CPU、硬件体系结构和外部设备,支持更广泛领域的应用,提供更好的性能这3个方向发展。按照现在的状况,Linux内核本身基本没有大的路线图,完全是根据使用Linux内核的企业和个人的需求,被相应的企业和个人开发出来并贡献给Linux产品线的。简单地说,Linux内核是一个演变而不是一个设计。关于Linux的近期热点和走向,可以参考位于http://www.linuxfoundation.org/news-media/lwf 的《Linux Weather Forecast》。
除了Linux内核本身可提供免费下载以外,一些厂商封装了Linux内核和大量有用的软件包、中间件、桌面环境和应用程序,制定了针对桌面PC和服务器的Linux发行版(Distro),如Ubuntu、Red Hat、Fedora、Debian、SuSe、Gentoo等,国内的红旗Linux开发商中科红旗则已经宣布倒闭。
再者,针对嵌入式系统的应用,一些集成和优化内核、开发工具、中间件和UI框架的嵌入式Linux被开发出来了,例如MontaVista Linux、Mentor Embedded Linux、MeeGo、Tizen、Firefox OS等。
Android采用Linux内核,但是在内核里加入了一系列补丁,如Binder、ashmem、wakelock、low memory killer、RAM_CONSOLE等,目前,这些补丁中的绝大多数已经进入Linux的产品线。
图3.1显示了Linux 2.6.13以来每个内核版本参与的人、组织的情况以及每次版本演进的时候被改变的代码行数和补丁的数量。目前每次版本升级,都有分布于200多个组织超过1000人提交代码,被改变的代码行数超过100万行,补丁数量达1万个。

image

相关文章
|
11天前
|
Linux C语言
Linux内核队列queue.h
Linux内核队列queue.h
|
30天前
|
Shell Linux C语言
【Shell 命令集合 系统设置 】⭐Linux 卸载已加载的内核模块rmmod命令 使用指南
【Shell 命令集合 系统设置 】⭐Linux 卸载已加载的内核模块rmmod命令 使用指南
29 1
|
4天前
|
算法 Linux 调度
深入理解Linux内核的进程调度机制
【4月更文挑战第17天】在多任务操作系统中,进程调度是核心功能之一,它决定了处理机资源的分配。本文旨在剖析Linux操作系统内核的进程调度机制,详细讨论其调度策略、调度算法及实现原理,并探讨了其对系统性能的影响。通过分析CFS(完全公平调度器)和实时调度策略,揭示了Linux如何在保证响应速度与公平性之间取得平衡。文章还将评估最新的调度技术趋势,如容器化和云计算环境下的调度优化。
|
9天前
|
算法 Linux 调度
深度解析:Linux内核的进程调度机制
【4月更文挑战第12天】 在多任务操作系统如Linux中,进程调度机制是系统的核心组成部分之一,它决定了处理器资源如何分配给多个竞争的进程。本文深入探讨了Linux内核中的进程调度策略和相关算法,包括其设计哲学、实现原理及对系统性能的影响。通过分析进程调度器的工作原理,我们能够理解操作系统如何平衡效率、公平性和响应性,进而优化系统表现和用户体验。
19 3
|
16天前
|
Linux API C语言
FFmpeg开发笔记(一)搭建Linux系统的开发环境
本文指导初学者如何在Linux上搭建FFmpeg开发环境。首先,由于FFmpeg依赖第三方库,可以免去编译源码的复杂过程,直接安装预编译的FFmpeg动态库。推荐网站<https://github.com/BtbN/FFmpeg-Builds/releases>提供适用于不同系统的FFmpeg包。但在安装前,需确保系统有不低于2.22版本的glibc库。详细步骤包括下载glibc-2.23源码,配置、编译和安装。接着,下载Linux版FFmpeg安装包,解压至/usr/local/ffmpeg,并设置环境变量。最后编写和编译简单的C或C++测试程序验证FFmpeg环境是否正确配置。
35 8
FFmpeg开发笔记(一)搭建Linux系统的开发环境
|
16天前
|
负载均衡 算法 Linux
深度解析:Linux内核调度器的演变与优化策略
【4月更文挑战第5天】 在本文中,我们将深入探讨Linux操作系统的核心组成部分——内核调度器。文章将首先回顾Linux内核调度器的发展历程,从早期的简单轮转调度(Round Robin)到现代的完全公平调度器(Completely Fair Scheduler, CFS)。接着,分析当前CFS面临的挑战以及社区提出的各种优化方案,最后提出未来可能的发展趋势和研究方向。通过本文,读者将对Linux调度器的原理、实现及其优化有一个全面的认识。
|
16天前
|
Ubuntu Linux
Linux查看内核版本
在Linux系统中查看内核版本有多种方法:1) 使用`uname -r`命令直接显示版本号;2) 通过`cat /proc/version`查看内核详细信息;3) 利用`dmesg | grep Linux`显示内核版本行;4) 如果支持,使用`lsb_release -a`查看发行版及内核版本。
36 6
|
19天前
|
Linux 内存技术
Linux内核读取spi-nor flash sn
Linux内核读取spi-nor flash sn
14 1
|
26天前
|
存储 网络协议 Linux
【Linux 解惑 】谈谈你对linux内核的理解
【Linux 解惑 】谈谈你对linux内核的理解
23 0
|
30天前
|
存储 Linux Shell
【Shell 命令集合 系统设置 】Linux 显示Linux内核模块的详细信息 modinfo命令 使用指南
【Shell 命令集合 系统设置 】Linux 显示Linux内核模块的详细信息 modinfo命令 使用指南
24 0