在不修改客户内核的情况下在 qemu-kvm 中调用 hypercall
invoking hypercall in qemu-kvm without guest kernel modification
我希望来宾计算机中的用户进程调用自定义 hypercall 并且 qemu 接收它。我不想对来宾内核进行任何修改。
从 this answer 和其他材料中,我知道 vmcall
指令将导致 VMEXIT 并且 VMM 将收到其退出原因和参数。
根据Intel® 64 and IA-32 Architectures Software Developer’s Manual p.1201,vmcall
指令会在CPL > 0时触发异常。
所以我得出结论,我需要一个(来宾)内核接口来调用超级调用。
我发现 Linux 内核中的 arch/x86/include/asm/kvm_para.h
具有 kvm_hypercallx
函数(其中 x 是参数的数量)。但是我找不到这些函数的调用点。
是否可以在不修改客户内核的情况下调用超级调用?如果可以,该怎么做?如果没有,还有其他选择吗?
VMCALL 在来宾(VMX 非根模式)中导致任何 CPL 级别的 VM 退出。只有在 VMX root 模式下才会检查 CPL。
另一种导致 VM 无条件退出的方法是使用 CPUID 指令。 VMM 可以通过 EAX 中的值区分超级调用和常规 CPUID 调用。
Is it possible to invoke a hypercall without any modification of a guest kernel?
hypercall 只是一种在来宾和主机之间传递消息的方式,你可能会触发 hypercall(就像 virtio 使用 hypercall2),但它对你有用吗?
我希望来宾计算机中的用户进程调用自定义 hypercall 并且 qemu 接收它。我不想对来宾内核进行任何修改。
从 this answer 和其他材料中,我知道 vmcall
指令将导致 VMEXIT 并且 VMM 将收到其退出原因和参数。
根据Intel® 64 and IA-32 Architectures Software Developer’s Manual p.1201,vmcall
指令会在CPL > 0时触发异常。
所以我得出结论,我需要一个(来宾)内核接口来调用超级调用。
我发现 Linux 内核中的 arch/x86/include/asm/kvm_para.h
具有 kvm_hypercallx
函数(其中 x 是参数的数量)。但是我找不到这些函数的调用点。
是否可以在不修改客户内核的情况下调用超级调用?如果可以,该怎么做?如果没有,还有其他选择吗?
VMCALL 在来宾(VMX 非根模式)中导致任何 CPL 级别的 VM 退出。只有在 VMX root 模式下才会检查 CPL。
另一种导致 VM 无条件退出的方法是使用 CPUID 指令。 VMM 可以通过 EAX 中的值区分超级调用和常规 CPUID 调用。
Is it possible to invoke a hypercall without any modification of a guest kernel?
hypercall 只是一种在来宾和主机之间传递消息的方式,你可能会触发 hypercall(就像 virtio 使用 hypercall2),但它对你有用吗?