Exokernel — 把抽象推到用户态的极致设计
是什么
Exokernel 是 1995 年 MIT 的 Engler、Kaashoek、O’Toole 提出的新型操作系统架构:把传统 OS 里所有”抽象”(虚拟内存、文件系统、TCP 协议栈)从内核里全部踢出去,搬到一个叫 libOS(库操作系统) 的用户态库里。内核(exokernel)只剩一件事——安全地把硬件资源多路复用给应用。
日常类比:传统 OS 像酒店——前台决定你住几楼、几点退房、毛巾几条。exokernel 像一栋只有保安和钥匙的写字楼——管理员只检查”你有没有这把钥匙能进这间房”,房间里怎么布置完全你自己决定。想做卧室就做卧室,想做实验室就做实验室。
整个想法的口号是 “separate protection from management”——保护(你能不能用)归内核,管理(怎么用)归应用。
为什么重要
不理解 exokernel,下面这些事都没法解释:
- 为什么 2013 年突然出现 unikernel(MirageOS / IncludeOS)这种”把应用和 OS 编译成一个二进制”的东西——它就是 exokernel + libOS 的孙辈
- 为什么高频交易公司用 DPDK 让程序直接和网卡对话、绕过 Linux 内核——这是 exokernel “secure binding” 的工业版
- 为什么 Linux 5.1 加了 io_uring、Intel 推 SPDK——都在把内核功能搬到用户态
- 为什么 30 年后还有人写论文(Arrakis OSDI 2014)说”我们做的就是现代 exokernel”
一句话:exokernel 没赢,但它的思想赢了。
核心要点
exokernel 的设计哲学拆成 三块:
-
保护与管理分离:内核只检查”你能不能用这块物理页”,不管”你怎么用”。所有策略(缓存替换、文件系统布局、TCP 拥塞控制)下放到 libOS。
-
安全绑定(secure binding):应用第一次申请资源时,内核检查权限并发一张”能力券”(capability)。之后每次访问,硬件 + 内核只验证能力券,不再做策略决定。绑定一次,事后内核只在出错时介入。
-
可见的资源回收(visible revocation):内核要收回资源时,先通知 libOS,libOS 自己决定保存哪些状态。如果 libOS 不配合,内核走 abort protocol 强制收回,标记资源为 unmapped。
三块加起来叫 exokernel 架构。论文给的具体实现叫 Aegis(exokernel)+ ExOS(一个仿真 UNIX 的 libOS)。
实践案例
案例 1:libOS 自己写页替换算法
传统 OS:所有进程共用内核里那一套 LRU 页替换。数据库进程想要”我自己懂哪页热”也插不进去。
exokernel:内核只发”物理页 #3742 给你了”这种能力券。LibOS 自己实现页替换——数据库 libOS 用专为数据库优化的 ARC,文件服务器 libOS 用 LFU。同一台机器上多种页替换算法共存。
案例 2:Cheetah HTTP 直接和网卡对话
论文里有个例子叫 Cheetah,一个绕过所有 socket 接口的 web 服务器。它通过能力券拿到网卡 ring buffer 的直接访问权,自己解析 HTTP,自己组装 TCP 包。
性能:比走 ExOS(仿真 UNIX 的 libOS)的标准 socket 接口快几倍。代价:Cheetah 自己得实现一份精简 TCP,bug 自负。
这就是 exokernel 的核心权衡——性能给得起,复杂度你担。
案例 3:abort protocol 长什么样
内核 → libOS:「我要收回物理页 #3742,你 50µs 内交出来」libOS → 把页里数据 swap 到磁盘 → 内核:「拿走」 ↓ 如果 libOS 不响应: 内核:直接 unmap,下次 libOS 访问会触发 fault libOS 自己负责处理这个 fault这套设计确保恶意/有 bug 的 libOS 卡不死内核。
关键性能数据(论文里给的)
| 操作 | Aegis | Ultrix(同时代 UNIX) |
|---|---|---|
| IPC | 5 µs | 几百 µs |
| exception dispatch | 比 Ultrix 快 5 倍 | — |
| process creation | 比 Ultrix 快 7 倍 | — |
ExOS(跑 UNIX 应用)的整体性能与 Ultrix 持平或更好——而 ExOS 本身是用户态库。
三句话讲清楚 secure binding
普通人对”内核做什么”的直觉是:每次系统调用都陷进内核 → 内核检查 → 内核执行 → 返回。这其实有两件事被混在一起:检查权限和执行操作。
secure binding 把这两件事拆开:
- 第一次申请资源:陷入内核,做权限检查,发能力券
- 之后每次访问:硬件 + 能力券验证,不再陷入内核
类比:第一次进健身房刷身份证办年卡(=能力券),之后每次刷卡进门——前台不再问你是谁。这是 io_uring 让 syscall 变快的同一个思路。
踩过的坑
-
POSIX 兼容靠模拟,复杂度反而高:要在 exokernel 上跑 Apache,得装 ExOS(仿 UNIX 的 libOS)。结果 ExOS + Aegis 加起来代码量并不比 BSD 内核小多少,而且多了一层。
-
多 libOS 协调难:libOS A 想要更多 CPU、libOS B 也想要——谁来仲裁?exokernel 论文承认这是 open problem。后来 Arrakis 用硬件辅助才解决。
-
硬件不一定能切片:物理页可以切给不同 libOS,磁盘块可以切,但某些 ASIC 寄存器、GPU 状态没法切。硬件不切片就只能让一个 libOS 独占。
-
安全绑定吃硬件特性:x86 段寄存器在 1995 还能用,64 位时代废弃后实现成本变高。这也是 exokernel 没在 x86-64 时代普及的硬件原因之一。
-
bug 多副本:5 个 libOS 各自实现 TCP,意味着同样的 TCP bug 可能要修 5 次。工业界没人想要这种复杂度。
适用 vs 不适用场景
适用:
- 单一专用应用占满整机(数据库服务器、HFT 交易系统、CDN 节点)
- 实时系统——要绕开通用 OS 的不可预测延迟
- 嵌入式(Apple Secure Enclave、汽车 ECU 思路接近)
- 现代 unikernel 部署(MirageOS / OSv)
不适用:
- 桌面 / 通用服务器——多种应用并存,大家都希望有一致接口
- 需要 POSIX 兼容生态(最大的工业现实——所有人都用 glibc)
- 团队没能力维护自己的 libOS
30 年后留下了什么
exokernel 没赢架构之争,但它的思想散布到工业界各个角落:
- Unikernel(MirageOS 2013、OSv 2013、IncludeOS)= libOS + 单应用单地址空间
- DPDK(Intel 2010+)= 网络栈搬到用户态,绕过内核 socket
- SPDK(2016+)= 存储栈搬到用户态,绕过内核 block layer
- io_uring(Linux 5.1, 2019)= 系统调用改成共享内存环形队列,内核只做最少协议
- Arrakis(OSDI 2014)= 论文里直接说”这是现代 exokernel”
- gVisor / Drawbridge / Graphene = 在用户态重新实现一套 syscall
一句话:Linux 在用 30 年时间,渐进式地变成 exokernel。
学到什么
- OS 强加的抽象不是上帝设的——可以质疑、可以推翻,关键是想清楚”谁该决定怎么用资源”
- 保护与管理分离 是个比”内核 vs 用户态”更深的二元对立——后来的 capability OS、Arrakis、io_uring 都在这条线上
- 失败的工业落地 ≠ 失败的思想——exokernel 没成主流 OS,但它定义了之后 30 年高性能系统的方向
- 第一性原理拆”必须留在内核里的最小集” 是 OS 设计反复出现的母题——L4 也这么干(l4-1995),思路不同结论也不同
延伸阅读
- 论文 PDF(17 页):Exokernel SOSP 1995
- 后续完整版:Application Performance and Flexibility on Exokernel Systems, SOSP 1997
- 现代继承:Arrakis: The Operating System is the Control Plane, OSDI 2014
- Unikernel 综述:Unikernels: Library Operating Systems for the Cloud, ASPLOS 2013
- l4-1995 —— 同年 SOSP,另一种”把内核做小”的思路(微内核)
- the-os-1968 —— Dijkstra 分层 OS 的鼻祖
- sel4-2009 —— 被数学证明的微内核
关联
- l4-1995 —— 1995 年同期的”做小内核”运动;L4 砍接口数,exokernel 砍抽象
- the-os-1968 —— OS 该不该有抽象层,这场争论从 1968 一直打到现在
- sel4-2009 —— 继承 L4 不是 exokernel,但都受”内核越小越好”思想影响
- hyperkernel-2017 —— 用 SMT 验证内核——exokernel “内核小到能验证”思想的现代延伸
- eros-1999 —— capability-based OS,能力券思想的另一条线
- certikos-2016 —— 被验证的 hypervisor,与 exokernel 同属”把功能下放”思路