跳转到内容

Verisoft — 把整台计算机从门电路到邮件客户端全部用数学证完

待复核

Verisoft 是 2003–2007 年德国国家出钱、Saarland 大学领头的一项工程:把一整台真能用的计算机——从最底层的门电路(逻辑门连成的芯片图纸,不是晶体管物理)、到处理器、到编译器、到操作系统、到上面跑的邮件客户端——每一层都用数学证明它是对的,并把证明拼成端到端定理。

日常类比:盖一栋楼。普通做法是各包工队各自验收,楼塌了互相推。Verisoft 是同一队人从打地基到装窗帘全程证明每一道工序对得上,最后给你一张总图:从泥土到楼顶每一层都有数学保证。

主导者是 Wolfgang Paul(Saarland);合作方包括 DFKI、TU Munich、Infineon、BMW。Alkassar / Hillebrand / Leinenbach / Paul 把方法学总结成这篇 VSTTE 2008 报告。

如果不知道 Verisoft,下面这些事你会觉得很神奇但讲不清原理。

  • 为什么 seL4(被数学证明正确的微内核)能成立——它与 Verisoft 同期并行(L4.verified),同属内核/全栈形式化谱系,方法学互相参照,并非 Verisoft 的直系产品线
  • 为什么 CompCert(被证明正确的 C 编译器)能成立——和 Verisoft 同期同领域
  • 为什么 Microsoft Hyper-V 在 2010 年前后做了大规模形式化验证——由后续项目 Verisoft XT 团队执行
  • 为什么”软件全证明”在工业界仍罕见——主项四年(2003–2007)+ XT 延续、几十人、几十万行 Isabelle,成本极高

它标出了天花板:理论上能不能证明一整台机器?能。代价是什么?这么多。

方法叫 pervasive verification(穿透式验证)。三句话:

  1. 每一层都有数学规约(像盖楼先画图纸):CPU 有 ISA 规约(指令集说明书:每条指令该做什么)、编译器有 C0→机器码对应、内核有系统调用规约、应用有行为规约。
  2. 每一层都证明实现 = 规约(像对照图纸验收施工):门电路 = ISA、编译器 = 语义保持、内核 = 系统调用规约;主要在 Isabelle/HOL 里用 Isar(可读证明语言,像写带步骤的数学作业)完成,少量早期硬件工作用过 PVS。
  3. 接合定理把层连起来(像把各层验收单订成一本总册):编译器证明告诉你「C0 在抽象语义里做的事 = 机器码在 VAMP 上做的事」;CPU 证明告诉你「VAMP 真在做 ISA 说的事」。两个一拼,得到「C0 程序 → 真硬件」端到端定理。这个「拼」才是 Verisoft 的核心贡献。

传统软件验证常在编译器或 OS 停住、假设硬件正确;Verisoft 不假设,一直证到门电路。

案例 1:VAMP 处理器——从门电路证起

Section titled “案例 1:VAMP 处理器——从门电路证起”

VAMP 是一颗 DLX 风格的教学型 RISC(教科书里简化版 MIPS)。两层:

  • 门电路层:寄存器、ALU、流水线用布尔逻辑写出
  • ISA 层:抽象指令集,如「执行 ADD 做加法」

示意定理(教学伪代码,非可检 Isabelle):

∀ n. gate_run(n_cycles) ≈ isa_run(k_instructions) -- k ≤ n(有 stall)

逐部分解释

  • gate_run:门电路按时钟一步步跑
  • isa_run:按指令集说明书执行
  • k ≤ n:流水线空转(stall)时,时钟比指令多

证完后可把硬件当 ISA 用。另有 Tomasulo 乱序版(指令可「插队」执行,像多窗口厨房同时炒多道菜)——并发证明更难。

案例 2:C0 编译器——为什么不是完整 C

Section titled “案例 2:C0 编译器——为什么不是完整 C”

C0 是裁剪后的 C:无指针算术 / union / longjmp;整数溢出语义严格定义。完整 C 的未定义行为太多,证明完不成;C0 已够写邮件客户端与内核调度器。

