APP下载

微核心到底是什么?一文带你认识微核心

消息来源:baojiabao.com 作者: 发布时间:2024-04-27

报价宝综合消息微核心到底是什么?一文带你认识微核心

背景庞大的UNIX家族

计算机技术在二战后快速发展,构成计算机的主要基本单元从电子管发展到分立晶体管,再到后来的大规模积体电路。随着计算机技术发展,计算机效能越来越强劲,硬件越来越复杂,人们发现很难去直接管理计算机了,于是人们开始设计软件用于管理越来越复杂的计算机系统,这些软件称作系统级软件。从最开始的批处理系统,多道程式系统,分时系统到上世纪60年代开始出现通用操作系统,计算机系统层出不穷,直到上世纪70年代才出现被大家广泛接受广泛使用的通用操作系统。其中最经典的当然就是UNIX系统了。

UNIX系统,1971年诞生于大名鼎鼎的贝尔实验室的一台PDP-11/24机器上,其后经过不断发展与传播,在80年代取得了巨大成功,UNIX被移植到众多的处理器架构,并在众多行业得到广泛使用,甚至成为行业标准影响至今。

UNIX以及类UNIX系统如Linux都是典型的宏核心设计,也就是把所有系统服务都放到核心里,因为系统服务程式码之间存在大量资料交换和大量的服务请求,而在同一个程式码段内进行函式呼叫(C语言)或跳转(汇编或者机器码时代)是最直接、最高效的方法,在同一片地址空间也方便资料交换,所以这样的宏核心设计是很自然的。

但是随着UNIX核心功能的拓展(档案系统、TCP/IP网络协议栈、程序管理、内存管理、驱动程式等),UNIX核心程式码也相应增加了很多,进而在可维护性.稳定性,安全性方面面临一些挑战。为了试图解决这些挑战,人们开始尝试使用微核心的思想来设计系统核心。

什么是微核心?

微核心设计的基本思想是简化核心功能,在核心之外的使用者态尽可能多地实现系统服务,同时加入相互之间的安全保护。核心只提供最基础的服务,比如多程序排程、多程序通讯(IPC)等。其中程序通讯是作为连线应用与使用者态系统服务的桥梁。

下图是宏核心与微核心的对比示意图

宏核心系统相关的服务基本都是放于核心态核心中,例如档案系统、装置驱动、虚拟内存管理、网络协议栈等;而微核心则把更多的系统服务(例如档案系统、POSIX服务、网络协议栈甚至外设驱动)放到使用者态应用,形成一个个服务,等待其他应用的请求。而后来,为了在宏核心与微核心之间扬长避短,也发展出了中间的混合核心的形态,部分服务也会放置于核心中。

微核心的发展历史

微核心这个概念从提出开始就在不断地发展、完善进步之中,到目前为止可以分为代。

第一代微核心:从无到有

第一代微核心的主要代表是Mach,该系统由卡内基-梅隆大学的Avie Tevanian和Richard Rashid主导开发。在Mach刚刚开始设计时,UNIX的发展正如日中天,所以Mach在设计时的一大目标就是相容UNIX,但是与UNIX不同的是Mach尝试使用微核心架构去设计。Mach以IPC是作为所有系统服务与核心交换资料的基础机制,充分运用IPC、虚拟内存、多程序等特性将冗余的系统服务移出核心作为程序执行。

1986年,经过两年的开发,第一版的Mach释出后的第二年,Mach就释出了第2版,不过由于时间仓促,加之没有足够的人手与资金,所以此时Mach核心并不提供完全的系统服务。为了支撑系统上层执行,这一版的核心包含了大量4.3版本的BSD系统(UNIX的一个分支)程式码提供系统服务,并且BSD系统服务执行在核心状态,这导致Mach核心的程式码体积甚至大于常规UNIX核心。第一版和第二版的Mach主要做了如下工作:1. 验证了微核心的可行性;2. 在多处理器计算机上进行移植验证了微核心在多处理器计算机上的执行;3. 最后为了提高IPC的效率,Mach使用共享内存机制来完成IPC。而Mach的共享内存机制是在虚拟内存技术的支援下实现的,只有需要对内存进行写入时才进行复制。这么一处理比每次都复制一遍内存节省了内存使用同时又加快了IPC机制的处理时间,这个改进称为写时复制,并且在如今的通用操作系统如Linux中常常用到。

