【发布时间】:2017-03-26 20:40:32
【问题描述】:
在硬件辅助虚拟化中,客户操作系统运行在 Ring 0 上,因此它可以直接运行特权指令,对吗?
那么为什么在完全虚拟化中,VMM 不会在环 0 上运行访客特权指令?为什么我们需要翻译它们?
想到的一个原因是不同的架构(不同的客人和主机)。还有什么吗?
【问题讨论】:
标签: virtualization
在硬件辅助虚拟化中,客户操作系统运行在 Ring 0 上,因此它可以直接运行特权指令,对吗?
那么为什么在完全虚拟化中,VMM 不会在环 0 上运行访客特权指令?为什么我们需要翻译它们?
想到的一个原因是不同的架构(不同的客人和主机)。还有什么吗?
【问题讨论】:
标签: virtualization
所以它可以直接运行特权指令,对吗?
不,这并不完全正确。特权指令仍会尝试访问特权资源,因此不能在 VMM 背后查看/更改它们。因此他们会设陷阱。这就是为什么经典 VMM 使用“trap-and-emulate”方法执行客人的原因。大多数非特权客户指令是直接执行的,而特权客户指令则被一一模拟。在任何情况下都不需要翻译,即大(>1 个客户指令)代码块的转换。
或者,系统资源可以设置为非特权,因此访问它的指令在虚拟化环境中变得无害。
那么为什么在完全虚拟化中,VMM 不会在环 0 上运行访客特权指令?
“Ring 0”只是一个数字,除了某些指令接收新的语义外,它没有多大意义:它们不会像在更高的环上那样出错,而是允许它们访问系统资源。但是在 VMM 内部,他们是不允许这样做的。
为什么我们需要翻译它们?
我们不会,个别特权指令可能会被捕获,然后被模拟或解释。 “翻译”作为一个术语仅对指令块有意义。
想到的一个原因是架构不同
当 100% 的客户指令是“特权”时,这是一种退化的情况,即它们在所选主机上的行为不会像预期的那样。尝试直接执行它们是没有意义的,并且解释它们中的每一个对于许多应用程序来说都太慢了。这就是翻译 == 更大块的编译开始变得有意义的地方。
还有什么吗?
对于英特尔架构,某些架构特性有时会导致(暂时)禁用硬件辅助虚拟化并退回到二进制转换的想法在速度和正确性方面有益。但是,我认为这个主题是另一个更具体的问题的一部分,因为答案非常复杂,需要对英特尔 VT-x 有深入的了解。
【讨论】: