看操作系统虚拟化原理总结篇——基于软件的完全虚拟化——cpu

1,软件虚拟化的可行方案

模拟执行和源代码改写。


下面也分为三个部分来介绍软件虚拟化

1.CPU的虚拟化:

通过之前的学习,我们已经知道了CPU的虚拟化本质是指令的虚拟化,即VMM能捕获客户机的敏感指令或者特权指令,通过陷入和模拟的方式完成虚拟化。
那么下面再进行分类介绍:

1,解释执行。
       取一条指令,然后模拟出这条指令的执行效果。由于每一条指令都被取出并且被模拟,也就是说每一条指令都被陷入了,所以就解决了虚拟化漏洞。在这个执行环境中,编译好的二进制代码是不会被载入到物理CPU直接运行的,而是由解释器逐条解码的,再调入对应的函数来模拟指令的功能。
缺点呢,就是每一条指令不区别对待,导致效率低下。

2,扫描和修补。
让多数指令直接运行在物理CPU上,而把操作系统代码中的敏感指令替换成跳转或者陷入到VMM执行的指令块中。 这样相对于解释执行的优势就是有区别对待,效率有明显的提高。下面我们分析下具体流程:
第一步:VMM会在虚拟机开始执行阶段对其进行扫描,解析指令,提取特权指令和敏感指令。
第二不:根据特权指令和敏感指令生产补丁代码。
第三步:执行补丁代码,然后跳转回去继续执行。
!!! 这里有个重要知识点:由于补丁代码比被修改的代码长,所以可以用 INT 指令引起陷入,然后在陷入发生的地方查找原指令,然后进行模拟。
另外,这些补丁代码是存放在VMM的内存缓冲区的,这些容量有限,总会填满,所以VMM还会维持着一个PC-补丁代码关系。
同样,我们来说缺点:
每个补丁都引入了额外的跳转,跳转会降低代码的局部性。 由于扫描和修补是在内存中进行代码修补的,必须维护一份与补丁对应的原始代码的备份,以便在需要时进行恢复。  ====???这里不太懂,内存中的数据都需要进行备份么?

3,二进制代码翻译(以QEMU说明为例)。

这个算是软件虚拟化的主流方式了,VMware就是用的此。
二进制代码翻译在VMM中也是开辟了一段内存,将翻译好的代码放在其中。这样客户机代码也不直接被物理CPU执行,而是存放在缓存中。
BT技术将源代码以基本块为粒度进行翻译,模拟器动态,按需读入二进制代码。并将翻译好的目标代码放入缓存中。这里注意 ,我们必须知道哪些被翻译了,哪些没被翻译,所以这里就需要引入一个Hash表来维护源代码和缓存区代码的关系。注意,这里的翻译和模拟不太一样,QEMU采用的是简单翻译,另外还有个等值翻译,至于具体的不同,我的理解是模拟一般用的是跳转函数,而翻译一般采用的更改某个标志位来实现,------这个待续。

例子来说明: 动态翻译。
在QEMU中,它为每个虚拟CPU都维护了一个数据结构,保存的是当前CPU运行环境,包括各种寄存器的参数和值。

qemu则是采用动态翻译的技术,先将目标代码翻译成一系列等价的被称为“微操作”(micro-operations)的指令,然后再对这些指令进行拷贝,修改,连接,最后产生一块本地代码。这些微操作排列复杂,从简单的寄存器转换模拟到整数/浮点数学函数模拟再到load/store操作模拟,其中load/store操作的模拟需要目标操作系统分页机制的支持。

         qemu对客户代码的翻译是按块进行的,并且翻译后的代码被缓存起来以便将来重用。在没有中断的情况下,翻译后的代码仅仅是被链接到一个全局的链表上,目的是保证整个控制流保持在目标代码中,当异步的中断产生时,中断处理函数就会遍历串连翻译后代码的全局链表来在主机上执行翻译后的代码,这就保证了控制流从目标代码跳转到qemu代码。简单概括下:指定某个中断来控制翻译代码的执行,即每当产生这个中断时才会去执行翻译后的代码,没有中断时仅仅只是个翻译过程而已。这样做的好处就是,代码是是按块翻译,按块执行的,不像Bochs翻译一条指令,马上就执行一条指令。



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值