SOSP'17 (1) Hyperkernel: Push-Button Verification of an OS Kernel

论文的地址:locore.cs.washington.edu


背景

这篇论文属于CSAIL(MIT)一系列的关于系统正确性证明的工作。

相关的工作一直由MIT的M. Frans Kaashoek教授和Nickolai Zeldovich教授进行。

大概的方向是给出一些函数或者调用的specification,即函数具体完成哪些工作,有什么功能,对于系统状态做了什么修改等等。进而通过形式化证明,得到一个“正确的”实现。此前的工作主要在文件系统方面:因为文件系统需要保证实现的正确性来保证在crash之后,数据能够恢复到一个预期的状态[1],或者借此来提高函数调用的可扩展性[2]。近几年,Frans组更加集中在如何给出一个完备的specification和实现一个正确且并发度高的文件系统上。

论文的指导教授是华盛顿大学的Xi Wang教授,同样此前在CSAIL这个组里做博士,他在SOSP和OSDI上发表的工作就集中在形式化证明在文件系统和操作系统调用正确性方面的应用,延续了他在MIT的工作。

这一系列的工作的核心就是给出一个specification并且借助这个specification给出正确性证明和实现,这篇论文便是这个思路在OS kernel的实现。

解决的问题

设计证明一个系统的正确性一直是一个很重要的问题,此前的工作的工作通过正确性证明来消除一类的系统bug,但是,有很大的实现上开销,对于写出证明的人也有很高的要求。

论文希望提供一个方法,借助Z3(一种由微软开发的SMT求解器),来构造一个系统同时通过很低的成本完成正确性证明。

与之前工作的比较

同文件系统和一般的UNIX-like系统调用不同,操作系统有着更多更加复杂的函数和数据结构,以及更加复杂的层次关系。同时,路径数目更大,不便于Z3求解。论文中提出的方法,实际上是针对系统这个目标进行简化和修改。

一方面,把证明的内容从C代码变为llvm中间代码,使得证明的语义更加规范。另一方面,限制了系统的特性,进行证明的是一个单处理器关中断且简化虚拟内存实现的操作系统。最后,还修改了一般接口实现,要求接口实现添加约束,事实上使得证明的代码实现变得简单了。

结果

实现了一个基于xv6的单CPU系统内核Hyperkernel,通过Z3求解器检查了45个系统调用和中断处理程序。实验证明Hyperkernel可以避免xv6中发现的相似的bug,同时可以以较小的代价得到内核正确性的证明,也就是所谓的push-button。

证明部分由python实现,兼顾了实现的简易性和可以简便地调用Z3接口。

论文提供了:

  1. 一个低开销的方法来构造一个验证过的操作系统内核
  2. 一种便于SMT求解的接口设计方法
  3. 一个有合适的性能的操作系统(Hyperkernel)的实现

简单的描述

首先,系统证明同样需要一个specification,同时具有完备的数据结构来描述系统本身,可以依靠它来实现一个实际的系统,又不能太过复杂使得证明路径爆炸。限制(finitize)内核接口,避免无限的循环和递归。

其次,系统是通过c语言实现的。然而c语言由于语义问题和底层操作(指针运算和访存),以及c标准的不清晰,不便于形式化表述。论文证明使用llvm中间表示(IR)来进行证明。IR具有更加简单而且清晰的语义的同时,保留了高级的信息。

最后,内核和用户空间在同一个虚拟地址空间(?)而且内核虚拟内存和物理地址不是单射的关系,使得隔离不好表述?Hyperkernel将内核与用户地址空间分开,简化了虚拟内存的实现。

论文通过两种specification来描述“正确的”内核接口:

  1. State-machine Style Specification:提出了一个内核调用和中断处理函数的状态机,以及这个specification的“正确的”C实现。
  2. Declarative Style Specification: 用具体的语言描述specification,提炼这两种specification。

第一种包含更多的细节,而第二种在更高的层面上描述大概的作用,便于人类理解。


实现细节

(待精读后补充)


一点自己的理解

论文试图把Z3证明的方法扩展到比文件系统更大的操作系统中来,但是肯定的,遇到了语义不明确,specification太复杂以及证明目标太大等等问题。论文的主要工作主要集中在如何缩小系统并修改系统的接口上,可能有很多的时候都是在证明llvm中间代码和接口给出的specification时,遇到了求解器不可解或者实现困难的问题,退回来修改系统本身,使得工作的目标从证明系统的正确性,并借此实现一个系统,变成简化,修改一个本身就已经很小的教学操作系统。在我看来实际上是有所偏离本意,丧失了一部分该工作本身的意义的。具体的一些问题还应该去上海的时候问清楚,因为这里作者给出的解决方案我并不满意,并不是从根本上解决问题,而是一直在向“push-button”这个附加的功能做让步,而忽略了实际的应用和问题本身。


Reference

[1] OSDI'16, Push-Button Verification of File Systems via Crash Refinement.

[2] SOSP'13, The Scalable Commutativity Rule: Designing Scalable Software for Multicore Processors.

(待补充)

编辑于 2017-10-14

文章被以下专栏收录