今天看了《程序员》上的一篇文章,对微内核和宏内核,在系统调用的角度上,有了比较清晰地认识。
这两种派系的代表人分别是Tanenbaum和Linus。
Tanenbaum的一段话比较通俗易懂的说明了什么叫微内核什么叫宏内核。
“老一点的操作系统都是宏内核的,也就是说,整个操作系统是一个运行在核心态的单独的a.out文件,
这个二进制文件包含进程管理,内存管理,文件系统以及其他。具体实例包括UNIX,MS-DOS,VMS,MVS,
OS/360,MULTICS等等。
另一种便是微内核,在这种系统中,操作系统的大部分都运行在单独的进程,而且多数在内核之外。它们
之间通过消息传递来通信。内核的任务是处理消息传递,中断处理,底层的进程管理,以及可能的I/O。
这种设计实例有RC4000,Amoeba,Chorus,Mach以及还没有发布的Windows/NT”。
为了从概念上搞清楚微内核和宏内核,从网上搜到如下的资料
“l 微内核(Microkernel kernel)――在微内核中,大部分内核都作为独立的进程在特权状态下运行,它们通过消息传递进行通讯。在典型情况下,每个概念模块都有一个进程。因此,如果在设计中有一个系统调用模块,那么就必然有一个相应的进程来接收系统调用,并和能够执行系统调用的其它进程(或模块)通讯以完成所需任务。
在这些设计中,微内核部分经常只不过是一个消息转发站:当系统调用模块要给文件系统模块发送消息时,消息直接通过内核转发。这种方式有助于实现模块间的隔离。(某些时候,模块也可以直接给其它模块传递消息。)在一些微内核的设计中,更多的功能,如I/O等,也都被封装在内核中了。但是最根本的思想还是要保持微内核尽量小,这样只需要把微内核本身进行移植就可以完成将整个内核移植到新的平台上。其它模块都只依赖于微内核或其它模块,并不直接直接依赖硬件。
微内核设计的一个优点是在不影响系统其它部分的情况下,用更高效的实现代替现有文件系统模块的工作将会更加容易。我们甚至可以在系统运行时将开发出的新系统模块或者需要替换现有模块的模块直接而且迅速的加入系统。另外一个优点是不需要的模块将不会被加载到内存中,因此微内核就可以更有效的利用内存。
l 单内核(Monolithic kernel)――单内核是一个很大的进程。它的内部又可以被分为若干模块(或者是层次或其它)。但是在运行的时候,它是一个独立的二进制大映象。其模块间的通讯是通过直接调用其它模块中的函数实现的,而不是消息传递。
单内核的支持者声称微内核的消息传递开销引起了效率的损失。微内核的支持者则认为因此而增加的内核设计的灵活性和可维护性可以弥补任何损失。