浅谈操作系统内核

好久没写博客了,这可不行。

程序员三大浪漫中,操作系统是最浪漫也最不浪漫的那一个。
说他浪漫,是因为操作系统是最接近计算机底层的一个,纵然图形学和编译原理也和底层打交道,而操作系统就是在底层上飞翔,这十分浪漫。
说他不浪漫,是因为操作系统是三大浪漫中最脏(Dirty)的一个,就好比驾驶员、汽车设计师和修车工一样,历史遗留、硬件设计等各种因素影响着一个操作系统程序员奔驰的空间。
但是操作系统仍然令人神往,现代操作系统可以说是大同小异。
以Windows为代表的NT内核、macOS使用的Mach内核、Linux的部分实现均是混合内核的设计。Linus认为Linux的宏内核就是宏内核,但实际上本人更愿意将其视为比较宏内核的混合内核。
混合内核是微内核和宏内核的一种妥协。
宏内核最具有代表性的就是早期的Linux等80年代之前的操作系统,Dos、Unix都是这种设计的产物。其特征就是整个内核就是一个可执行文件,运行在系统态。也就是说,整个内核就是一个编译好的a.out,运行在一个进程上,并抽象出多个系统调用以供普通程序调用。
微内核最具有代表性的就是Minix,核心就是进程间通信,操作系统内核作为“邮局”一般的存在,使各个运行在用户态的服务协调运作,从而达到控制系统的目的。一个微内核的操作系统是由各种服务组成的。
可以看出,宏内核的优点在于性能;运行期无需反反复复切换进程,也无需过多的寻址和切换,就好像直接调用函数一样,系统模块能够十分高效地访问系统资源。而微内核的优点在于可移植性和稳定性;任何一个模块都可以遵循协议很快速地移植到新的机器,而任何出错的模块都可以被卸载重装,同时不影响内核的正常运行。
一个的优点便是另一个的缺点。
所以为了找寻这个平衡点,包括犟驴Linus在内的一众内核开发者,引入了混合内核的这个概念。
混合内核便是微内核,但是系统服务运行在系统态,从而另性能提升。
现代CPU在权限上分为四个,从Ring0到Ring3,然而就Linux而言,仅仅使用了Ring0和Ring3,一般称Ring0为系统态(或观察者空间),Ring1~3为用户态。这种设计是为了更好的安全性,操作系统受制于硬件设计,硬件设计又被操作系统影响。
其实有个操作系统设计叫做外内核(ExoKernel)。特征是提供程序较多直接控制硬件的手段(通过库),而提供更少的抽象方法。现在正处于研究阶段,我也不知道个所以然。
可以说操作系统的设计一直以来都在大框架上修修补补,并没有令人耳目一新的设计存在。

操作系统逃不开进程控制。
操作系统为了协调进程,必然无法使进程控制其本身。而为了安全性,进程也应该不知道它是个进程。完美的黑箱进程是应该认为自己是物理机上运行的唯一程序,可以通过接口访问外部资源。虽然现如今进程可以通过各种方式得知自己的相关信息,但是我认为良好的操作系统设计不应该这样,IPC(进程间通讯)也应该是黑箱的。
设想一种操作系统,进程可以抢占系统的所有资源,让系统暂停运行,从而使其自己占有全部的CPU时间。这种操作系统可以看作是实时系统的极端——一个进程只有当主动让出CPU的时候才可以调度其他进程。所以自然是不切实际的,但是若可以另一个进程可以适时抢占一下资源,未必也不是一种方法?
而关于进程控制,则又是一种设计了……
本人才疏学浅,所谈之处多有谬误。望海涵