操作系统基础3-宏内核与微内核
2020-10-11 22:04·转载自重学IT的老猫
操作系统的内核
内核 是计算机上配置的底层软件,是操作系统最基本、最核心的部分。实现操作系统内核功能的那些程序就是内核程序。
可以看到内核的主要功能有:时钟管理、中断管理、原语(设备驱动、CPU切换等)。还有对系统资源的管理功能:进程管理、存储器管理、设备管理等功能。有些操作系统不把这部分功能归为"内核"功能,不同的操作系统对内核功能的划分可能不一样。
宏内核与微内核
宏内核
简单的讲宏内核就是操作系统是个大管家,几乎包办一切,用户应用程序的需求直接向内核提出就行;微内核更像一个代理人,几乎所有的驱动、文件系统全部运行在与用户应用程序平级的用户模式下。
UNIX 系统,1971 年诞生于大名鼎鼎的贝尔实验室的一台 PDP-11/24 机器上,其后经过不断发展与传播,在 80 年代取得了巨大成功,UNIX 被移植到众多的处理器架构,并在众多行业得到广泛使用,甚至成为行业标准影响至今。
庞大的 UNIX 家族
UNIX 以及类 UNIX 系统如 Linux 都是典型的宏内核设计,也就是把所有系统服务都放到内核里,因为系统服务代码之间存在大量数据交换和大量的服务请求,而在同一个代码段内进行函数调用(C 语言)或跳转(汇编或者机器码时代)是最直接、最高效的方法,在同一片地址空间也方便数据交换,所以这样的宏内核设计是很自然的。
微内核
微内核设计的基本思想是简化内核功能,在内核之外的用户态尽可能多地实现系统服务,同时加入相互之间的安全保护。内核只提供最基础的服务,比如多进程调度、多进程通信(IPC)等。其中进程通信是作为连接应用与用户态系统服务的桥梁。
宏内核与微内核的对比示意图
微内核则把更多的系统服务(例如文件系统、POSIX 服务、网络协议栈甚至外设驱动)放到用户态应用,形成一个个服务,等待其他应用的请求。
微内核在效率方面肯定是处于劣势的,所以目前的主流操作系统如Linux和Windows本质上使用的都是宏内核,当然有读者可能会提出Windows使用的是混合内核,不过这种混合内核也是以效率优先的扁平化架构,本质上还是宏内核。
下面重点说说微内核
微内核这个概念从提出开始就在不断地发展、完善进步之中,到目前为止可以分为三代。
第一代微内核:从无到有
第一代微内核的主要代表是 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 内核还不算完全的微内核。而考虑到微内核可以更高效地利用多处理器计算机的处理器核心资源,人们期待着等 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 还是第一个完全通过形式化验证的内核,通俗说形式化验证就是在数学软件的帮助下使用数学语言自动化地推导检查系统的每一个运行状态。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)所选用,该管理引擎主要负责管理英特尔芯片的内部模块。
华为的鸿蒙操作系统就是微内核系统。
做一个比较简单的类比,如果把操作系统看成一家公司,而宏内核的特点是用户请求直达内核,内核统一安排执行,这代表此公司使用扁平化的管理架构,而微内核的操作系统中则需要设立很多如驱动,文件系统等部门,这显示公司使用制度化、等级化的管理架构。
上下文及上下文切换**:这个名词经常出现在各类操作系统的书籍当中,还是以公司为例,上下文就代表了处理一个项目所需要的相关材料、文件,而上下文切换则代表这些材料文件在不同部门(进程)或者领导(CPU)之间的流转。**
**状态保持(快照)及恢复:**假设这样一种场景,我正在领导的办公室中汇报工作,此时外面另一个人有更重要的事情向领导汇报,由于涉及权限问题需要我先退出他的办公室,那么我在退出前需要做一次状态快照,以便领导处理完紧急事务后可以继续处理我的工作。这就是计算机中状态保持与恢复的过程。
运行效率宏内核更优:相信大家都有过跑部门跑公章的经历,很多时间、精力都浪费在了部门(进程)之间的上下文切换(上文已经释义)中了,微内核在效率方面肯定是处于劣势的,所以目前的主流操作系统如Linux和Windows本质上使用的本质上都是宏内核。
安全性的比较,其实仅凭直觉就能得到正确结论。正如各位日常所见,正规军队采用的都是“下级服从上级、命令绝对执行”的管理方式,而只有游击队才搞会扁平化管理的。其中逻辑也不难理解,扁平化虽然能有比较高的效率,但是难免会在身份鉴别、数据传递的过程中出现纰漏,从而给入侵者可趁之机。
我们也知道宏内核的操作系统尤其是Windows,经常会暴出安全漏洞,用户在没有泄露密码且没使用问题硬件的情况下,还是会遭到被黑客入侵。所以在安全性对比上微内核可谓优势明显。
宏内核vs微内核 谁实时性强? 这个问题的答案可能与读者的第一反应不同,效率更优的宏内核在实时性方面的表现其实不如微内核。那些对于实时性要求极高的军用操作系统(如vxWorks等)使用的都是微内核架构。
总结:
微内核效率比宏内核慢,但在安全性、可靠性方面要比宏内核好,在扩展性方面微内核也有优势。
从内核构架发展趋势来说目前微内核正在回归,正好说明了微内核与多处理器的硬件平台配合会更好。如果微内核真正解决了效率方面的不足,那一定会有比Linux更为强劲的基于微内核架构的操作系统的出现。