第 7 章 配置编译内核
7.1 Linux 内核特点
7.1.1 Linux 内核版本介绍
Linux 内核的版本号分为主版本号、次版本号和扩展版本号等。根据稳定版本、测试版 本和开发版本定义不同版本序列。
稳定版本的主版本号用偶数表示,例如:2.2、2.4、2.6。每隔 2~3 年启动一个 Linux 稳 定主版本号。
紧接着是次版本号,例如:2.6.13、2.6.14、2.6.15。次版本号不分奇偶数,顺序递增。
每隔 1~2 个月发布一个稳定版本。
然后是升级版本号,例如:2.6.14.3、2.6.14.4、2.6.14.5。升级版本号不分奇偶数,顺序 递增。每周几次发布升级版本号,修正最新的稳定版本的问题。
另外一种是测试版本。在下一个稳定版本发布之前,每个月发布几个测试版本,例如:
2.6.12-rc1。通过测试,可以使内核正式发布的时候更加稳定。
还有一类是开发版本。开发版本的主版本号用奇数表示,例如:2.3、2.5。也有次版本号,例 如:2.5.32、2.5.33。开发版本是不稳定的,适合内核开发者在新的稳定的主版本发布之前使用。
7.1.2 Linux 内核特点
(1)Linux 内核的重要特点可移植性(Portability),支持硬件平台广泛,在大多数体系结 构上都可以运行。
可量测性(Scalability),即可以运行在超级计算机上,也可以运行在很小的设备上(4MB RAM 就能满足)。
标准化和互用性(Interoperability),遵守标准化和互用性规范。
完善的网络支持。
安全性,开放源码使缺陷暴露无疑,它的代码也接受了许多专家的审查。
稳定性(Stability)和可靠性(Reliability)。
模块化(Modularity),运行时可以根据系统的需要加载程序。
编程容易,可以学习现有的代码,还可以从网络上找到很多有用的资源。
(2)Linux 内核支持的处理器体系结构
Linux 内核能够支持的处理器的最小要求:32 位处理器,带或者不带 MMU。需要说明 的是,不带 MMU 的处理器过去是 uClinux 支持的。Linux 2.6 内核采纳了 m68k 等不带 MMU 的部分平台,Linux 支持的绝大多数处理器还是带 MMU 的。
Linux 内核既能支持 32 位体系结构,又能支持 64 位体系结构。
每一种体系结构在内核源码树的 arch/目录下有子目录。各种体系结构的详细内容可以查 看源码 Documentation/<arch>/目录下的文档。
(3)Linux 内核遵守的软件许可
Linux 内核全部源代码是遵守 GPL 软件许可的免费软件,这就要求在发布 Linux 软件的 时候免费开放源码。
tyw藏书
对于 Linux 等自由软件,必须对最终用户开放源代码,但是没有义务向其他任何人开放。
在商业 Linux 公司中,通常会要求客户签署最终用户的使用许可。
私有的模块是允许使用的。只要不被认定为源自 GPL 的代码,就可以按照私有许可使用。
但是,私有的驱动程序不能静态链接到内核中去,可以作为动态加载的模块使用。
(4)开放源码驱动程序的优点
基于庞大的 Linux 社区和内核源码工程,有各种各样的驱动程序和应用程序可以利用,
而没有必要从头写程序。
开发者可以免费得到社区的贡献、支持、检查代码和测试。驱动程序可以免费发布给其 他人,可以静态编译进内核。
对 Linux 公司来说,用户和社区的正面印象可以使他们更容易聘请到有才能的开发者。
以源码形式发布驱动程序,可以不必为每一个内核版本和补丁版本都提供二进制的程 序。另外通过分析源代码,可以保证它没有安全隐患。
7.1.3 Linux 2.6 内核新特性
Linux 2.6 内核吸收了一些新技术,在性能、可量测性、支持和可用性方面不断提高。这 些改进多数是添加支持更多的体系结构、处理器、总线、接口和设备;也有一些是标准化内 部接口,简化扩展添加新设备和子系统的支持。
与 Linux 2.4 版本相比,Linux 2.6 版本具有许多新特性,内核也有很大修改。其中一些 修改只跟内核或者驱动开发者有关,另外一些修改则会影响到系统启动、系统管理和应用程 序开发。
Linux 2.6 内核重要的新特性如下。
(1)新的调度器
Linux 2.6 版本的 Linux 内核使用了新的调度器算法,它是由 Ingo Molnar 开发的 O(1)调 度器算法。它在高负载的情况下极其出色,并且对多处理器调度有很好的扩展。
Linux 2.4 版本的标准调度器中,使用时间片重算的算法。这种算法要求在所有的进程都 用尽时间片以后,重新计算下一次运行的时间片。这样每次任务调度的花销不确定,可能因 为计算比较复杂,产生较大调度延迟。特别是多处理器系统,可能由于调度的延迟,导致大 部分处理器处于空闲状态,影响系统性能。
新的调度器采用 O(1)的调度算法,通过优先级数组的数据结构来实现。优先级数组可以 使每个优先级都有相应的任务队列,还有一个优先级位图。每个优先级对应位图中一位,通 过位图可以快速执行最高优先级任务。因为优先级个数是固定的,所以查找的时间也固定,
不受系统运行任务数的影响。
新的调度器为每个处理器维护 2 个优先级数组:有效数组和过期数组。有效数组内任务 队列的进程都还有可以运行的时间片;过期数组内任务队列的进程都已经没有时间片可以执 行。当一个进程的时间片用光时,就把它从有效数组移到过期数组,并且时间片也已经重新 计算好了。当需要重新调度这些任务的时候,只要在有效数组和过期数组之间切换就好了。
这种交换是 O(1)算法的核心。它根本不需要从头到尾重新计算所有任务的时间片,调度器的 效率更高。
O(1)调度器具有以下优点。
tyw藏书
• SMP 效率高。如果有工作需要完成,那么所有处理器都会工作。
• 没有进程需要长时间地等待处理器;也没有进程会无端地占用大量的 CPU 时间。
• SMP 进程只映射到一个 CPU 而且不会在 CPU 之间跳跃。
• 不重要的任务可以设置低优先级,重要的任务设置高优先级。
• 负载平衡功能。调度器会降低那些超出处理器负载能力的进程的优先级。
• 交互性能提高。即使在高负载的情况下,也不会再发生长时间不响应鼠标点击或者键 盘输入的情况。
(2)内核抢占
Linux 2.6 采纳了内核抢占的补丁,大大减小了用户交互、多媒体等应用程序的调度延迟。
这一特性对实时系统和嵌入式系统来说特别有用。这项工作是由 Robert Love 完成的。
在 Linux 2.4 以前的内核版本中,内核空间运行的任务(包括通过系统调用进入内核空间 的用户任务)不允许被抢占,直到它们自己主动释放 CPU。
在 Linux 2.6 内核中,内核是可抢占的。一个内核任务可以被抢占,为的是让重要的用户 应用程序可以继续运行。这样做可以极大地增强系统的用户交互性,用户将会觉得鼠标点击 和击键的事件得到了更快速的响应。
当然,不是所有的内核代码段都可以被抢占。可以锁定内核代码的关键部分,不允许抢 占。这样可以确保每个 CPU 的数据结构和状态始终受到保护。
(3)新的线程模型
Linux 2.6 内核重写了线程框架。它也是由 Ingo Molnar 完成的。它基于一个 1:1 的线程模 型,能够支持 NPTL(Native Posix Threading Library)线程库。NPTL 是一个改进的 Linux 线 程库,它是由 Molnar 和 Ulrich Drepper 合作开发的。
对于 2.4 内核的 Linux 线程库,存在一些不足。例如:总是需要一个管理线程,来负责 创建和删除子线程,负责接收和分发信号等。如果系统中使用大量的线程,这种 Linux 线程 库就存在严重的效率问题。
NPTL 线程库解决了传统的 Linux 线程库存在的问题,对系统有很大性能提升。实际上,
RedHat 已经将它向后移植到了 Linux 2.4 内核,从 RedHat 9.0 版本就开始包含对它的支持。
新的线程框架的改进包含 Linux 线程空间中的许多新的概念,包括线程组、线程各自的本地 存储区、POSIX 风格的信号以及其他改进。
(4)文件系统
相对于 Linux 2.4,Linux 2.6 对文件系统的支持在很多方面都有大的改进。关键的变化包 括对扩展属性(extended attributes)以及 POSIX 标准的访问控制(access controls)的支持。
EXT2/EXT3 文件系统作为多数 Linux 系统缺省安装的文件系统,是在 2.6 中改进最大 的一个。最主要的变化是对扩展属性的支持,也即给指定的文件在文件系统中嵌入一些元 数据(metadata)。新的扩展属性子系统的第一个用途就是实现 POSIX 访问控制链表。POSIX 访问控制是标准 UNIX 权限控制的超集,支持更细粒度的访问控制。EXT3 还有其他一些细 微变化。
Linux 对文件系统层还进行了大量的改进以兼容其他操作系统。Linux 2.6 对 NTFS 文件 系统的支持也进行了重写;同时也支持 IBM 的 JFS(journaling file system)和 SGI 的 XFS。
tyw藏书
此外,Linux 文件系统中还有很多零散的变化。
(5)声音
Linux 2.6 内核还添加了新的声音系统:ALSA(Advanced Linux Sound Architecture)。老的 声音系统 OSS (Open Sound System)存在一些系统结构的缺陷。新的声音体系结构支持 USB
Linux 2.6 支持高级电源配置管理界面(ACPI,Advanced Configuration and Power Interface),
最早 Linux 2.4 中有些支持。ACPI 不同于 APM(高级电源管理),拥有这种接口的系统在改 变电源状态时需要分别通知每一个兼容的设备。新的内核系统允许子系统跟踪需要进行电源 状态转换的设备。
(8)网络
Linux 是一种网络性能优越的操作系统,已经可以支持世界上大多数主流网络协议,包 括 TCP/IP(IPv4/IPv6)、AppleTalk、IPX 等。
在网络硬件驱动方面,利用了 Linux 的设备模型底层的改进和许多设备驱动程序的升级。
例如,Linux 2.6 提供一个独立的 MII(媒体独立接口,或是 IEEE 802.3u)子系统,它被许多 网络设备驱动程序使用。新的子系统替换了原先系统中各自运行的多个实例,消除了原先系 统中多个驱动程序使用重复代码、采用类似的方法处理设备的 MII 支持的情况。
在网络安全方面,Linux 2.6 的一个重要改进是提供了对 IPsec 协议的支持。IPsec 是在网 络协议层为 IPv4 和 IPv6 提供加密支持的一组协议。由于安全是在协议层提供的,对应用层 是透明的。它与 SSL 协议及其他 tunneling/security 协议很相似,但是位于一个低得多的层面。
在网络安全方面,Linux 2.6 的一个重要改进是提供了对 IPsec 协议的支持。IPsec 是在网 络协议层为 IPv4 和 IPv6 提供加密支持的一组协议。由于安全是在协议层提供的,对应用层 是透明的。它与 SSL 协议及其他 tunneling/security 协议很相似,但是位于一个低得多的层面。