Linux 内核的类型( 二 )


从众多思想中抽取出来的 。简单说来,事实是Linux内核既不是严格层次化的,也不是严
格模块化的,也不是严格意义上的任何类型,而是以实用为主要依据的(实际上,如果要
用一个词来概括Linux从设计到实现的所有特点,那么实用就是最确切的) 。也许最保守
的观点是内核的实现是模块化的,虽然这些模块有时会为了追求速度而有意跨越模块的界
限 。
这样,Linux的设计同时兼顾了理论和实际 。Linux并没有忽视设计方法;相反,在Linux
的开发基本思想中,设计方法的作用就像是编译器:它是完成工作的有力工具 。选择一个
基本的设计原则(例如对象)并完全使用这种原则,不允许有任何例外,这对于测试该原
则的限制,或者构建以说明这些方法为目的的教学系统来说都是一个不错的方法 。但是如
果要用它来达到Linux的设计目标则会引起许多问题 。而且Linux的设计目标中也并不包括
要使内核成为一个完全纯化的系统 。Linux开发者为了达到设计目标宁愿违背妨碍目标实
现的原则 。
实际上,如果对于Linux来说是正确的,那么它们对于所有最成功的设计来说都是正确的
。最成功、应用最广泛的实际系统必然是实用的系统 。有些开发人员试图寻找功能强大的
可以解决所有问题的特殊方法 。他们一旦找到了这种方法,所有的问题就都迎刃而解了 。
像Linux内核一样的成功设计通常需要为系统的不同部分和描述上的不同层次使用不同的
方法 。这样做的结果可能不是很清晰,也不是很纯粹,但是这种混合产物比同等功能的纯
粹系统要强大而且优秀得多 。
Linux大部分都是单内核的
操作系统内核可能是微内核,也可能是单内核(后者有时称之为宏内核Macrokernel) 。
按照类似封装的形式,这些术语定义如下:
* 微内核(microkernel)—在微内核中,大部分内核都作为独立的进程在特权状态下运
行,它们通过消息传递进行通讯 。在典型情况下,每个概念模块都有一个进程 。因此,如
果在设计中有一个系统调用模块,那么就必然有一个相应的进程来接收系统调用,并和能
够执行系统调用的其他进程(或模块)通讯以完成所需任务 。
在这些设计中,微内核部分经常只不过是一个消息转发站:当系统调用模块要给文件系统
模块发送消息时,消息直接通过内核转发 。这种方式有助于实现模块间的隔离(某些时候
,模块也可以直接给其他模块传递消息) 。在一些微内核的设计中,更多的功能,如I/O
等,也都被封装在内核中了 。但是最根本的思想还是要保持微内核尽量小,这样只需要把
微内核本身进行移植就可以完成将整个内核移植到新的平台上 。其他模块都只依赖于微内
核或其他模块,并不直接直接依赖硬件 。
微内核设计的一个优点是在不影响系统其他部分的情况下,用更高效的实现代替现有文件
系统模块将会更加容易 。我们甚至可以在系统运行时将开发出的新系统模块或者需要替换
现有模块的模块直接而迅速地加入系统 。另外一个优点是不需要的模块将不会被加载到内
存中,因此,微内核就可以更有效地利用内存 。
* 单内核(monolithic kernel)—单内核是一个很大的进程 。它的内部又可以被分为若
干模块(或者是层次或其他) 。但是在运行的时候,它是一个独立的二进制大映象 。其模
块间的通讯是通过直接调用其他模块中的函数实现的,而不是消息传递 。
单内核的支持者声称微内核的消息传递开销引起了效率的损失 。微内核的支持者则认为因

推荐阅读