经过测试,Mach 2.5的效率最多比UNIX少25%,但是考虑到Mach带来的可靠性、可拓展性、安全性,这个效率损失尚可以接受。当然此时Mach核心还不算完全的微核心。而考虑到微核心可以更高效地利用多处理器计算机的处理器核心资源,人们期待着等Mach把系统服务都搬到核心之外后可以把执行效率损失降下来。同时Mach在微核心方面小小的尝试迅速吸引了大批公司与组织的注意,开放软件基金会(Open Software Foundation, OSF)宣布下一代系统OSF/1将基于Mach的核心, NeXTSTEP也将使用Mach2.5, 甚至IBM也打算利用Mach构建Workplace OS。苹果公司这个时候也出手了,苹果公司也从此基于Mach2.5打造其操作系统核心XNU,XNU的构成如下图所示,Mach作为核心的内环,外环右侧是苹果的驱动框架(I/O Kit),外环左侧是BSD的系统服务程式码提供UNIX相容的服务层,这三者共同协作向上层提供完整的系统服务。XNU广泛地使用在苹果公司的OSX,IOS等系统中。

这个时候由于UNIX系统广泛使用带来的商业利益,此时BSD系统开发者与UNIX的拥有者AT&T陷入了法律大战,Mach使用的BSD相关程式码有了法律风险。提升效能的期望和规避法律风险的需求推动着Mach 3.0的开发,Mach 3.0的开发目标主要是为了替换BSD系统服务,同时尽量多地将系统服务放到核心之外去执行,成为名副其实的微核心设计。经过众多开发者3年的努力,Mach 3.0于1990年释出,但是由于在系统服务之间完全使用IPC通讯,而不是向宏核心那样直接进行函式呼叫,即便是多处理器机器上执行也效能损失惨重,Mach 3.0最多比UNIX损失 67% 执行效率,这导致Mach 3.0以及其所代表的第一代微核心设计被看衰。此后断断续续有在Mach的基础上对效能进行提升的尝试,但是均不太理想,至此Mach成为了微核心第一代先驱者。

第二代微核心:解决效能问题

第二代微核心的主要代表是L3和L4,以及QNX系统使用的Neutrino核心。前面第一代的微核心Mach由于效率问题虽然失败了,但是微核心的理念并没有被放弃,德国的电脑科学家Jochen Liedtke认为Mach的IPC效率低下的原因就是因为IPC部分不够精简,于是他开发了L3和L4微核心,对IPC部分进行了很彻底的精简:1. 核心的IPC机制只是单纯地传递资讯,诸如安全许可权检查这类的程式码都省略掉,省略掉的功能全部由使用者程序自己处理。如此一来IPC功能部分的程式码执行时间大大缩短;2. IPC不使用内存传递讯息,而使用暂存器传递讯息,同时限制IPC每次传递的资讯长度,这样省去了对内存的访问时间。L4微核心的IPC速度经过测试要比Mach快20倍,这个令人惊讶的优化效果吸引了众多的目光,使微核心的研究重新火热起来。后面L4核心又发展出了很多相关系统,比如Pistachio,L4/MIPS,与Fiasco等等,这些核心组成了L4的大家族。

第二代微核心的代表除了有L4核心,也还有其他微核心比如Exokernel、Rambler等,不过商业上最成功的则是目前黑莓公司旗下的QNX系统所使用的Neutrino核心(QNX,1980年诞生,最初以QUICK UNIX为名,后改为QNX;2004年QNX被Harman国际收购;2010年Harman国际下被黑莓收购,QNX成为黑莓旗下的资产),QNX主要为高可靠领域提供解决方案,比如交通、能源、医疗、航天航空等。

第三代微核心:主要重视安全问题等

