如何在未使用的x86 opcode处的Linux KVM中实现新指令



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

现在,可以说像'cpuid'(导致VM exit(这样的指令,我想添加一个新的指令,例如 - " newcpuid",类似于privilede中的'cpuid',并被Hypervisor捕获,但在实施方面会有所不同。

浏览了一些在线资源后,我能够理解如何定义新的系统调用,但是我不确定Linux源代码中的所有文件是否需要为newCpuid添加代码?有没有比仅依靠"查找"命令更好的方法?

我面临着以下挑战:1. Linux源代码中的哪个位置我需要添加代码?2.不确定如何将此新指令映射到以前未使用的OpCode?

由于我对这个领域是陌生的,并且愿意学习这件事,所以有人可以解释我如何处理这项任务吗?我需要正确的方向来实现这一目标。如果有一个参考/教程/博客描述该过程,它将有很大的帮助!

这是您一些问题的答案:

  1. ...但是我不确定Linux源代码中的所有文件是否需要添加newCpuid的代码?A-添加KVM仿真的正确位置是Arch/X86/KVM/Emulate.C。看看如何定义opcode_table []以及钩的钩子。基本思想是来宾执行和未定义的指令,例如" DB 0xunused";由于指令不确定,这是导致出口的结果。在KVM中,您查看来自VMCS/VMCB的RIP,并确定它是否是指令KVM知道(例如newCpuid(,然后KVM调用X86_EMUTER_INSTRUCTION((。

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

  3. ...简而言之,我如何完成此任务?A-正如我在1中提到的那样,首先找到了一种方法,让来宾试图执行此未使用的操作码(例如DB Trick(。我认为汇编器将试图拒绝未知的Opcodes。因此,第一步。其次,检查您的说明是否会导致VMEXIT((。为此,您可以使用跟踪。跟踪会发出大量输出,因此,您必须使用一些过滤器选项。如果跟踪是压倒性的,只需在VMX_HANDLE_EXIT(VMX.C(中printk。最后,从这里找到一种方法来连接您的自定义功能。KVM已经具有hander_exception((来处理访客异常;那将是插入您的自定义功能的好地方。查看此功能如何称呼Emulate_instruction,以模拟将要注入来宾的例外。

我故意跳过了一些问题,因为我认为它们在学习过程中弄清楚自己必不可少。顺便说一句,我认为这可能不是理解虚拟化的最佳方法。更好的方法可能是编写自己的用户空间管理程序,该管理程序通过/dev/kvm或仅仅是独立的管理程序来UTLISLIDER -servisor。

相关内容

  • 没有找到相关文章

最新更新