2017-08-16 74 views
2

我想要访客机器中的用户进程调用自定义超级调用,并且qemu接收它。我不想对guest虚拟机内核进行任何修改。
this answer等资料我知道vmcall指令会导致VMEXIT和VMM会收到它的退出原因和参数。在没有访客内核修改的情况下调用qemu-kvm中的超级调用

Intel® 64 and IA-32 Architectures Software Developer’s Manual p.1201vmcall指令将当CPL> 0
所以,我的结论是,我需要一个(来宾)的内核接口来调用超级调用触发异常。

我在Linux内核中发现arch/x86/include/asm/kvm_para.hkvm_hypercallx函数(其中x是一些参数)。但是我找不到这些功能的呼叫站点。

是否可以在不修改guest虚拟机内核的情况下调用hypercall?如果是这样,该怎么办?如果没有,是否有其他选择?

回答

1

当处于guest虚拟机(VMX非根模式)时,VMCALL会导致VM退出任何CPL级别。 CPL检查仅在VMX根模式下完成。

导致无条件VM退出的另一种方法是使用CPUID指令。 VMM可以通过EAX中的值区分超常调用和常规CPUID调用。

+0

啊我误读了文件。然后当我执行'asm(“vmcall”::“a”(VAL))'时,qemu可以接收控件吗?我尝试过,但是在'qemu/kvm-all.c'中的'kvm_cpu_exec()'中运行 - > exit_reason'从来就不是sams值'VAL'。你知道我应该看哪个代码点吗? –

+0

我不知道KVM内部,但我想退出的原因是18(vmcall)。你会从客人状态中获得eax的价值。 – prl

+0

我找到了原因! [这个页面](https://github.com/dpw/kvm-hello-world)说,“最明显的方式可能是VMCALL(或AMD上的VMMCALL)指令,它专门用于呼叫管理程序。但事实证明,KVM为其内部超级调用机制保留VMCALL/VMMCALL,而不会将由这些指令引起的VM出口通知给用户空间VM主机程序。所以我们需要其他方式来触发VM退出。 HLT很方便,因为它是一个单字节指令。“这就是为什么qemu无法收到vm退出和退出原因! :) –

0
Is it possible to invoke a hypercall without any modification of a guest kernel? 

超级调用只是一种客人&主机之间传递消息,则可能触发超级调用(如为Virtio使用hypercall2),但对你来说是有用的?

+0

我做了一个蜜饯。当用户进程执行特定指令(例如vmcall)时,我想要做的是将来自用户进程的控制权移交给主机的qemu。内核中的超级调用可能不是用户的。 –

+0

@ DaeR.Jeong最好的方法应该是在/ dev /中添加虚拟设备模型,并使用共享内存 –

相关问题