0

在全虚拟化中,guest OS 的 CPL 是什么?在半虚拟化中,来宾操作系统的 CPL 为 1(环 1)在完全虚拟化中是否相同?

而且我听说有些x86特权指令不容易处理,因此需要“二进制重写”方法......

这种“二进制重写”是如何发生的?我知道在虚拟化中,CPU 不是模拟的。那么管理程序如何在 CPU 执行二进制指令代码之前更改它们?他们是否预测内存上的下一条指令并在 CPU 到达之前更新内存内容?如果这是真的,我认为管理程序代码(执行二进制重写)每次都需要在执行客户操作系统的某些指令之前拦截 CPU。我认为这是荒谬的。

具体解释将不胜感激。先感谢您..!!

4

1 回答 1

2

如果完全虚拟化是指硬件支持的虚拟化,那么来宾的 CPL 与它在裸机上运行时的 CPL 相同。

Xen 从不重写二进制文件。

这是VMWare(据我所知)。据我所知(但我从未见过 VMWare 源代码),该方法基本上包括对需要以不同方式运行的代码进行运行时修补——通常,这涉及用其他东西替换现有的操作码——要么导致虚拟机管理程序的陷阱,或“做正确的事”的替换代码集。如果我理解这在 VMWare 中是如何工作的,那就是管理程序通过单步执行一个块来“学习”代码,然后应用二进制补丁或将该部分标记为“清晰”(不需要更改)。下次执行此代码时,它已经被修补或清除,因此它可以“全速”运行。

在 Xen 中,使用半虚拟化(环形压缩),操作系统中的代码已被修改以了解虚拟化环境,因此可以“信任”理解某些事情。但是管理程序仍然会捕获例如对页表的写入(否则有人可能会编写一个恶意内核模块来修改页表以映射到另一个客户的内存中,等等)。

HVM 方法确实拦截了某些指令 - 但其余代码以正常全速运行,这要归功于现代处理器中的硬件支持,例如 AMD 中的 SVM 和 Intel 处理器中的 VMX。ARM 在其最新型号的处理器中拥有类似的技术,但我不确定它的名称是什么。

我不确定我是否已经回答了你所有的问题,如果我遗漏了什么,或者不够清楚,请随时问...

于 2013-01-06T14:43:40.610 回答