在前面两代的基础上,第三代微核心蓬勃发展,许许多多微核心都被开发出来,主要代表有:seL4、Fiasco.OC、NOVA等。本来第一代微核心的设计隔离了使核心安全性降低的系统服务,让系统服务漏洞不会影响核心,进而提高了核心安全性,可以说是关上了破坏系统的门, 但是第二代系统却又给攻击者开了个窗户;由于第二代微核心在核心中省去了关于安全性检查等步骤,把所有关于安全检查功能的实现都交给系统服务自己去实现,这导致系统服务的通讯界面直接暴露给使用者态,任何程序都可能无限制地请求系统服务,系统服务不得不花费额外的代价来区分请求是否合法,容易造成拒绝服务攻击。比如正常的档案服务应该是从虚拟档案系统服务->档案系统服务->磁盘驱动服务这个流程来完成的,但是如果攻击者如果绕过虚拟档案系统服务,直接无限制地请求攻击者本身没有许可权访问的档案系统服务,使档案系统服务长期处于满载状态,让其他程序无法通过正常的虚拟档案系统得到档案系统服务。为了增强安全性,且不过分影响效能,人们开始研发第三代微核心。

seL4是在第二代核心L4的基础上发展而来的。seL4不仅仅继承了L4核心家族的高效能特性,还具备基于端点(enndpoint)的IPC机制。这种IPC机制最大的特点是使用了能力空间的概念,程序在使用IPC请求系统服务时必须具备相对应的能力,程序持有不可伪造的令牌来表示拥有请求某种服务的能力。令牌可以被复制,可以被转移,还可以通过IPC进行传输。令牌其实是一个指向存在于核心空间核心物件的指标,所以普通程序并不能修改自身以及其他程序的许可权分配,但是核心可以对令牌指定的许可权进行控制,从而保证了使用者态不能绕过能力空间这个机制对系统服务造成滥用。

seL4还是第一个完全通过形式化验证的核心,通俗说形式化验证就是在数学软件的帮助下使用数学语言自动化地推导检查系统的每一个执行状态。

其他的微核心系统:Fuchsia,Minix

Fuchsia是Google开发的一款全新操作系统,试图覆盖手机、平板甚至笔记本等一系列领域。Google为该系统配备了Vulkan图形界面、3D桌面渲染Scenic、Flutter应用开发框架,还有一个称为zircon的微核心。zircon核心是从高通平台的一个Bootloader专案:Little Kernel发展而来。zircon核心属于微核心设计,只提供IPC,程序管理,地址空间管理功能。zircon区别于以程序或者以档案为核心的设计,zircon是以内存为核心来设计的,内存在zircon中是以物件的方式存在,可以通过channel通讯机制传递虚拟内存物件(Virtual memory object)的控制代码,程序拿到控制代码后可以把这块内存对映到自己的空间。

Minix系统则由荷兰阿姆斯特丹的Vrije大学的Andrew S.Tanenbaum教授所开发。该系统最大的特点是可以故障隔离,自动重启失败的服务。Minix使用分层设计,最底层的微核心提供中断处理、程序管理、程序通讯等服务,这一层执行在核心态;中间层提供轮回服务(Reincarnation Server)、档案服务、程序管理、X图形服务以及驱动等,这一层执行在使用者态;最上层为使用者程序。其中轮回服务负责在中间层的服务出现崩溃时重启这些服务,从而保证服务的自我修复。Minix由于其自我修复特性被英特尔管理引擎(ME)所选用,该管理引擎主要负责管理英特尔芯片的内部模组。

微核心的优缺点

优点

1-系统服务模组化,可移植性高;

2-核心安全性提高(模组内部的bug不影响核心稳定,将黑客利用软件漏洞造成的破坏限制在单个模组内部);

3-可以多套系统服务共存,相当于同时执行多种操作系统;

4-稳定统一的界面(可以独立维护私有驱动以及服务,不需要跟核心源代码系结);

5-在商业上,微核心可以避免程式码受到一些开源协议的影响,比如GPL协议;

6-核心精简,可以进行形式化验证,利用数学证明核心的安全性;

7-数学可证明的实时性;

8-非常适合多处理器系统设计,在多处理器核心计算机上,互相依赖的系统服务可以同时执行;

缺点

1-通过程序通讯的方式交换资料或者呼叫系统服务,而不是使用系统呼叫,造成额外的操作系统开销;

2-使用一些频繁使用的系统服务时,比如网络收发资料,造成的程序上下文切换对操作系统来说也是一个负担;

3-由于系统服务高度模组化,系统服务之间存在大量的内存复制;

4-对互相之间存在复杂呼叫关系的系统服务,难以设计通讯界面;

5-系统服务与核心在地址空间上分离,造成程式码区域性性差,降低了cache命中率;

2019-08-13 22:49:00

相关文章