我希望客户机中的用户进程调用自定义超级调用,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是多个参数)。但我找不到这些功能的呼叫网站。
是否可以在不修改来宾内核的情况下调用超级调用?如果是这样,怎么办?如果没有,有其他选择吗?
答案 0 :(得分:1)
VMCALL在guest虚拟机(VMX非root模式)下导致任何CPL级别的VM退出。仅当CPL处于VMX根模式时才会检查CPL。
导致无条件VM退出的另一种方法是使用CPUID指令。 VMM可以通过EAX中的值区分超级调用和常规CPUID调用。
答案 1 :(得分:0)
Is it possible to invoke a hypercall without any modification of a guest kernel?
hypercall只是一种在来宾之间传递信息的方式。主机,你可以触发超级调用(就像virtio使用的hypercall2),但它对你有用吗?