
在之前的一篇内容里,我提到了关于内核(kernel)的问题,也就是宏内核与微内核的问题。我也提到Minix和Linux的两位大神曾经对这个问题进行过争论。我在这里简单说一下我对宏内核与微内核的自己的认识。
首先,微内核在英文中大概是Microkernel,而宏内核大概是Monolithic kernel或简写位Monokernel。所以宏内核应该更准确的翻译为“单内核”,不过因为其个头很大,所以称为“宏(大)内核”或“巨(大)内核”也是形象的,并且这种叫法大家也都在叫。
微内核估计是大部分现代操作系统都在采用的结构,包括各种Unix(含Minix、BSD等),含GNU一直想开发出来的Hurd,BSD中含Mac OS X,微软也说Windows同样是微内核(但好像有些研究内核的人不信微软的这个说法)。而单内核,目前估计就Linux比较有名了。
两种内核的结构决定了它们之间吨位的巨大差别。据说这种吨位的差别真的很大。
对于一个操作系统,怎么看哪些东西是属于内核的,哪些不是属于内核的。只要看哪些是运行在内核空间(Kernel Space),哪些是运行在用户空间(User Space)。这两个空间可以简单解释为内存上的两个不同的区域。内核空间中代码有更大的权限去访问硬件,但可使用的内存有限,并且为了保证安全(毕竟是直接与硬件往来)还有其他的诸多限制。用户空间中的代码,通常就是一个个我们看到的线程或进程的东西,各个进程、线程通过内核空间中的代码进行调度或传递数据,它们基本无法直接访问硬件,但是可以无限制使用内存,其他限制也很小。
微内核的设计思路就是,除了是必须放在内核空间中运行的东西,否则就让它去用户空间。内核只做最最简单的工作:访问硬件,进行个进程间通讯。所以,一个微内核的操作系统,其实是一个很小功能的内核,加上一堆程序,比如文件系统、显卡驱动、网卡驱动、声卡驱动……这些程序都是普通的进程。
单内核的设计思路就是,既然都是和硬件有关的东西,那么我就要让它少点进程间通信的额外开销,于是把它们都放在内核空间中。于是一个单内核里就有无数的东西,比如文件系统、显卡驱动、网卡驱动、声卡驱动……这些程序全都是内核的一部分。
从简单的思路描述上来看,单内核的开销会少一些,所以运行效率会高一些。而微内核看起来应该更灵活一些,而恰当的分配什么东西在内核空间中,也可以减少开支提高其运行的效率(混合内核)。
微内核的确是灵活,这点非常肯定。内核只需要确定出一套标准(类似API),你随便改周围的一切都可以,都不会相互影响。哪怕改内核,只要不改标准,周围的一切都可以不改变。内核看起来稳定性也高,毕竟周围的一切都在进程中,哪一部分崩溃,也只是会影响到和这个进程有关的东西。
那么单内核的确就不怎么灵活了,改一点点东西,整个内核就要重新编译。而稳定性呢,不管哪个地方出问题,整个内核就全崩,而内核全崩,电脑也就全崩了。
上面两段,就是微内核支持者的论据。也就是塔能鲍姆·教授与李纳斯·托瓦兹所争论的焦点。
但是,GNU自己的内核Hurd为什么这么难开发呢?单内核作为一个整体,某一部分不正常很容易发现并调试。而微内核在这方面就比较难一些,Hurd进展缓慢据说就是这么回事。
Linux的内核是什么样子的呢?显然它是单内核。不过它估计是前所未有最为先进的一种单内核。微内核为了达到减少开销而向单内核倾斜让内核管理较多的东西。而Linux作为单内核也在灵活性方面向微内核倾斜。
Linux里建立了一个通用文件系统接口,保证它能很容易的使用多种文件系统(Linux支持的文件系统大概有几十种)。Linux把内核的各个部分进行了模块化,它们可以静态编译进内核中去,也可以不编译进内核中。当需要这个模块的时候,Linux可以动态的载入这些模块来使用。当这些模块不被需要的时候,Linux又可以动态卸载它们。这很像微内核,不过Linux的这些模块都是运行在内核空间的而不是用户空间。不过其实也挺麻烦的。
从什么地方能看出Linux的这种模块化设计呢?Fedora 13升级的时候(其他Linux发行版也应该差不多),当执行yum update的时候,如果恰好需要升级内核的时候。一个kernel需要升级,然后你会发现跟着有kmod开头的几个文件跟着升级,版本号和kernel的一样。这些kmod就是模块。或者你用nVidia的显卡,在nVidia网站上下载驱动(那个run扩展名的),你会发现,只要换kernel,你的驱动就在重新安装一遍,nVidia驱动的内核部分要重新编译。虽然模块可以动态装载卸载,但是可以看出,只要内核一变,所有的东西都要重新编译。
嗯,现在好像也没有谁再争两种内核的优缺点了。毕竟微内核中有执行效率非常高的内核(L4),单内核中也有灵活性很高的内核(Linux)。
OK,很和谐的结尾。
推荐一本书:《Linux内核设计与实现(第二版)》(Linux Kernel Development),Robert Love著,机械工业出版社出版中文版。这本书基于kernel 2.6.x。简单翻翻都很有意思。