技术深度解析
ctsrd-cheri/sail-cheri-riscv 项目是用 Sail 语言编写的 CHERI-RISC-V 指令集的形式化、可执行规范。Sail 是剑桥大学专门为描述指令集架构(ISA)而开发的领域特定语言。与 Verilog 或 VHDL 等传统硬件描述语言不同,Sail 被设计为既易于人类阅读,又可由机器检查,从而能够自动生成模拟器、形式化证明,甚至测试套件。
架构与能力
CHERI 的核心思想是用“能力”取代传统的扁平内存指针。能力是一个 128 位或 256 位的值(取决于具体实现),它不仅包含地址,还包含边界、权限和有效性元数据。Sail 模型通过扩展 RISC-V 寄存器文件,增加能力寄存器(例如 c0-c31),并修改加载/存储流水线以在每次内存访问时检查能力边界和权限,来实现这一机制。
Sail 模型中建模的关键架构特性:
- 能力寄存器:32 个额外的寄存器,用于保存能力元数据。
- 带标签的内存:每个内存颗粒(通常为 16 字节)对应一个比特位,用于指示该位置的数据是否为有效的能力。
- 单调性:能力只能被限制(缩小边界、降低权限),绝不能扩展——这一点由 Sail 模型的类型系统强制执行。
- 密封与解封:加密操作,用于保护能力免受任意修改。
Sail 模型由一系列相互依赖的模块构成:
- `cheri_types.sail`:定义能力数据结构,包括地址、基址、长度、权限和标签等字段。
- `cheri_instructions.sail`:实现 CHERI 特有的指令(例如 CGetAddr、CSetBounds、CSeal)。
- `cheri_memory.sail`:对带标签的内存系统以及能力感知的加载/存储操作进行建模。
- `cheri_exceptions.sail`:处理与能力相关的异常(例如标签违规、边界违规)。
工程方法
该项目利用了 Sail 内置的对生成 C 和 OCaml 模拟器的支持。这意味着同一份 Sail 源代码既可以生成一个快速的基于 C 的模拟器来运行真实工作负载,也可以生成一个基于 OCaml 的模拟器用于形式化验证。该模型已通过 CHERI-RISC-V 测试套件的验证,该套件包含超过 10,000 个测试用例,涵盖了从基本能力操作到涉及密封和隔离的复杂场景。
基准性能
虽然该项目主要是一个验证工具,但性能指标对于运行模拟的研究人员来说仍然具有参考价值。以下是不同配置下模拟速度的对比:
| 模拟器类型 | 语言 | 平均指令数/秒 | 内存开销 | 用例 |
|---|---|---|---|---|
| Sail C(快速) | C | ~500,000 | ~2x 原生 | 运行小型基准测试 |
| Sail OCaml(证明) | OCaml | ~50,000 | ~5x 原生 | 形式化验证 |
| QEMU(全系统) | C | ~10,000,000 | ~1.5x 原生 | 运行 Linux |
| Spike(裸机) | C++ | ~1,000,000 | ~1x 原生 | 快速功能测试 |
数据要点: 基于 Sail 的模拟器明显慢于 QEMU 等全系统模拟器,但这正是设计使然——它们优先考虑正确性和可验证性,而非速度。对于安全验证而言,这种权衡是可以接受的。
相关开源仓库
- cheri-cpu:一个用 Chisel 实现的完整 CHERI-RISC-V 处理器。开发者可以将 Sail 模型与此硬件实现进行交叉验证。
- cheri-lib:一个用于内存分配和能力操作的 CHERI 感知型 C 函数库。Sail 模型可用于验证这些库函数的正确性。
- sail-riscv:基础 RISC-V ISA 的上游 Sail 模型,本项目正是对其的扩展。
关键参与者与案例研究
该项目主要由两个机构推动:剑桥大学计算机实验室和 SRI International。关键人物包括:
- Robert Watson 教授:剑桥大学 CHERI 项目负责人。他在基于能力的安全领域的研究可追溯到 21 世纪初,并在将 CHERI 从研究概念转变为实用架构的过程中发挥了关键作用。
- Peter Neumann 博士:SRI International 的首席科学家,计算机安全领域的先驱,也是 20 世纪 70 年代原始基于能力系统的共同创建者。
- David Chisnall 博士:Sail 语言及 sail-cheri-riscv 模型的首席开发者。他在形式化方法和 ISA 规范方面的专业知识对该项目的成功至关重要。
案例研究:ARM Morello 对比 CHERI-RISC-V
ARM 的 Morello 项目是 CHERI 最著名的商业实现,基于 ARMv8-A 架构。两者的对比具有启发性:
| 特性 | ARM Morello | CHERI-RISC-V (sail-cheri-riscv) |
|---|---|---|
| ISA | ARMv8-A | RISC-V |
| 开源状态 | 部分开源(规范与 FPGA 实现) | 完全开源 |
| 形式化模型 | 存在,但非 Sail 语言 | 基于 Sail 的形式化、可执行规范 |
| 生态系统成熟度 | 更成熟,有商业硬件支持 | 较新,但增长迅速 |
| 主要目标 | 商业部署与安全评估 | 研究与验证,推动标准化 |