用人话讲虚拟化 2 - 术


前文提到虚拟化的实质是一个物理设备,多个虚拟接口,状态分离。


也提到了先有的虚拟化技术,纯软件,paravirtualization,hardware assisted virtualization。


这里,我想换一个角度介绍这些技术。因为这些技术无非都是为了解决虚拟化问题的实现,那么,如果让我们自己来做,我们应该怎么设计?从这个角度来思考,这些技术也就自然而然的出来了。


好了,我们有一个机器,我们要把它虚拟化了。由于我们无法更改硬件,所以我们肯定从软件方案着手。


重点在于状态分离。考虑多个内核,在同一个CPU上运行,我们要保证每条指令修改的每一份数据,都是分离的,互不影响的。简单的说就是每个人改自己的一份拷贝,不能碰别人的。


纯软件


做纯软件方案,也就是binary translation,倒也直观。最简单也是最慢的做法就是逐条解释,保证所有修改的数据都用私有拷贝。


首先我们需要创建虚拟状态,比如一个struct里边有所有的CPU register,一个块内存作为虚拟机内存,一个文件充当虚拟机的硬盘,一个TCP连接充当虚拟机的网卡。这样的话,虚拟机要写硬盘,我就给写到文件里;要写内存,就写到自己私有内存块里,诸如此类。


当然,还得考虑别的,比如paging,也就是虚拟地址到物理地址的转化。这部分本来是由CPU的MMU硬件自动完成的,比如你写上mov [addr1], reg1指令给CPU,CPU自动把addr1翻译成addr2,然后把后者的内存读到寄存器。这个翻译由预先设置好的页表完成。由于我们做纯软件,所以这个翻译也得我们自己做了,这就是software page walking。问题就是每次内存访问都引入了这个page walking,多慢可想而知。


优化方法当然可以用caching。像TLB一样把page waling结果存起来。或者用直接把一个代码块全部翻译好,直接运行翻译好的代码。这也就是JIT(just in time) compliation,像JVM虚拟机一样。


对了,JVM虚拟机就是一个很流行的纯软件虚拟化方案。他把不同的硬件体系结构和OS接口虚拟化成同一个java bytecode接口,以实现跨平台。其主要实现技术就是binary translation和JIT。


平台虚拟化上,早期的VMware worksation,virtual box一类的都属于纯软件,直到后来intel和amd开始支持硬件加速的虚拟化技术。


2. Paravirtualization


纯软件好是好,就是太慢,即使有那么多优化的技术。能不能不要每条指令都解释?能不能跳过解释器,直接运行客户内核代码呢?如果可以直接运行虚拟机内核(guest kernel)代码,性能将大大提高。比如内存访问page walking可以直接让hardware做,比软件不知道快到哪里去了!


那么问题是什么?问题就是怎么让多个虚拟机的状态分离。比如假设不同虚拟机内存内容完全不同,每个虚拟机都执行一条同样一条指令mov [addr1], reg1,怎么使得不同的虚拟机读进来自己私有内存的内容,而不是来自同样内存地址的内容呢?


要知道直接运行guest kernel代码的时候,我们对机器是没有控制权的,那么又怎么保证一个guest不去修改另一个guest的内容?


答案是:协同配合。


Paravirtualization的实质是host kernel与guest kernel之间约定一个新的接口。这个接口是软件的,可以当做API。这个约定要求guest kernel不得执行特权指令,任何特权指令都要通过host kernel syscall完成。


用我们的接口和状态模型,接口变了,状态由host kernel维护,并保证分离。所以前面读内存的例子,只要page table由host kernel维护,所有更换page table的操作都交给host kernel完成,guest kernel读内存能读到什么就完全由host kernel说了算了。于是内存状态就被分离了。


其实这样一个guest kernel是一个被阉割的guest kernel。尽管它运行在特权态,但却不能执行特权指令。这样,它看到的接口,也不再是纯x86得硬件接口,而是一个混杂着非特权指令和syscall的接口。举一个极端的离子,以前他用显卡驱动去打印hello world;现在他只能调用host kernel提供的printf了(实际没这么简单)。。。越想越觉得惨,作为内核却丧失了读硬件的控制权。


这种方案,优点是性能好,不需要软件解释。缺点就是得改guest kernel,所以也就linux能支持一下。还有,只有被阉割的内核才能跑,所以用户是不能自己提供内核。否则这跟没腌的太监进宫了是一样的,祸害一方。


3 Hardware assisted virtualization


这个是最重要的术,请听下回分解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值