Source: https://www.usenix.org/conference/osdi22/presentation/sartakov

Authors: Vasily A. Sartakov; Lluís Vilanova; David Eyers; Takahiro Shinagawa; Peter Pietzuch
Affilication: Imperial College London; University of Otago; The University of Tokyo
Download Note: https://jbox.sjtu.edu.cn/l/x1thXO
Contributor: pdh

Overview
本文主要解决现有云计算栈的TCB大,同时只能按照页力度进行数据的共享和传递,跨VM之间的通信低效的问题。传统方法会使用MMU来对组件之间进行强制隔离,TCB过大等问题也是由这一方法带来的。本文利用即将推出的具有硬件支持内存功能的CPU提出了解决方案,通过对硬件的修改,提供一个动态的细粒度内存划分机制,来支持机密计算。这里作者复用了CHERI的解决方案,利用CHERI构造了cVM,这是一种新的类似VM的抽象。cVM可以安全的共享一个虚拟地址空间,每个VM只能访问自己的内存。同时cVM能够(1)在不同cVM之间共享缓冲区的异步读写接口;以及(2)在cVM之间转移控制的调用接口。基于这两个功能原语来构建更有效的跨cVM通信表达机制。实现使用的是CHERI RISC-V功能。

总结一下,本文主要有三个贡献:

  1. 通过CHERI的Capabilities机制实现强隔离。多个cVM通过capability共享单个虚拟地址空间,每个cVM都被一对默认的capability沙盒化,它们将cVM中所有指令的访问限制在自己的内存边界中;
  2. 利用LibOS来定制虚拟机内部的操作系统。cVM自己包含一块小的TCB,来减少对外部云堆栈的依赖,同时提供POSIX标准的兼容。在LibOS中,每个cVM实现了自己命名空间中的文件系统、虚拟设备、密码学IO密钥等,只有底层资源如线程和IO设备操作才会通过外部OS kernel实现共享;
  3. 高效的数据共享原语。cVM提供了底层原语,用来在不用泄露应用层代码给capability的前提下实现cVM之间的数据共享:(1)CP_File API允许应用程序组件通过异步读/写接口共享任意缓冲区;(2)CP_Call API在cVM之间传递控制,例如可以实现cVM之间的同步机制;(3)CP_Stream API提供了cVM之间使用一个内存副本来进行面向数据流的数据交换。

本文在CHERI RISC-V64架构上实现cvm,可在支持CHERI的FPGA硬件和多核RISC-V硬件上执行。评估表明,cVM提供了一个实用的隔离抽象和高效的数据共享: 使用CP_Stream API进行cVM间通信,与传统的Socket接口相比,Redis的延迟减少了54%,标准偏差减少了2.1×。当隔离基于python的服务的加密组件时,与单片的baseline相比,cVM引入了最多12%的开销。