我想要访客机器中的用户进程调用自定义超级调用,并且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?如果是这样,该怎么办?如果没有,是否有其他选择?
啊我误读了文件。然后当我执行'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退出和退出原因! :) –