∀ P. trace(compile(P) on VAMP) = trace(P in C0-semantics)

逐部分解释

  1. 任意合法 C0 程序 P
  2. compile(P) 得到机器码 P’
  3. P’ 在 VAMP 上的执行轨迹,与 P 在 C0 抽象语义里的轨迹,在「内存映射」下一一对应

证完后不必再担心「编译器搞错」。

CVM(Communicating Virtual Machines)是微内核抽象层——像「虚拟机之间怎么打电话」的说明书;VAMOS 建在其上(任务、IPC、驱动)。证明:内核代码 = 系统调用规约。

再叠应用层(C0 邮件客户端)+ 接合定理,总效果是:

合法 C0 程序 P 编成机器码放进 VAMP,跑 N 个时钟后,硬件状态对应 C0 语义里某一步——对应关系由编译器证明的内存映射给出。

中间任一层有 bug(流水线、寄存器分配、中断处理),总定理立刻破。能写出这句话还能机检通过,就是 Verisoft 的成绩。

  1. 接口规约比证明本身更难:层间约定(CPU 给编译器看什么状态?编译器给内核什么内存模型?)写错,下面证再多都白搭。
  2. C0 ≠ C:不能拿真 Linux 去证,必须用 C0 重写——证完的内核不是工业内核。
  3. 证明 ≠ 安全:只证「实现满足规约」;规约本身允许泄密,证完照样不安全。
  4. 代价与变更:几十万行证明;改一行实现可能重写几千行证明;完工后多数工件停止维护。
  5. 跟现实硬件有距离:VAMP 是教学 RISC,与 x86/ARM 无直接关系;XT 证 Hyper-V 时改以 x86 ISA 模型为底,不再下到门电路。

适用

  • 高保证系统研究(航天、核控、密码硬件)——可接受「人年级」证明成本
  • 教学:给学生看一遍「计算机栈全证明」长什么样
  • 启发后续:seL4、CompCert、CakeML 的方法学参照

不适用

  • 普通工业软件——成本/收益不划算(数十人年量级)
  • 快速演化系统——证明跟不上变更;且仅限 C0 + 教学 RISC,不覆盖完整 C / x86
  • 「证完就安全」——证明只解决规约符合性的一半问题
  • 2003:BMBF 批准 Verisoft 主项,Wolfgang Paul 主持
  • 2003–2007:四年主项,VAMP / C0 / CVM / VAMOS / 邮件客户端逐层推进
  • 2007:Verisoft XT 启动,转向 Hyper-V、PikeOS 等工业系统
  • 2008:本文在 VSTTE 发表,总结方法学与工件
  • 2010 年后:项目收束;方法学被 NICTA seL4、MSR、INRIA CompCert 等继承;2014 年 CakeML 把自举式全栈证明推到 ML 编译器
  1. 2008 年前已证明「整机全栈证明」工程上可行——不是科幻
  2. 方法学比成品重要——穿透式验证、接合定理、Isar / locale 是留下的工具
  3. 真正瓶颈是规约——人想清楚「该保证什么」比工具查证明更难
  4. 工业界不照搬全栈,而做局部全证明——seL4 / CompCert / CakeML;接口契约写清,层与层才粘得住
  5. 证明工程需要工具链与回归——否则项目结束就归档,工件无法维护
  • isabelle-hol-2002 —— 主要证明工具,本项目推到规模极限
  • hoare-logic —— 编译器与内核证明的基础逻辑
  • sel4 —— 同期参照,专注高性能微内核
  • compcert —— 同期 C 编译器证明
  • cakeml —— 思路承接者,做到自举
  • fstar —— 后代设计,规约+证明+实现合一
  • vamp-verisoft-2006 —— Verisoft 栈底的处理器证明
  • ironfleet-2015 —— IronFleet — 把分布式协议证到一行 bug 都没有
  • vamp-verisoft-2006 —— VAMP — 把一颗有流水线、乱序、浮点和 cache 的处理器从门电路证到指令集