内核

电脑软硬之间的架构与关系图,可以看到核心进行的是应用软体和电脑硬体的互动工作

核心(英语:Kernel,又称内核)在计算机科学中是一个用来管理软体发出的资料I/O(输入与输出)要求的电脑程式,将这些要求转译为资料处理的指令并交由中央处理器(CPU)及电脑中其他电子元件进行处理,是现代作业系统中最基本的部分。它是为众多应用程式提供对电脑硬体的安全存取的一部分软体,这种存取是有限的,并由核心决定一个程式在什么时候对某部分硬体操作多长时间。直接对硬体操作是非常复杂的。所以核心通常提供一种硬体抽象的方法,来完成这些操作。有了这个,通过行程间通讯机制及系统呼叫,应用行程可间接控制所需的硬体资源(特别是处理器及IO装置)。

严格地说,核心并不是电脑系统中必要的组成部分。有些程式可以直接地被调入电脑中执行;这样的设计,说明了设计者不希望提供任何硬体抽象和作业系统的支援;它常见于早期电脑系统的设计中。但随着电脑技术的发展,最终,一些辅助性程式,例如程式载入器和除错器,被设计到机器核心当中,或者写入在唯读记忆体里。这些变化发生时,作业系统核心的概念就渐渐明晰起来了。

分类

核心在设计上可以概分为宏核心微核心两大架构。在宏核心与微核心之间,进行妥协的设计,这称为混合核心,但是混合核心能否被列为第三大架构,目前仍然有争议。另外与微核心相似,有一种极端的设计方式,称为外核心,仍还在研究阶段,没有任何一个流行的作业系统采用了这种设计。

单核心

单核心的示意图

单核心结构在硬体之上,定义了一个高阶的抽象介面,应用一组原语(或者叫系统呼叫System call))来实现作业系统的功能,例如行程管理档案系统,和储存管理等等,这些功能由多个执行在核心态模组来完成。

尽管每一个模组都是单独地服务这些操作,核心代码是高度整合的,而且难以编写正确。因为所有的模组都在同一个核心空间上执行,一个很小的bug都会使整个系统崩溃。然而,如果开发顺利,单核心结构就可以从执行效率上得到好处。

很多现代的单核心结构核心,如LinuxFreeBSD核心,能够在执行时将模组调入执行,这就可以使扩充核心的功能变得更简单,也可以使核心的核心部分变得更简洁。

单核心结构的例子:

微核心

微核心的示意图

微核心结构由一个非常简单的硬体抽象层和一组比较关键的原语或系统呼叫组成;这些原语,仅仅包括了建立一个系统必需的几个部分;如执行绪管理,位址空间行程间通讯等。

微核的目标是将系统服务的实现和系统的基本操作规则分离开来。例如,行程的输入/输出锁定服务可以由执行在微核之外的一个服务组件来提供。这些非常模组化的使用者态伺服器用于完成作业系统中比较进阶的操作,这样的设计使核心中最核心的部分的设计更简单。一个服务组件的失效并不会导致整个系统的崩溃,核心需要做的,仅仅是重新启动这个组件,而不必影响其它的部分。

微核心将许多OS服务放入分离的行程,如档案系统,装置驱动程式,而行程通过讯息传递呼叫OS服务。微核心结构必然是多执行绪的,第一代微核心,在核心提供了较多的服务,因此被称为'胖微核心',它的典型代表是Mach,它是Mac OS X的核心,可以说,蒸蒸日上。第二代微核心只提供最基本的OS服务,典型的OS是QNX,QNX在黑莓手机BlackBerry 10系统中被采用。

微核心结构的例子:

单核心与微核心的比较

单核心结构是非常有吸引力的一种设计,由于在同一个位址空间上实现所有复杂的低阶作业系统控制代码的效率会比在不同位址空间上实现更高些。

20世纪90年代初,单核心结构被认为是过时的。把Linux设计成为单核心结构而不是微核心,引起了无数的争议(参见塔能鲍姆-林纳斯辩论)。

现在,单核结构正倾向于设计不容易出错,所以它的发展会比微核心结构更迅速些。两个阵营中都有成功的案例。微核经常被用于机器人和医疗器械的嵌入式设计中,因为它的系统的关键部分都处在相互分开的,被保护的储存空间中。这对於单核设计来说是不可能的,就算它采用了执行时载入模组的方式。

尽管Mach是众所周知的多用途的微核心,人们还是开发了除此之外的几个微核心。L3是一个演示性的核心,只是为了证明微核心设计并不总是低执行速度。它的后续版本L4,甚至可以将Linux核心作为它的一个行程,执行在单独的位址空间。

QNX是一个从20世纪80年代,就开始设计的微核心系统。它比Mach更接近微核心的理念。它可以被用于一些特殊的领域;在这些情况下,由于软体错误,导致系统失效是不允许的。例如太空梭上的机械手,还有研磨望远镜镜片的机器,一点点失误就会导致上千美元的损失。

很多人相信,由于Mach不能够解决一些提出微核心理论时针对的问题,所以微核心技术毫无用处。Mach的爱好者表明这是非常狭隘的观点,但遗憾的是似乎所有人都开始接受这种观点。

混合核心

混合核心的示意图

混合核心的设计理念来自微核心,只不过它让一些微核结构执行在使用者空间的代码执行在核心空间,这样让核心的执行效率更高些。这是一种妥协做法,微软视窗就是一个典型的例子。另外还有XNU,执行在苹果Mac OS X上的核心,也是一个混合核心。林纳斯·托瓦兹认为混合核心这种分类只是一种市场行销手法,因为它的架构实作与运作方式接近于宏核心。

混合核心的例子:

外核心

外核心系统,也被称为纵向结构作业系统,是一种比较极端的设计方法。

它的设计理念是让使用者程式的设计者来决定硬体介面的设计。外核心本身非常的小,它通常只负责系统保护和系统资源复用相关的服务。

传统的核心设计(包括单核和微核)都对硬体作了抽象,把硬体资源或装置驱动程式都隐藏在硬体抽象层下。比方说,在这些系统中,如果分配一段物理储存,应用程式并不知道它的实际位置。

而外核的目标就是让应用程式直接请求一块特定的物理空间,一块特定的磁碟块等等。系统本身只保证被请求的资源当前是空闲的,应用程式就允许直接存取它。既然外核系统只提供了比较低阶的硬体操作,而没有像其他系统一样提供进阶的硬体抽象,那么就需要增加额外的执行库支援。这些执行库执行在外核之上,给使用者程式提供了完整的功能。

理论上,这种设计可以让各种作业系统执行在一个外核之上,如Windows和Unix。并且设计人员可以根据执行效率调整系统的各部分功能。

现在,外核设计还停留在研究阶段,没有任何一个商业系统采用了这种设计。几种概念上的作业系统正在被开发,如剑桥大学的Nemesis,格拉斯哥大学的Citrix系统和瑞士电脑科学院的一套系统。麻省理工学院也在进行着这类研究。

参考文献

参见