跳转到内容

EROS — 让 capability 内核跑得跟 Linux 一样快

是什么

EROS(Extremely Reliable Operating System)是一个 1999 年的微内核,做了两件别人做不到的事:

  1. 每一次访问都靠”票据”(capability)——程序想读文件、发消息、用页面,必须出示一张内核签发的不可伪造的小票。
  2. 整个系统是持久化的——内存里跑的对象会自动存盘;机器断电再开,所有进程从断电那一刻接着跑。

日常类比:演唱会进场。普通系统像 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 的设计可以拆成 三块

  1. Capability(能力)= 不可伪造的访问票据:每张票里写明”这是哪个对象 + 你能对它做什么”。程序只能拿别人主动给的票——没人给你票,你连那个对象的名字都不知道。这叫不可知不可访问(no ambient authority)。

  2. 单层存储(Single-Level Store):进程不用调 read() write() mmap()。所有对象(页、节点、域)一视同仁,由内核透明地在 RAM 和磁盘之间搬。每隔几分钟自动做一次全系统快照——所有进程状态、堆栈、寄存器都被冻进磁盘。

  3. 快路径 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:

  1. 标记所有页”只读”
  2. 后台线程把脏页写盘
  3. 程序继续跑,碰到要写的页时触发 copy-on-write
  4. 全部写完,更新磁盘上的”当前一致点”指针

崩溃恢复 = 把上一个一致点读回来。你昨天没保存的代码不会丢——因为 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 把它做成了系统的默认形态。

踩过的坑

  1. capability 撤销很难:你给别人一张票,回头想收回——别人可能已经把票转给第三个人。解决方案叫 revocation,要么加一层间接、要么所有票挂链表,性能要付代价。论文专门讨论了”撤销门”(revocation forwarder)这种小对象。

  2. 持久化 + 安全的紧张关系:checkpoint 把进程”凝住”再写盘。如果一个进程刚拿到 capability 还没用,checkpoint 落盘——崩溃恢复后那张票在磁盘上”明文”存着。EROS 用专门的存储加密 + 不可伪造索引应对。

  3. 写程序的人要换脑子:没有 open() read(),没有路径名,没有”全局 root”——一切靠”妈妈进程”递给你 capability。移植 Unix 程序极痛苦,这是 capability 系统始终没大规模流行的根因。

  4. 快照间隔的取舍:5 分钟一次 checkpoint,崩溃最多丢 5 分钟。缩短到 30 秒——磁盘 IO 压力暴涨,吞吐塌方。EROS 给出经验值,但工业上想用必须自己重新调。

  5. 测量基准不对等: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 的孙子们在每个角落。

学到什么

  1. 架构选择不等于性能宿命:capability 内核此前都慢,是工程做得不够,不是模型本身慢。EROS 证明了同样模型能做到一流性能。
  2. 统一抽象比叠层抽象更便宜:单层存储拆掉了”内存 vs 磁盘”这堵墙,反而让代码更简单、性能更好。
  3. 安全模型是命名模型:capability 的本质是”不能命名就不能访问”,比”先访问再检查”省一半工作量。这跟现代 zero-trust / API token 思想完全同源。
  4. 关键路径要手写汇编:通用框架适合 80% 的代码,5% 的命门必须特殊对待。
  5. 持久化 = 把”保存”从程序员的 todo 上拿掉:单层存储是面向程序员的”地心引力”——你不写也得发生。这是 EROS 至今最激进、也最不被工业采纳的设计。

延伸阅读

关联

  • lampson-1971 —— capability 抽象的源头
  • mach-microkernel —— EROS 之前主流的微内核,IPC 太慢
  • multics —— 最早试图把”环 + 段”做成访问控制的系统
  • sel4 —— EROS 思想的现代继承者,加了形式化证明
  • aries-1992 —— ARIES 是数据库恢复算法,与 EROS checkpoint 思路同源但范围不同
  • lampson-hints —— Lampson 系统设计经验谈,EROS 的工程取舍呼应其中”快路径单独优化”准则