如何在未使用的x86操作码中实现linux KVM中的新指令

时间:2017-04-24 07:02:11

标签: linux-kernel virtualization qemu kvm cpuid

作为理解虚拟化的一部分,我试图扩展KVM的支持并定义新的指​​令。该指令将使用以前未使用的操作码。 ref- ref.x86asm.net/coder32.html。

现在,让我们说一个像'CPUID'(导致vm-exit)的指令,我想添加一条新指令,比如说''NEWCPUID',它类似于'CPUID'的特权,并被虚拟机管理程序困住,但在实施方面会有所不同。

在浏览了一些在线资源之后,我能够理解如何定义新的系统调用,但我不确定在linux源代码中我需要添加NEWCPUID的代码?有没有比仅依靠'find'命令更好的方法?

我面临以下挑战: 1.我需要在linux源代码中添加哪些代码? 2.不确定这条新指令如何映射到以前未使用的操作码?

由于我是这个领域的新手,并且愿意学习这个,有人可以简单解释一下如何完成这项任务吗?我需要正确的方向来实现这一目标。如果有一个描述该过程的参考/教程/博客,那将会有很大的帮助!

1 个答案:

答案 0 :(得分:0)

以下是您的一些问题的答案:

  1. ...但我不确定我需要在linux源代码中添加哪些文件来添加NEWCPUID的代码? A - 为KVM添加仿真的正确位置是arch / x86 / kvm / emulate.c。看看如何定义opcode_table []以及它们执行的函数的钩子。基本思想是guest执行和未定义的指令,如“db 0xunused”;由于指令未定义,因此导致退出。在KVM中,您查看来自VMCS / VMCB的rip,并确定它是否是KVM知道的指令(例如NEWCPUID),然后是KVM调用x86_emulate_instruction()。

  2. ...有没有比仅依靠'find'命令更好的方法? A - 是的,选择一个示例系统调用,然后使用符号交叉引用,例如cscope。

  3. ...简而言之,我该如何完成这项任务? A - 正如我在1中提到的,首先找到一种方法让guest虚拟机尝试执行这个未使用的操作码(例如db技巧)。我认为汇编程序会尝试拒绝未知的操作码。那么,那是第一步。其次,检查你的指令是否导致vmexit()。为此,您可以使用跟踪。跟踪会发出大量输出,因此,您必须使用一些过滤器选项。如果跟踪压倒性的,只需在vmx_handle_exit(vmx.c)中打印一些东西。最后,找到一种从这里挂钩到自定义函数的方法。 KVM已经有handle_exception()来处理访客异常;这将是插入自定义函数的好地方。了解此函数如何调用emulate_instruction来模拟要注入到guest虚拟机的异常。

  4. 我故意忽略了一些问题,因为我认为这些问题对于在学习过程中弄清楚自己是必不可少的。顺便说一句,我认为这可能不是理解虚拟化的最佳方式。更好的方法可能是编写自己的用户空间管理程序,通过/ dev / kvm或者可能只是一个独立的管理程序来使用kvm服务。