【问题标题】:Does VMCALL instruction in x86 save the guest CPU statex86 中的 VMCALL 指令是否保存来宾 CPU 状态
【发布时间】:2015-03-03 09:47:58
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    来自Linux KVM API documentation

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

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

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

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

    【讨论】:

    • 有道理;将寄存器保存/恢复留给软件是设计事物的明显方式。否则你需要一个控制寄存器来指向一个寄存器保存区域和类似的东西。所以使用vmcall 很像使用syscall;你必须知道你正在调用的 ABI。
    • VM 退出是否保存注册状态?我在英特尔手册中的 VMCS 来宾区域中找不到常规寄存器的任何字段
    • @qstack 我想这应该由 VMM 自己完成。
    猜你喜欢
    • 2011-08-09
    • 2021-07-15
    • 2017-04-23
    • 2018-10-23
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 2017-05-28
    相关资源
    最近更新 更多