VMCALL与SYSENTER指令非常相似,不同于SYSENTER用于系统调用(快速转换到OS)的方式,而VMCALL用于超级调用(转换到虚拟机管理程序)。
我的问题是,虽然SYSENTER不保存CPU状态,但同样适用于VMCALL。发出VMCALL会导致VM退出,但我不确定它是否将guest虚拟机CPU状态保存到关联的VMCS结构中?
如果确实保存了CPU状态,那么我们如何在超级调用中传递参数呢?
答案 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状态。