Linux 2.6
内核的精彩世界
(
一
)
整理:
Ackarlix
2003
年岁末,
Linux
社区最鼓舞人心的消息莫过于期盼已久的
Linux
内核
2.6
版正式推出。作为一个主要发布版本,
2.6
相对于
2.4
有很大的改动;它引入了许多新的特性,同样也去除很多过时的特性。
它在哪些方面有大的改动?它对
Linux
的开发人员以及其他层面的
Linux
用户可能有什么样的影响?阅读本文,您将得到答案。
--
译者
尽管我们第一次启动
Linux 2.4
似乎只是昨天的事,时间已经流走,内核开发团队的
2.6
版内核开发工作已经接近完成了。本文将试图描述
2.6
内核中的许多新特性(侧重
i386
平台的
Linux
)。和封闭源码的软件的预发布不一样的是,这里所描述的所有特性当前都是
2.5
版内核开发树中可用的(其中一些的
bug
少一些,另一些
bug
多一些)。(按照
Linux
的传统,偶数版本的内核是稳定的,奇数版本的只是开发用的)。也就是说,这里所描述的一些特性在实际的
2.6
版本中仍可能被去除或标志为
"experimental"(
试验性
)
。然而内核当前处于特性冻结(
feature-freeze
)时期,最终的发行版本应该不大可能过于偏离这里的描述。同时也应该清楚这里描述的一些
"
新
"
特性在第一次出现在
2.6
系列内核后,可能被向后移植到了官方的或者发行版供应商的
2.4
版内核之中。
或许使得这篇文章更为晦涩的是,即将到来的内核的版本号至今仍未确定。最可能使用的版本号是
2.6
,但是一些人提议版本号可以使用
3.0
,因为这个版本中包含了
NUMA
以及无
MMU
系统的支持。为论述方便,本文将一直使用
2.6
作为即将到来的内核的版本号。
您正在阅读的是本文档(《
Linux 2.6
内核的精彩世界》)非正式版的第一版,完稿于
2003
年
7
月
13
日
,基于
2.5.75
开发版内核。随着
Linux
内核最后工作的完成,这份文档将发布其他非正式版,但是这份文档的正式版直到
2.6
的最后发布才宣告完成。由于本文是非正式版的第一版,其中可能有错误或者疏漏;如果您发现了它们,请告诉我,我将很高兴地去修正它们。
到目前为止的故事
...
Linux
内核始于
1991
年由
Linus Torvalds
为他的
386
开发的一个类
Minix
的操作系统。
Linus
初始曾想命名为这个系统为
Freax
,但很幸运的是最后他最后没有那样做。
Linux 1.0
的官方版发行于
1994
年
3
月,包含了
386
的官方支持,仅支持单
cpu
系统。
Linux 1.2
发行于
1995
年
3
月,它是第一个包含多平台(
Alpha
,
Sparc
,
Mips
等)支持的官方版本。
Linux 2.0
发行于
1996
年
6
月,包含很多新的平台支持,但是最重要的是,它是第一个支持
SMP
(对称多处理器)体系的内核版本。
Linux 2.2
在
1999
年
1
月到来,它带来了
SMP
系统上性能的极大提升,同时支持更多的硬件。最后,
Linux 2.4
于
2001
年
1
月发布,它进一步地提升了
SMP
系统的扩展性,同时它也集成了很多用于支持桌面系统的特性:
USB
,
PC
卡(
PCMCIA
)的支持,内置的即插即用,等等。
Linux 2.6
不仅包含了这些特性,同时也是一个无论对相当大的系统还是相当小的系统(
PDA
等)的支持都有很大提升的
"
大跨越
"
。
多种平台支持
能够支持相当广泛的硬件和平台,是采用
Linux
作为内核的操作系统(比如
GNU
操作系统,
系统和环境常常是和
Linux
一块分发。
Linux
一般不被认为是独立的操作系统,只是操作系统的内核。)的优势之一。
Linux
自
1.2
版就开始包含对新的处理器类型和特性的支持,最新的
Linux 2.6
内核发布版本也不例外。这种趋势不会直接影响到
Linux
在
Intel
平台下的使用,同时使得
Linux
能在尽可能大的范围内被使用,这一点非常重要。
小规模
-
嵌入式系统中的
Linux
Linux 2.6
扩展多平台支持的一个主要途径就是把
uClinux
的大部并入了主流内核(
mainstream kernel
)。
uCLinux
(可以发音为
"you-see-Linux"
,但更正确的拼写,首字母应该式希腊字母
"mu"
)是将
Linux
应用在微控制器平台的项目。很多年来,这个
Linux
分支为许多嵌入式芯片提供了支持,把它更多的集成到主流内核中是一件非常有意义的事。
不像通常的
Linux
移植版本,这里描述的嵌入式移植版由于硬件限制和通常的
Linux
相比,不具有所有类似的特性。主要的区别在于:这些移植版是针对于没有内存管理单元(
MMU
)的处理器的(
Intel
的
CPU
从
386
开始就有
MMU
了)。缺少
MMU
的支持,运行真正的多任务系统时,任务之间没有内存保护机制(因此任何程序都可以使得其他程序崩溃),一些有关进程派生的系统调用也无法实现。正是因为没有内存保护机制(或者说,没有任何安全性可言),它们不适用于多用户系统。
在对嵌入式处理器支持上,
Linux 2.6
有四个主要的新进步。首先是对
Motorola
的新型嵌入式
m68k
系列处理器移植。这些被命名为
Dragonball
或是
ColdFire
的处理器可以在
Motorola
,
Lineo
,
Arcturus
或是其他厂商生产的系统或是评估板上找到。大多数
Linux
用户应该对这些处理器相当熟悉,因为从
Palm 1000
到最新的
Palm III
,他们一直是
Palm Pilots
的心脏。不幸的是,对早期没有
MMU
的
m68k
处理器(比如早期苹果机上使用的
68000
系列)还没有支持。最新支持的嵌入式平台还包括日立(
Hitachi
)的
H8/300
系列(不包含
H8S
,但可能会尽快地集成进来)以及
NEC v850
处理器。
无论怎么强调
Linux 2.6
旨在支持无
MMU
系统的主要体系结构变化,都不为过分。所有
Linux
的前期版本,不论直接或是间接,都起源于
Linus
最初在
Intel 80386
上的工作,局限性是固有的。沿着这个方向(对无
MMU
系统的支持),将来也许会有更多的其他早期的硬件被支持(事实上,已经有关于此目的的项目启动)。但是,不像为现代的以及仍在生产中的嵌入式处理器的提供支持,对早期的硬件的支持被更多地认为是基于某种爱好,并且对于最终用户而言很可能是无用的(因此在今后的
Linux
的官方发布版本也许不会将其包含在内)。
最新的
Linux
版本包含了对
Axis
通信公司的
ETAX CRIS
(
"Code Reduced Instruction Set"
)处理器的支持(更确切地说,支持
ETRAX 100LX
及更新的产品),它从技术的角度而言不是
uCLinux
合并的一部分(因为它包含
MMU
单元)。实际上对这款处理器的支持在
2.4
开发周期就已经有了,但它在
2.4.0
以后才被引入,所以现在应该提到它。它是主要用于网络设备的嵌入式处理器。与此相关的
ETRAX 100
,是得到
uClinux
支持的无
MMU
处理器,但是在主流的
Linux
内核中相关支持却没有集成进来。
Opteron
支持
-
消费级的
64
位
Linux
另一个在
2.4.x
开发环节就已经并入但这里仍然值得提及的是对
AMD Opteron
芯片(基于
AMD64
体系结构)的支持。
Opteron
向后与
Intel-clone
的处理器兼容,并且,甚至可能得到微软的支持。是它还是
Intel
的
Itanium
家族的某一成员成为
64
位消费级产品的事实标准现在还很难下定论。
尽管
2.4
系列内核的后期版本已经可以在该芯片上运行,但作为产品应用仍受到了很大限制。对高端用户来说,最严重的问题是,每个应用程序的
RAM
的使用都被限制在
512MB
以内。另一方面,新内核对在该平台上运行
x86
(
32
位)的程序的支持得到了改进。
子体系结构(
Subarchitecture
)支持
Linux 2.6
除了对许多新的处理器体系结构外,还包含了一个称为子体系结构(
Subarchitecture
)的新概念。以前,
Linux
通常假设处理器和其他硬件是配套的。也就是说,
i386
系列处理器只会在
PC/AT
服务器上使用。这条针对
i386
的假设在
Linux 2.4
中就被打破,因为
i386
的额外支持使其可以在
SGI
的视频工作站(
Visual Workstation
)中使用。(事实上,在其他非
i386
体系结构上,这个假设早被打破了。比如,
m68k
很早就支持
Amiga
,
Michintosh
等平台。)
Linux 2.6
对于此最大的变化就是,让这个特性以及概念成为标准,以便所有的体系结构都可以用相似而健全的方法来处理,以便更清晰地划分模块。
标准的确立使得
i386
可以运用于两个新的平台。第一个是
NCR
的
Voyager
体系。这是一个对称多处理器(
SMP
)系统(在
Intel
的
MP
规范标准确定之前就已经开发出来了),它支持多达
32
个
486
-
686
的处理器配置。实际采取这种体系结构的产品处理器的配置数目要相对少一些,而且目前并不是所有的型号都得到了
Linux
的支持(最早的就不支持)。第二种得到最新支持的体系结构是更为广泛使用的由
NEC
开发的
PC-9800
平台,它曾是日本市场占统治地位的
PC
平台,一直到最近几年。最初的
PC-9800
装载的是
8086
处理器,最终发展到奔腾级处理器和
SMP
支持。(当然,
Linux
对它的支持局限在
386
以上。)尽管在美国它完全不为人所知,微软的
Windows 95
之前的版本曾移植到这个平台上。该平台由于生产商对标准
PC
的偏爱,生产已经中止。
Linux
对差异细微的硬件类型支持的形式化,使得操作系统能更容易的移植到其他平台上,比如移植到专为存储设计的硬件或者是使用在工业领域的主流处理器。需要澄清的是,子体系结构也不是任何时候都管用的,它能够发挥作用是因为这些可移植的系统非常底层构件(比如
IRQ
路由)有或多或少的不同。比起在
X-box
上运行
Linux
的差别来说,驱动程序等相对小的差别还不足以把它们从传统的
i386
系统中分开。
Linux
对
X-box
的支持,就不是子体系结构的问题。
大规模
-
非一致存储访问体系结构(
NUMA
)和大型机
除了以上所提及的新硬件类型的支持之外,新的
Linux
内核发行版也包含了对大型服务器(一些运行
i386
处理器,也有些运行其他处理器)更多的支持。对
Linux
来说,这样的特性是新近加入的,还有许多优化工作需要完成。这是一个
Linux
发展相当迅速的领域,我们能够预计在不久的将来,
Linux
将成为此领域的有力竞争者。
在此方面最大的改变就是
Linux
对
NUMA
服务器的最新支持。
NUMA
(非一致存储访问)在多进程世界里是超越
SMP
以及提升多处理器系统效率的一个进步。
SMP
系统的设计上有着许多和对应单处理器系统类似的局限性。其中最大的设计局限之一就是系统中只有唯一的一块内存区,所有的处理器对它都平等地对它进行访问。在多处理器系统里,这样会在同一条内存总线上的多处理器之间引起相当高的竞争,导致性能瓶颈。
NUMA
服务器,通过引入了以下的理念解决了这个问题:对于某个特定的处理器,一些内存比其他一些的更为接近(
close
)。可以这样简单地设想(同时技术上也不会有严重错误),你的系统有许多包含了处理器、内存以及其他元件(比如
I/O
扩展卡)。系统中有很多这样的卡,它们可以相互通讯;显而易见,相对其他卡上的内存,每块卡上的处理器能更快的访问本地内存(自己的卡上内存)。从许多角度上看,
NUMA
体系结构就是一个紧密耦合的集群特例。
为了给
NUMA
主机提供良好的支持,
Linux
十分必要在许多方面进行调整,以使新模型更具效率。首先,建立了一个内部拓扑
API
,以使内核知道处理器和内存以及其他
IO
设备间的相互关系。有了内部拓扑
API
的支持,
Linux
的进程调度器可以理解这些关系,并且会尝试优化任务以达到最佳的本地资源使用。此外,许多
NUMA
主机在各个节点(
nodes
)的线性内存区域之间存在空洞(
holes
)。新内核已经能够合理的处理这种不连续情况。内核还有许多其他使得
Linux
可以支持高端(
high-end
)主机的变化,这也是内核发展的一个明确方向。再过一年,我们可以期待
Linux
在高端机型上效率以及其他方面的进步。