在没有访客内核修改的情况下调用qemu-kvm中的超级调用
我想要访客机器中的用户进程调用自定义超级调用,并且qemu接收它。我不想对guest虚拟机内核进行任何修改。
从this answer等资料我知道vmcall
指令会导致VMEXIT和VMM会收到它的退出原因和参数。在没有访客内核修改的情况下调用qemu-kvm中的超级调用
据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是一些参数)。但是我找不到这些功能的呼叫站点。
是否可以在不修改guest虚拟机内核的情况下调用hypercall?如果是这样,该怎么办?如果没有,是否有其他选择?
当处于guest虚拟机(VMX非根模式)时,VMCALL会导致VM退出任何CPL级别。 CPL检查仅在VMX根模式下完成。
导致无条件VM退出的另一种方法是使用CPUID指令。 VMM可以通过EAX中的值区分超常调用和常规CPUID调用。
Is it possible to invoke a hypercall without any modification of a guest kernel?
超级调用只是一种客人&主机之间传递消息,则可能触发超级调用(如为Virtio使用hypercall2),但对你来说是有用的?
我做了一个蜜饯。当用户进程执行特定指令(例如vmcall)时,我想要做的是将来自用户进程的控制权移交给主机的qemu。内核中的超级调用可能不是用户的。 –
@ DaeR.Jeong最好的方法应该是在/ dev /中添加虚拟设备模型,并使用共享内存 –
啊我误读了文件。然后当我执行'asm(“vmcall”::“a”(VAL))'时,qemu可以接收控件吗?我尝试过,但是在'qemu/kvm-all.c'中的'kvm_cpu_exec()'中运行 - > exit_reason'从来就不是sams值'VAL'。你知道我应该看哪个代码点吗? –
我不知道KVM内部,但我想退出的原因是18(vmcall)。你会从客人状态中获得eax的价值。 – prl
我找到了原因! [这个页面](https://github.com/dpw/kvm-hello-world)说,“最明显的方式可能是VMCALL(或AMD上的VMMCALL)指令,它专门用于呼叫管理程序。但事实证明,KVM为其内部超级调用机制保留VMCALL/VMMCALL,而不会将由这些指令引起的VM出口通知给用户空间VM主机程序。所以我们需要其他方式来触发VM退出。 HLT很方便,因为它是一个单字节指令。“这就是为什么qemu无法收到vm退出和退出原因! :) –