x86中的VMCALL指令是否保存来宾CPU状态

时间:2015-01-05 19:38:01

标签: virtual-machine x86-64 virtualization intel hypervisor

VMCALL与SYSENTER指令非常相似,不同于SYSENTER用于系统调用(快速转换到OS)的方式,而VMCALL用于超级调用(转换到虚拟机管理程序)。

我的问题是,虽然SYSENTER不保存CPU状态,但同样适用于VMCALL。发出VMCALL会导致VM退出,但我不确定它是否将guest虚拟机CPU状态保存到关联的VMCS结构中?

如果确实保存了CPU状态,那么我们如何在超级调用中传递参数呢?

1 个答案:

答案 0 :(得分:3)

VMCS区域分为6个区域,其中一个区域是访客状态区域。

Guest State在每个VMExit上存储RIP,RFLAGS和RSP。其余的客户GPR在VMExit之后立即在HW中生效。

VMCALL只会无条件地导致VMExit。寄存器作为参数的用法留给了VMM的api。

来自Linux KVM API documentation

  

最多可以分别在rbx,rcx,rdx和rsi中传递四个参数。    超级调用号码应放在rax中,返回值为    放在rax。除非明确说明,否则不会破坏其他登记册    通过特定的超级电话。

来自Intel 64 and IA-32 Architectures Software Developer’s Manual

  

这条指令只会导致VM退出,   注册适当的退出原因。

从上面我得出结论,VMCALL不保留任何CPU状态。