虚拟化x86的三种途径
虚拟化x86的三种途径
链接:https://www.zhihu.com/question/20145026/answer/34527331
- 二进制翻译binary translation(BT),把降权执行会silently fail的指令替换掉,如纯Qemu、Bochs、早期的VMware
- 半虚拟化para virtualization(PV),修改guest操作系统把敏感操作换成hypercall,如早期的Xen
- 硬件虚拟化(HVM),处理器VMX扩展原生支持guest在非根模式运行,如KVM
如果纯粹采用BT方案,理论上可虚拟化的层数是无限的。直白地说,虚拟化可以理解为精确模拟执行guest中的每一条指令,而VMM总可以用若干条指令来模拟guest中的一条指令(大不了就像解释型jvm一样一条一条模拟执行bytecode)。只是guest性能会呈指数级下降。
如果纯粹采用PV,最多只能跑一层。其实PV现在在HVM出来以后就很少使用了,不过PV的思想在SOSP03那时是一大创举,微软为此都向剑桥贡献了XP的代码。
如果纯粹采用HVM,现在KVM已经能做到两层,OSDI10年的Turtles做的就是这个事情,这个也已经被merge到了KVM的mainsteam中。不过Intel和AMD在设计虚拟化扩展的时候并没有将nested virtualization考虑进去,再加上每次VMExit的开销其实非常大,我估计嵌套之后的性能说不定还比不上纯粹的BT方案。但从理论上说,通过复杂的实现,也是可以做到多层嵌套的。(有多复杂?我用L0、L1、L2 、L3来表示各层,L3要做的工作是1,L2要做的就是2^2,L1要做的就是3^2,L0要做的是4^2。。。因为,越是下面的那层要处理所有上层之间的交互,事实上KVM现在两层的实现已经非常复杂了)。
============= End
虚拟化x86的三种途径的更多相关文章
- iOS用三种途径实现一方法有多个返回值
以前觉得这种标题有点偏向于理论,实际开发中怎么会有这种诡异的需求,但是真正遇到了这种硬需求时觉得还是有那么点价值的,理论付诸了实践在此也就做了个整理. 以我私下开发中的一处代码为例,本意是希望有这么一 ...
- C#生成XML的三种途径
C#生成XML的三种途径 为了全面,这里都将XML保存到文件中,有三种生成XML的方式: 1.我认为是最原始,最基本的一种:利用XmlDocument向一个XML文件里写节点,然后再利用XmlDocu ...
- ENVI/IDL与ArcGIS集成开发的三种途径
转载:本文来自ENVI5.0-IDL8.2系列产品白皮书_201303.PDF(Esri中国官网可下载)中P7-P10 ENVI 是一个非常开放的平台,提供一个健全的函数库,几乎涵盖ENVI 平台大部 ...
- Java swing: 实现ActionListener监听器的三种途径
Swing是目前Java中不可缺少的窗口工具组,是用户建立图形化用户界面(GUI)程序的 强大工具.Java Swing组件自动产生各种事件来响应用户行为.如当用户点击按钮或选择菜单项目时,Swing ...
- 获取Filter的三种途径
一.通过CLSID [cpp] view plaincopyprint? IBaseFilter *pF = 0; HRESULT hr = CoCreateInstance(clsid, 0, CL ...
- GPS轨迹数据可视化的三种途径
有一阵子没写过博客了,最近因为自己小队申请了项目有并且要帮研究生做一些数据处理的小任务,接触到可视化.这里介绍最近学到的了三种方法. 第一种是用python. 这里原理是用matplotlib里面的s ...
- [转载]WebService服务的三种途径Endpoint Disco WSDL 有什么不同
Endpoint: http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx web服务的URI地址,你访问之后,就会出现web服务的相 ...
- Linux就这个范儿 第15章 七种武器 linux 同步IO: sync、fsync与fdatasync Linux中的内存大页面huge page/large page David Cutler Linux读写内存数据的三种方式
Linux就这个范儿 第15章 七种武器 linux 同步IO: sync.fsync与fdatasync Linux中的内存大页面huge page/large page David Cut ...
- 云计算的三种服务模式:SaaS/PaaS/IaaS
转载http://blog.chinaunix.net/uid-22414998-id-3141499.html 定义 云计算主要分为三种服务模式,而且这个三层的分法重要是从用户体验的角度出发的: S ...
随机推荐
- 随笔记录--RegExp类型
阅读Javascript高级程序设计第五章 -- RegExp类型总结 对于基础教程部分, 有小伙伴不熟悉的,可以参考 正则表达式 - 教程 1. 基础部分回顾: ECMASript通过RegExp类 ...
- frame标签和frameset
框架: 属性 值 描述 frameborder 0 1 规定是否显示框架周围的边框. longdesc URL 规定一个包含有关框架内容的长描述的页面. marginheight pixels 定义框 ...
- 使用cookiecutter创建django项目
使用cookiecutter创建django项目 下载安装: pip install cookiecutter cookiecutter https://github.com/pydanny/cook ...
- Mybatis JdbcType与Oracle、MySql数据类型对
Mybatis JdbcType Oracle MySql JdbcType ARRAY JdbcType BIGINT BIGINT JdbcType BINARY JdbcTy ...
- 数据结构 - 二叉搜索树封装 C++
二叉搜索树封装代码 #pragma once #include <iostream> using namespace std; template<class T>class T ...
- 在windows下安装Superset
前言 最近想用一下Superset,这个是一个开源项目,可以直接通过写sql来生成图表,有时候对一些图表需求比较多的时候,可以用的上. Superset是由Airbnb(知名在线房屋短租公司)开源BI ...
- django 修改 request 对象中的请求参数, 并重新赋值给 request 对象
直接上代码, 实现流程看代码及注释 def your_view(self, request): method = request.method if method == "GET" ...
- PHP随机获取预设的值
前面我们讲了php怎么获取随机数,<?php echo rand(1000,2000); ?> 一行代码就能搞定,如果要获取ASP,PHP,JAVASCRIPT,AJAX,CSS,JQUE ...
- 10-C#笔记-封装
基本的封装同C++类似 using System; namespace RectangleApplication { class Rectangle { //成员变量 internal double ...
- 07-cmake语法-MATCHES
如果给定的字串或变量值域给定的正则表达式匹配的话,表达式返回真. IF (CMAKE_SYSTEM_NAME MATCHES "Linux") MESSAGE(STATUS &qu ...