原文链接:A Comparison of Software and Hardware Techniques for x86 Virtualization
这篇文章发表于2006年10月,是一个KVM还没有开发出来的时代。
这篇文章主要比较了对x86平台的硬件和软件虚拟化技术。
- x86平台直到最近(指2005年)才允许经典的trap-and-emulate虚拟化方式。要知道这种虚拟化方式是建立于硬件基础上的。所以文章比较软件VMM和新型的需要硬件支持的VMM,发现软件反而更快,于是文章想找出原因。
- 为什么“硬件性能低于软件”很让人惊讶呢?实际上软件是依附于硬件的,而一般来说,硬件的运行速度远高于软件,可是x86的软硬件虚拟化的技术却和常理完全不同。
- 原因是什么?
- 它没有对MMU虚拟化的支持
- 它无法与用于MMU虚拟化的现有软件技术共存
- 传统的软件VMM,用的方法是二进制翻译。就是说VM在有指令发给CPU的时候,直接转换成二进制的代码控制CPU。
- x86架构商提供了硬件扩展,让纯软件虚拟化变成了硬件辅助行虚拟化。
- 文章审视了虚拟指令执行引擎的性能、新兴的硬件支持,确定性能折中点,软件和硬件VMM的定量性能比较。
- Popek and Goldberg’s 1974的论文提供了VMM的三个关键特征:
- 真实性。VMM的软件和原OS软件执行时间相同
- 表现情况。绝大多数的VM由硬件执行,无需VMM干预
- 安全性。VMM可以管理一切。
- VMM的基础功能是提供VM一个运行环境,这个环境可以忽略虚拟系统和下行软件的特权区别。
- VMM从客户机的主结构中继承了映射结构
- 为了保持映射结构的一致性,VMM通常使用硬件页面保护机制来捕获对内存主结构的访问
- 啥是二面保护机制呢,就是加上读写锁。
- 页面保护机制被称为tracing
- 在trace花费,隐藏页面错误花费和上下文切换花费上找到平衡点,这个操作的难度很大,而且对性能的提升也是非常大的。
- x86虚拟化的困难
- 特权状态的可见性。客户机可以观察到,当它读到代码段选择器的时候,他已经被剥夺了特权,因为当前的特权状态被存储到了选择器的低两位中。
- 当特权指令在用户级别空间运行的时候,缺少陷阱捕获机制。
- 上述困难只要在解释器上就可以解决
- 软件VMM使用解释器有如下特点:
- 二进制。输入是二进制代码,不是源代码
- 动态性。翻译过程在运行时解决,与生成代码无关
- 可控性。代码只有在即将被运行的时候才被翻译
- 系统等级。(没太懂)它必须运行缓冲区溢出,该缓冲区溢出恰好会像本机运行一样掩盖返回地址(在产生的错误消息中产生相同的十六进制数字)
- 子集性。解释器会将完整的,包括特权指令的输入形式转换成安全的输出形式。
- 适应性。被翻译的代码会根据客户机的反应做出调整,以做到高性能。
- virtual machine control block, VMCB,是一个内存内的数据结构,将控制状态和客户机虚拟CPU的子集状态结合
- 我们将原始的x86的运行环境叫做主机模式(host mode,后称为hm),一个新的指令vmrun可以将hm转变为guest mode(gm)
- 当硬件执行exit操作的时候,硬件将虚拟机状态存进VMCB中,再重新进入主机模式
- 最终虚拟机的性能主要取决于退出的频率,因此减少退出频率是经典VMM的最重要的优化。
- 所以怎么减少exit是提升性能的方法,比如设计的时候,仅用于计算的虚拟机就不要退出了,其他情况下可以将错误页隐藏起来,这样就不会因为错误而被迫退出。
- 软件虚拟化需要精细的工程考量来确保性能,硬件虚拟化可以避免退出频率高而导致的性能下降,但是对其余退出收取高昂成本(这点没看懂,什么叫remaining exit)。
- 软件VMM具有更丰富的可用选项集,包括自适应功能,而当前的硬件机制更狭窄地针对陷印和仿真风格的虚拟化,而使用其他软件/硬件组合的灵活性较低。
文章剩下的部分就是在介绍实验设计和测量方法了,对于写论文的小伙伴可以看看人家的设计思路,这里只是学习笔记,剩下的内容不赘述。



