嵌入式Linux设备驱动程序开发指南(原书第2版)
上QQ阅读APP看书,第一时间看更新

1.2 Linux内核

Linux是一个类UNIX操作系统,它是由Linus Torvalds主笔从零开始写成的。它同时获得了资深开发团队的协助,其团队成员之间通过网络互相沟通协调,形成了这个松散的团队。它的主要目的是实现POSIX接口并唯一遵循UNIX规范。

目前,它具有一个成熟UNIX系统所拥有的所有特性,包括真正的多任务特性、虚拟内存、共享库、按需加载、可执行程序的共享写时拷贝、合适的内存管理机制和多个网络协议栈的实现(包括IPv4和IPv6)。最原始的程序开发是在32位x86体系结构的个人计算机上进行的(386或者更高级的计算机),而今天的Linux可以运行在多种处理器体系结构上,包括32位和64位的体系结构。

Linux内核是Linux系统的底层软件。它负责管理硬件,运行用户态软件,并且负责系统的整体安全性和完整性。在Linus Torvalds于1991年发行了Linux的初始版本后,Linux作为一个整体系统启动了开发工作。虽然内核只是Linux软件系统中相对较小的部分(许多其他大型组件来自GNU项目、GNOME和KDE桌面项目、X.org项目以及许多其他项目),但是内核是决定系统工作好坏的核心,是Linux真正独特的部分。

作为Linux系统的核心,内核是有史以来最大的合作性软件项目。通常2~3个月就会向用户发布一个稳定的升级版本。每次发布的新版本都包含一些有重大意义的新特性,添加对设备的支持和性能提升。内核的更新频率很快,并且在快速扩大其代码规模。在最近发行的内核版本中,每次都有超过10 000个补丁进入内核。这些版本都包含了代表200多家公司的1600多名开发人员的工作。

当内核从主线版本转入稳定版本的时候,有两件事会发生:

1. 在修复了一些错误后,它们可能结束其生命周期,这意味着内核维护人员将不再为该内核版本进行任何错误修复。

2. 或者,这个版本可以划归到长期维护类别里,这就意味着在相当长时间里,维护者都会对这个内核版本提供错误修复的支持。

如果你使用的内核版本被标记为EOL(生命周期结束),你应该考虑将内核升级到下一个主版本,因为内核维护人员将不再为它提供错误修复。

Linux内核以GNU GPL version 2协议发布,因此它是自由软件基金会定义的自由软件。你可以在包含于Linux内核发行版的版权文件中,看到完整的版权协议内容。

下面列出组成Linux内核的一些子系统:

  • /arch/<arch>:处理器体系结构特有的代码。
  • /arch/<arch>/<mach>:机器/单板特有的代码。
  • /Documentation:内核文档。不要错过了(很重要)!
  • /ipc:进程间通信。
  • /mm:内存管理。
  • /fs:文件系统。
  • /include:内核头文件。
  • /include/asm-<arch>:处理器体系结构和机器依赖的头文件。
  • /include/linux:Linux内核核心头文件。
  • /init:Linux初始化程序(包括main.c)。
  • /block:块设备驱动代码。
  • /net:网络协议代码。
  • /lib:通用的内核库文件。
  • /kernel:通用的内核代码。
  • /arch:处理器体系结构特有的代码。
  • /crypto:加密算法相关代码。
  • /security:安全机制相关代码。
  • /drivers:内建的驱动的代码(不包括可选的动态加载驱动模块)。
  • Makefile:顶层的编译说明文件(设置处理器体系结构和版本)。
  • /scripts:供内部和外部使用的脚本文件。

Linux内核的官方网址是www.kernel.org。你可以通过kernel.org这个网址直接下载内核源代码文件(其压缩格式是tar.xz),或者使用git方式下载内核源文件。

下面列出了内核发行版的几个类型:

1. Prepatch(预发行):Prepatch或者“RC”内核是主线内核预发行版本,它主要面向内核开发者或者Linux发烧友。这些代码通常会经过完全编译,并包含一些新特性。这些新特性必须通过测试后才能被放到内核稳定版本中。Prepatch内核由Linus Torvalds本人维护和发行。

2. Mainline(主线):主线代码树由Linus Torvalds维护。所有的新特性和令人激动的开发进展都会进入这个主线树中。每2~3个月发行一个新的主线内核版本。

3. Stable(稳定分支):在每一个主线版本发布后,这个稳定版本被认为是稳定的。任何对稳定版本的错误修复都会从主线树进行反向移植,并且由指定的稳定版本内核维护者合入。一般在两个主线发行版本之间会有错误修复内核版本,除非稳定版本内核被指定为长期维护版本,否则这些稳定升级版本的发布时间通常会是2~3个月。

4. Longterm(长期维护):通常会提供几个长期维护的内核版本,用来把新的错误修复加入旧版本的内核代码中。只有很重要的错误修复才能加入这种版本中,并且这种版本很少见,尤其是旧的代码树中。长期维护的内核版本见表1-1。

表1-1 长期维护的内核版本

023-01

图1-2是从www.kernel.org网页上获取的,可以看到最新的稳定内核版本、开发中的内核版本(主线分支和测试分支)、若干个稳定版本和长期维护版本。

023-02

图1-2 Linux内核版本

另外,除了这些官方内核版本以外,还有许多第三方(芯片厂家、技术社区分部)提供和维护的内核版本,这些版本的内核源代码都来源于官方内核源码树。这样做的目的是单独开发和支持一些特殊的硬件或者子系统,这部分代码将在以后的某个时间点合并到官方版本中。这个处理方式叫作主线模式,并且描述了将新特性或者硬件支持集成到上游(官方)内核的工作。这些被称为发行版内核

如果你运行的是一个发行版内核,很容易判断它的版本。除非你运行的是从kernel.org下载、编译并安装的内核版本,否则你运行的都是某个发行版本的内核。要确定你的内核版本,请(在命令行)运行uname -r

024-01

在本书中,你将使用长期支持版本kernel 4.9.y来开发本书中的所有驱动程序。