EROS — 让 capability 内核跑得跟 Linux 一样快
是什么
EROS(Extremely Reliable Operating System)是一个 1999 年的微内核,做了两件别人做不到的事:
- 每一次访问都靠”票据”(capability)——程序想读文件、发消息、用页面,必须出示一张内核签发的不可伪造的小票。
- 整个系统是持久化的——内存里跑的对象会自动存盘;机器断电再开,所有进程从断电那一刻接着跑。
日常类比:演唱会进场。普通系统像 Linux 用 ACL(访问控制列表),保安站门口拿名单一个个查”你叫什么、你能不能进”。EROS 给你一张早就盖好章的票,保安只看票真假——不查身份,不查名单,看到票就放行。
而且 EROS 这场演唱会”永不散场”:你坐到一半,全场停电,电来了灯一亮——你还坐在原来的座位上,演员从被掐掉的那个音节继续唱。
之前的 capability 系统都很慢(Mach、Hydra),EROS 的卖点是:这两个特性同时做,性能跟 Linux 这种单体内核相当。
为什么重要
不理解 EROS 你看不懂下面这些事:
- 为什么 macOS / iOS 现在到处是 entitlement、token、handle——这些都是 capability 的工业版稀释
- 为什么 seL4(被数学证明过的微内核)跑得比当年的 Linux 还快——seL4 直接继承了 EROS 的 IPC 路径设计
- 为什么”持久化对象 + 一层存储”听着像数据库不像 OS——因为 EROS 真的把”内存 vs 磁盘”这条 1965 年画的线擦掉了
- 为什么微内核 30 年没死——Mach 慢,L4 偏激,EROS 证明了第三条路:capability + 工程优化能赢
核心要点
EROS 的设计可以拆成 三块:
-
Capability(能力)= 不可伪造的访问票据:每张票里写明”这是哪个对象 + 你能对它做什么”。程序只能拿别人主动给的票——没人给你票,你连那个对象的名字都不知道。这叫不可知不可访问(no ambient authority)。
-
单层存储(Single-Level Store):进程不用调
read()write()mmap()。所有对象(页、节点、域)一视同仁,由内核透明地在 RAM 和磁盘之间搬。每隔几分钟自动做一次全系统快照——所有进程状态、堆栈、寄存器都被冻进磁盘。 -
快路径 IPC:进程间通信是微内核的命门。EROS 把”调用另一个进程”的关键路径写成几百条汇编,用寄存器传参数,避开队列、调度、上下文复制——实测进程间消息往返 几微秒,跟 Linux 系统调用一个量级。
三块绑在一起:capability 是命名机制,单层存储是持久化机制,快 IPC 是性能保障。
实践案例
案例 1:capability 是怎么”无法伪造”的
伪 C 风格:
cap_t f = open_file("config.txt"); // 内核给你一张票read(f, buf, 1024); // 拿票去读send(other_proc, f); // 把票转给另一个进程// 此后那个进程也能读 config.txt// 但你不能凭空 cap_t f = 0x12345; 自己造一张票存在内核里,用户态拿到的只是一个索引。你伪造索引,内核查表发现你这个进程根本没那张票——直接拒绝。
案例 2:单层存储的”全系统快照”
EROS 大约每 5 分钟做一次 checkpoint:
- 标记所有页”只读”
- 后台线程把脏页写盘
- 程序继续跑,碰到要写的页时触发 copy-on-write
- 全部写完,更新磁盘上的”当前一致点”指针
崩溃恢复 = 把上一个一致点读回来。你昨天没保存的代码不会丢——因为 EROS 根本没有”保存”这个动作,所有修改都自动在下一次 checkpoint 落盘。
案例 3:为什么 IPC 能跟单体内核拼速度
Mach 1990 IPC 一次往返约 100 微秒(慢得不能用)。Linux 系统调用约 1 微秒。EROS 在同等硬件做到 5 微秒级。
招数有三个:
- 票(capability)查表用硬件 TLB 风格的小缓存,不走通用哈希
- 关键路径不进调度器,调用方让出 CPU 时间片直接给被调方(directed yield)
- 寄存器传短消息,长消息共享映射页,不复制
案例 4:EROS 是怎么”启动”的
普通 Linux 启动 = 加载内核 → 跑 init → 启动一堆 daemon → 用户登录。
EROS 启动 = 把上次 checkpoint 整体读回内存。没有 init,没有 systemd,没有”冷启动”概念。第一次开机才执行一段引导脚本生成初始世界,之后每一次开机都是从持久化镜像里”接着跑”。
这有点像虚拟机的 suspend / resume——但 EROS 把它做成了系统的默认形态。
踩过的坑
-
capability 撤销很难:你给别人一张票,回头想收回——别人可能已经把票转给第三个人。解决方案叫 revocation,要么加一层间接、要么所有票挂链表,性能要付代价。论文专门讨论了”撤销门”(revocation forwarder)这种小对象。
-
持久化 + 安全的紧张关系:checkpoint 把进程”凝住”再写盘。如果一个进程刚拿到 capability 还没用,checkpoint 落盘——崩溃恢复后那张票在磁盘上”明文”存着。EROS 用专门的存储加密 + 不可伪造索引应对。
-
写程序的人要换脑子:没有
open()read(),没有路径名,没有”全局 root”——一切靠”妈妈进程”递给你 capability。移植 Unix 程序极痛苦,这是 capability 系统始终没大规模流行的根因。 -
快照间隔的取舍:5 分钟一次 checkpoint,崩溃最多丢 5 分钟。缩短到 30 秒——磁盘 IO 压力暴涨,吞吐塌方。EROS 给出经验值,但工业上想用必须自己重新调。
-
测量基准不对等:EROS 跟 Linux 比的是”系统调用 vs IPC”,但 Linux 系统调用是同进程跨态切换,EROS IPC 是跨进程。论文承认这点不完全公平,所以同时给了”同等抽象层”的对比。读论文要看清楚每张表标的是什么。
适用 vs 不适用场景
适用:
- 高安全性场景(军用、智能卡、车载控制器)——seL4 即沿用 EROS 思想,已商用
- 需要”启动即恢复”的嵌入式系统——单层存储让 BIOS 都不需要
- 隔离要求极强的 hypervisor / TEE(可信执行环境)
- 长跑科学计算 / 控制回路——崩溃后从断点继续,不用自己写 checkpoint 代码
不适用:
- 想直接跑 Unix / Linux 软件栈的通用桌面/服务器
- 团队没人懂 capability 思维——硬上等于自废武功
- 资源极受限的设备——快照成本(IO + 内存翻倍)很难承担
- 需要外部强一致状态(DB、网络协议握手)的系统:恢复后磁盘”以为”还在那一秒,但远端早就 timeout 了
历史小故事(可跳过)
- 1966 年:Dennis 和 Van Horn 提出 capability 概念,作为多道程序系统的访问控制基础。
- 1980 年代:KeyKOS(IBM System/370 上的 capability 系统)证明持久化 + 票据可行,但太慢,被业界遗忘。
- 1991 年:Jonathan Shapiro 在 Penn 读博,决定把 KeyKOS 重写到 80486,就是 EROS。
- 1999 年:SOSP 论文——capability 内核首次在 IPC 上摸到 Linux 量级。被微内核圈视为”翻身仗”。
- 2006 年:Shapiro 把 EROS 思想搬到形式化验证项目 Coyotos,未完成。
- 2009 年:澳大利亚 NICTA 团队发布 seL4——继承 EROS 的快 IPC + 加上完整数学证明,彻底洗刷”capability 内核必慢”的印象。
- 2020 年代:Apple 的 entitlement 系统、WebAssembly 的 capability-based 模块、CHERI 硬件 capability 处理器——你能看到 EROS 的孙子们在每个角落。
学到什么
- 架构选择不等于性能宿命:capability 内核此前都慢,是工程做得不够,不是模型本身慢。EROS 证明了同样模型能做到一流性能。
- 统一抽象比叠层抽象更便宜:单层存储拆掉了”内存 vs 磁盘”这堵墙,反而让代码更简单、性能更好。
- 安全模型是命名模型:capability 的本质是”不能命名就不能访问”,比”先访问再检查”省一半工作量。这跟现代 zero-trust / API token 思想完全同源。
- 关键路径要手写汇编:通用框架适合 80% 的代码,5% 的命门必须特殊对待。
- 持久化 = 把”保存”从程序员的 todo 上拿掉:单层存储是面向程序员的”地心引力”——你不写也得发生。这是 EROS 至今最激进、也最不被工业采纳的设计。
延伸阅读
- 论文 PDF:EROS: A Fast Capability System (SOSP 1999)
- 后继:seL4 — 形式化验证的 capability 微内核
- 综述:What is a Capability, Anyway? — Jonathan Shapiro(背景文,零基础友好)
- 硬件版:CHERI capability 架构 ——把 capability 直接做进 CPU 的指针
- lampson-1971 —— Lampson 早年提出 capability 概念
- mach-microkernel —— Mach 是 EROS 的前辈,也是它要打败的对手
- multics —— 操作系统访问控制思想的远祖
关联
- lampson-1971 —— capability 抽象的源头
- mach-microkernel —— EROS 之前主流的微内核,IPC 太慢
- multics —— 最早试图把”环 + 段”做成访问控制的系统
- sel4 —— EROS 思想的现代继承者,加了形式化证明
- aries-1992 —— ARIES 是数据库恢复算法,与 EROS checkpoint 思路同源但范围不同
- lampson-hints —— Lampson 系统设计经验谈,EROS 的工程取舍呼应其中”快路径单独优化”准则