或许我们该重新审视微内核
摘要
本文认为,现代硬件(特别是IOMMU)通过消除上下文切换的开销,使微内核再次变得可行,并建议重新审视微内核设计以提高安全性和可靠性。
<p><a href="https://lobste.rs/s/krsvrp/maybe_we_should_revisit_microkernels">评论</a></p>
查看缓存全文
缓存时间: 2026/07/26 00:09
# 也许我们该重新审视微内核
来源:https://notes.hella.cheap/maybe-we-should-revisit-microkernels.html
## 微内核
如果你想了解微内核的完整定义,可以阅读维基百科文章(https://en.wikipedia.org/wiki/Microkernel),但用一句话概括就是:这是一种内核,其中除调度、管理 I/O 设备访问以及进程间通信(IPC)之外的所有内容都运行在用户空间中。
## 为什么要用微内核?
更高的安全性、更高的可靠性、更好的模块化。安全性更高,因为在微内核系统中,某个驱动程序中的漏洞只会让攻击者访问该子系统(甚至可能仅限于该驱动程序),而不像当今主流操作系统那样,攻击者可以无限制地访问整个系统。可靠性更高,因为某个子系统崩溃只会导致该子系统瘫痪,而不会导致整个系统崩溃;如果 Windows 是微内核系统,那么 CrowdStrike 漏洞(https://en.wikipedia.org/wiki/2024_CrowdStrike-related_IT_outages)只会让部分 IT 安全人员无法获取遥测数据,而不会成为头版新闻。如果 Linux 是微内核系统,那么 Linux 内核团队就不必负责合并每个硬件设备的驱动程序,也不必为了正确审查代码而成为 Linux 内核所支持的每个芯片内部工作原理的专家。
## 为什么不用微内核?
如果微内核这么好,为什么不是所有操作系统都采用微内核?在 80 年代和 90 年代,很多人都在问这个问题,他们中的许多人确实构建了微内核操作系统,但结果发现答案是开销太高了¹(https://notes.hella.cheap/maybe-we-should-revisit-microkernels.html#fn:1)。
开销太高是因为 80 年代的计算机无法让用户空间进程直接访问特定的硬件设备。这意味着,例如当文件系统要执行磁盘读取时,它必须进行一次系统调用,而这会触发上下文切换,进而引发大量昂贵的锁定和内存复制操作。
## 为什么现在要用微内核?
用一个词回答:IOMMU(https://en.wikipedia.org/wiki/Input%E2%80%93output_memory_management_unit)。如今几乎所有在用的 PC 都配备了 IOMMU,它已经是标配大约十年了。通过正确使用 IOMMU 和共享内存,你可以完全消除正常路径中的上下文切换(正常路径指当有足够多核心,所有需要完成的工作都可以由当前正在运行的进程完成的情况),并且如果你愿意接受一点延迟,几乎可以消除整体上的上下文切换。
在微内核系统中,内核需要完成三件关键任务:调度、进程间通信以及管理 I/O 设备访问。
基于虚拟化技术(IOMMU 是其一部分)的微内核调度器看起来会像 Xen(https://xenproject.org/)虚拟机监视器那样。
对 I/O 设备的访问由 IOMMU 在硬件层面管理。
要实现零开销(至少在正常路径下)的 IPC,你只需要能够在进程间分配共享缓冲区,以及整数的原子比较并交换操作。这让你可以将共享缓冲区用作命令队列;只需一个环形缓冲区,配合原子操作来移动起始和结束指针。这样你就可以异步传递消息,无需上下文切换、无需在地址空间之间复制数据、也无需锁。这种模式如今在 GPU 驱动等场景中被广泛使用。
## 共享库怎么办?
当你的操作系统进程实际上是虚拟机来宾时,共享库如何工作?在启动时将库链接到程序中,并以外核(https://pdos.csail.mit.edu/6.828/2008/readings/engler95exokernel.pdf)风格在本地实现所有不需要在其他进程中完成的功能。如今每个应用都自带一份自己的操作系统副本(以 Electron 的形式),因此内存中冗余的库副本不再是三十年前那样的问题了。
## 实际实现这样一个系统需要什么?
其实并不复杂。Xen 已经具备你需要的虚拟机监视器层的大部分功能。你可以模仿 Mach 的做法,通过从 FreeBSD 复制代码来实现网络、文件系统等服务器。DRM(https://dri.freedesktop.org/docs/drm/gpu.html)已经基于异步命令缓冲区,因此你可以从 Linux 复制图形子系统并在用户空间中运行(尽管将显示服务器运行在同一进程中可能会更方便)。
相似文章
是时候采用新的嵌入式Linux构建系统了吗?
文章指出,像Yocto和Buildroot这样的传统嵌入式Linux构建系统对于需要持续更新和云化行为的现代产品而言正变得过时,并建议需要一种新的构建系统设计方法。
浏览器标签中的Windows内核,第一部分:冷启动、快速启动与四兆字节
本文介绍了 nanokrnl(一个用 Rust 编写的 64 位 Windows 内核)和 nanox(一个 65KB 的 WebAssembly 模拟器),后者可直接在浏览器中以长模式启动该内核,仅需约四兆字节即可运行一个操作系统。
近期内核漏洞、攻击面减少,以IPSEC为例
Hanno Böck 讨论了影响 ESP (IPSEC) 模块的近期内核漏洞,并建议禁用与 IPSEC 相关的内核配置选项以减少攻击面,突出显示了默认情况下加载了许多未使用的内核模块。
🤗 Kernels: 重大更新
Hugging Face 为其 Kernels 项目引入了重大更新,包括 Hub 上的新仓库类型、通过可信发布者和内核签名改进的安全性、改版的 CLI、扩展的框架/后端支持,以及为智能内核开发奠定基础。
由LLM生成的安全报告推动的内核代码移除
Linux内核维护者正在移除无人维护的网络和业余无线电子系统,以应对AI生成的大量安全报告对审核带宽造成的冲击。