华为的蒙鸿操作系统自发布以来受到了广泛的关注,其一大特点就是采用“微内核”架构。
我们学习操作系统课程的时候,讲到微内核由来已久,有众多天然优势,是未来系统的发展方向。可是事实上,真正进入工业级应用的微内核操作系统并不多。这个分歧主要是学术界和工业届的分歧,学术界认为,微内核是操作系统发展的主流方向,但一直以来工业界不这么认为。
当年 Linus 推出 Linux 以后,和他的老师 Andrew Tanenbaum(写 Minix 系统的牛人)就宏内核和微内核进行了激烈的辩论,即著名的“Tanenbaum – Torvalds debate”。
什么是“微内核”架构
微内核是指操作系统的最底层是一个包含最基本功能的 Kernel(内核),这个内核通常只负责最基本的最底层的任务,如上下文切换、中断处理、进程间通信(IPC)和时钟处理等,而其他的系统任务,如硬件驱动,文件系统和内存管理都以用户态进程(即ring3)的形式运行,并且相互之间通过IPC进行通信。
宏内核则与之相反,所有的系统任务均在内核态(ring0)处理,系统模块之间通过函数调用方式进行交互。这两个不同架构模式的操作系统概念自提出已经过去了三十年(最早的微内核系统是由卡内基梅隆大学开发的 Mach,于1985年被提出,之前的操作系统都是宏内核,如Unix 等。
“微内核”优缺点
工业界和学界普遍认为微内核的优势在于内核很轻(通常C代码在 10000 行左右),因此攻击面和代码出错的可能性更低。微内核比宏内核依赖更为简单,而且大部分任务是以进程的方式运行,一旦出错只会影响到这个进程本身,稳定性更强。
另一方面,由于内核的精简化,所以这样的操作系统内核可以很方便的进行移植,由于这种内核是小型的,不包括其他功能性模块,可以让我们随意的拼凑,这样就是可以得到不同组合。如华为鸿蒙系统那样:
鸿蒙OS实现模块化耦合,对应不同设备可弹性部署,鸿蒙OS有三层架构,第一层是内核,第二层是基础服务,第三层是程序框架 。可用于大屏、PC、汽车等各种不同的设备上。还可以随时用在手机上,但暂时华为手机端依然优先使用安卓。
不过微内核的整体性能不如宏内核,这对于追求性能的厂商而言,采用宏内核无可非议。我们平常接触到的操作系统,大多数都是宏内核,包括 Windows 系统和类 Unix 系统,微内核一度仅局限于研究目的。
但随着硬件和处理器性能的快速发展,摩尔定律和多核技术使得计算机基本处于过剩状态,而现在大部分性能问题可以说是软件造成的。而且 L4 在微内核本身的 IPC 性能方面已经有了长足的发展,性能不再是限制微内核发展的主要原因。
Windows、macOS、Linux 三大操作系统是微内核吗?
Linux 由于是开源系统,采用宏内核这点没有任何疑问。在编译 Linux 内核的时候,会接触到 module 概念,但这些 module 共享同一个 address space(地址空间)。而在微内核操作系统中,module 彼此之间通常是隔离的,具有不同的 address space。
Windows 和 macOS,都宣称采用微内核架构。为了追求效能,他们将需要具备特权的服务组件放进核心空间,违反了微内核的基本设计原则,更为接近整块性核心的设计方式,可称为混合内核。
“微内核”的历史
微内核家族
第一代为内核系统 Match 由于 IPC 性能令人失望, 德国的 Jochen Liedtke 提出了 L3 和后续的 L4 结构,对IPC的性能改进很大,甚至相比较 Unix 都有很大的性能优势。为了追求效率,L4 用汇编语言实现,但也导致第一代 L4 只能运行在 486 和奔腾处理器上面。目前 L4 已经变成微内核的一个设计标准,围绕这个标准,有很多的 L4 的实现。
最初的由 Jochen 设计的 L4 目前称之为 L4/X86,现在最活跃的两个分别是 Pistachio 和 Fiasco。前者是普通的微内核,后者是专门为实时系统设计的为内核,实现了L4V2(L4 API Version 2)。由于 Fiasco 跟 L4 关系,所以平时 Fiasco 也被称做 L4/Fiasco,以强调它是L4的一个实现。
Fiasco 的意思是“失败“,是 Dresden Real-Time Operating Systems Project(德累斯敦大学实时操作系统项目)的核心子项目,它是一个具备实时功能的微内核。在一个实时系统里面,通常有两种任务,一种是 real-time 的,另一种是 time-sharing 的。real-time 部分由Fiasco 提供,在 time-sharing 部分,开发者们利用了Linux。开发者对 Linux 进行了修改,使得 Linux 能够运行在 L4/Fiasco,这便是 L4Linux 项目。
进来年来,有两个为内核系统特别受到关注,一个是谷歌的 Fuchsia,另一个是用 Rust 语言实现的 Redox OS。
Fuchsia 是谷歌在 2016 年公开的一个项目,尽管谷歌一直没有对外公布它的目的和计划,但是它普遍被认为将用于取代安卓系统,以求彻底解决安卓及其底层的 Linux 内核的历史问题。Fuchsia 的底层 Zircon 本身是基于lk,而lk原本是一个嵌入式微控制器系统,最具有最基本的任务调度,同步原语等功能。但是 Zircon 在 lk 基础上构建各种系统服务,而 Fuchsia又在Zircon 上构建了图像化服务和其他应用程序。
Redox OS 是一个从2015年开始的开源通用操作系统项目,其遵循微内核架构,最大的特点在于完全使用Rust(和少量必需的汇编)作为开发语言编写操作系统及周围生态(例如文件系统、显示服务器及 Rust 版本的 libc)。Redox 是编写一个完整、功能齐全的通用操作系统的尝试,关注于安全性、自由性、可靠性、正确性和实用性。该项目团队希望能够在没有障碍的情况下使用它作为 Linux 的替代品。它一定程度上兼容于 POSIX,因而应该能够在无需大量修改的情况下运行大多数 Linux 程序。
历史的车轮在前进,新的需求场景不断向现有操作系统提出挑战。如部署于自动驾驶中枢位置的操作系统,对安全性和稳定性的要求将大于兼容性和灵活性,也是微内核发挥长处的地方。鸿蒙采用微内核架构,较传统操作系统,有很多新的优势:
- 高安全性。微内核的代码量大大减少,带来了更高的安全性。有的微内核仅有1万行代码,可以实现形式化证明,从数学上论证代码的安全性。
- 高可靠。微内核的内核非常稳定,具有高可靠性。众多系统服务都运行在用户态模块上,并不影响系统稳定性。
- 高扩展性。由于众多系统服务都转移到了用户态服务模块上,可以方便地根据终端需求进行按需剪裁和添加,实现了高扩展性,适用于不同场景。
- 高可维护性。用户态模块可以彼此独立的启停、卸载和升级。
- 支持分布式计算。用户态服务模块都是独立运行的,天然支持分布式计算。