为什么我们需要完全虚拟化的二进制翻译

时间:2017-03-26 20:40:32

标签: virtualization

在硬件辅助虚拟化中,客户操作系统在Ring 0上运行,因此它可以直接运行特权指令,对不对?

那么为什么在完全虚拟化中,VMM只是在Ring 0上运行guest特权指令?为什么我们需要翻译它们?

需要考虑的一个原因是不同的架构(不同的客户和主机)。还有什么吗?

1 个答案:

答案 0 :(得分:0)

  

因此它可以直接运行特权指令,我是对的吗?

不,这不完全正确。特权指令仍将尝试访问特权资源,因此不允许在VMM后面查看/更改它们。因此他们会陷阱。这就是经典VMM使用“陷阱和模拟”方法执行访客的原因。大多数非特权的guest虚拟机指令都是直接执行的,特权的guest虚拟机指令是一个一个地进行陷阱和模拟的。没有翻译,即在任何情况下都需要转换代码的大(> 1个客户指令)块。

或者,可以使系统资源成为非特权,因此访问它的指令在虚拟化环境中变为无害。

  

那么为什么在完全虚拟化中,VMM不会在Ring 0上运行guest特权指令?

“Ring 0”只是一个数字,除了某些指令接收新的语义之外没有多大意义:它们不会像在较高环上那样发生故障,而是允许它们访问系统资源。但在VMM中,他们不允许这样做。

  

为什么我们需要翻译它们?

我们没有,个别特权指令可能被困,然后被模仿或解释。 “翻译”作为一个术语仅对指令块有意义。

  

我想到的一个原因是不同的架构

当100%的访客指令是“特权”时,这是某种退行性情况,即它们在所选主机上的行为不会如预期。尝试直接执行它们是没有意义的,并且解释它们中的每一个对于许多应用来说太慢了。这就是翻译==更大块的编译开始有意义的地方。

  

还有什么吗?

对于英特尔架构,某些架构特性有时会(暂时)禁用硬件辅助虚拟化,并在速度和正确性方面回退到二进制翻译。但是,我认为这个主题是另一个更具体问题的一部分,因为答案非常复杂,需要深入了解英特尔VT-x。