Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

内核架构分析

本章首先简要介绍传统操作系统宏内核和微内核架构的设计理念和优劣,再介绍本项目采用的混合内核架构设计。

下图显示了不同内核架构的区别。

三种内核架构示意图

传统宏内核架构

以 UNIX/Linux,FreeBSD为代表的宏内核的文件系统 (FS) 和设备驱动 程序等 Linux 模块覆盖了其 3000 万行代码库的 80%。它们导致了大多数缺陷和 漏洞 (在过去 4 年中占 1000 个 CVE 总数的 90%), 并显著降低了可靠性和安全 性 。此外, 这些 CVE 中约有 80% 是数据泄漏, 可以通过适当的隔离来避免。因 此, 一系列的研究旨在以一种划分的方式将内核与模块隔离开来。然而, 固有 的紧密耦合需要大量的工程量, 甚至重写 。虽然 Linux 等宏内核在服务器和云等场景中占主导地位,但越来越多的新兴场景,如智能汽车和智能手机,除了良好的性能之外,还需要更好的安全性、可 靠性和可扩展性,而 Linux 并不合适。此外,Linux 很难满足此类场景所需的高级行业认证。

传统微内核架构

以 seL4 家族、Mach、zircon为代表的微内核的一个主要标志是最小化原 则,即将内核中的功能最小化,并将非核心的所有其他功能移动到用户态的独立 进程中,每个进程拥有相互隔离的地址空间,所以一个模块的故障无法传递到其 他模块影响内核整体本身。相比于宏内核,微内核更小巧、高度模块化,更容易 拓展。最先进的微内核还采用基于权限的细粒度权限访问控制,来支持最小权限 原则。因此,微内核本质上比宏内核更安全、可靠和易扩展。并且 seL4 等现代微 内核已经实现了创纪录的高性能 IPC。

然而,尽管已经被广泛研究了几十年,微内核目前主要针对特定领域,如 嵌入式和安全关键系统。由于微内核面临难以解决的兼容性问题,业界很少采用 微内核作为大规模生产使用的通用操作系统。重建整个软件生态是不现实的,现 代的先进微内核通过提供自定义 libc 库(比如 musl-libc)来实现部分 POSIX 兼容 性,这些库对于操作系统服务生成进程间通信(IPC),但是他们很难在合理的工 程量和不打折扣的性能下重用已有的设备驱动程序。另外,微内核在通用场景中 也面临着严重的性能问题,在通用场景下 IPC 频率会显著增加,微内核本身的基 于权限的细粒度访问控制也可能带来显著的性能开销。

混合内核架构

为了实现系统性能与安全可拓展性的折中,业界采用了混合内核的方案,比 如 Windows NT、Apple XNU 和 HongMeng。混合内核在内核中实现一个 最小的微内核,但不同于微内核将所有其他系统服务放在用户态的独立进程中, 其将所有系统服务以内核线程的形式运行在内核态。尽管混合内核也最大限度地 减少了核心内核中的功能,但它们没有继承微内核的许多优点。混合内核中的操 作系统服务共用内核地址空间,没有很好地隔离,因此,受损或有缺陷的系统服 务仍可能破坏系统,可能导致严重后果,如破坏用户数据。

混合内核架构是系统性能与可靠性之间的一种折中方案,由于多个内核线程仍然共享内核地址空间,所以受损的系统服务仍然有可能破坏内核或其他内核线程的内存空间。但是由于Rust语言天生具有的内存安全特性,在不使用unsafe语法的情况下,不同内核线程之间的访存隔离性可以由Rust语言来保证。