根据VMWare发布的白皮书,二进制翻译技术仅用于内核(环0代码),环3代码在CPU硬件上“直接执行”。
正如我所观察到的,无论在客户操作系统中运行了多少进程,主机操作系统中始终只有一个进程。所以我假设所有的guest ring 3代码都在单个主机进程上下文中运行。 (对于VMWare,它是vmware-vmx.exe)。
所以我的问题是,如何在一个进程中本地执行如此多的ring 3代码?考虑到大多数Windows exe文件不包含重定位信息,它不能在其他地方执行,并且在ring3代码中不使用二进制转换。
感谢。
答案 0 :(得分:1)
让我们谈谈VMX
,Intel VT-x
的设计。
Intel VT-x
引入了两种新模式来解决此问题:VMX root mode
和VMX non-root mode
,分别用于主机和来宾。两种模式都有0~3环,这意味着主机和来宾不会共享相同的响铃级别。
在VMX root mode
的第3环中运行的虚拟机管理程序,当它决定将CPU控制权转移给来宾时,管理程序执行VMLAUNCH
指令,允许从{VMX non-root mode
转移到VMX root mode
1}}。然后,guest ring 3代码现在能够在VMX non-root mode
中自动执行。所有这些都得到Intel VT-x
的支持。运行guest虚拟机不需要二进制转换或指令仿真。
当然VMX non-root mode
的第3环具有较少的特权和权力。例如,当客户环3代码遇到无法处理的事情时,例如物理设备访问请求,CPU将自动检测到这种限制并转移回VMX root-mode
中的管理程序。管理程序完成此任务后,它将再次触发VMLAUNCH
以运行访客。