VMCALL 与 SYSENTER 指令非常相似,不同之处在于 SYSENTER 用于系统调用(快速转换到操作系统),而 VMCALL 用于超级调用(转换到管理程序)。
我的问题是,虽然 SYSENTER 不保存 CPU 状态,但同样适用于 VMCALL。发出 VMCALL 会导致 VM 退出,但我不确定它是否将客户机 CPU 状态保存到关联的 VMCS 结构中?
如果它确实保存了 CPU 状态,那么我们如何在超级调用中传递参数呢?
VMCALL 与 SYSENTER 指令非常相似,不同之处在于 SYSENTER 用于系统调用(快速转换到操作系统),而 VMCALL 用于超级调用(转换到管理程序)。
我的问题是,虽然 SYSENTER 不保存 CPU 状态,但同样适用于 VMCALL。发出 VMCALL 会导致 VM 退出,但我不确定它是否将客户机 CPU 状态保存到关联的 VMCS 结构中?
如果它确实保存了 CPU 状态,那么我们如何在超级调用中传递参数呢?
VMCS Region分为6个区域,其中之一是Guest-state area。
Guest State 在每个 VMExit 上存储 RIP、RFLAGS 和 RSP。其余的访客 GPR 在 VMExit 后立即存在于硬件中。
VMCALL 只会无条件地导致 VMExit。寄存器作为参数的使用留给 VMM 的 api。
最多可以分别在 rbx、rcx、rdx 和 rsi 中传递四个参数。超级调用号应该放在 rax 中,返回值将放在 rax 中。除非特定超级调用明确说明,否则不会破坏其他寄存器。
该指令只会导致 VM 退出,并注册适当的退出原因。
从上面我得出结论,VMCALL 不保留任何 CPU 状态。