6

VMCALL 与 SYSENTER 指令非常相似,不同之处在于 SYSENTER 用于系统调用(快速转换到操作系统),而 VMCALL 用于超级调用(转换到管理程序)。

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

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

4

1 回答 1

5

VMCS Region分为6个区域,其中之一是Guest-state area。

Guest State 在每个 VMExit 上存储 RIP、RFLAGS 和 RSP。其余的访客 GPR 在 VMExit 后立即存在于硬件中。

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

来自Linux KVM API 文档

最多可以分别在 rbx、rcx、rdx 和 rsi 中传递四个参数。超级调用号应该放在 rax 中,返回值将放在 rax 中。除非特定超级调用明确说明,否则不会破坏其他寄存器。

来自英特尔 64 和 IA-32 架构软件开发人员手册

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

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

于 2016-06-15T20:45:50.957 回答