Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux kernel 如何以未使用的x86操作码在linux KVM中实现新指令_Linux Kernel_Virtualization_Qemu_Kvm_Cpuid - Fatal编程技术网

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

Linux kernel 如何以未使用的x86操作码在linux KVM中实现新指令,linux-kernel,virtualization,qemu,kvm,cpuid,Linux Kernel,Virtualization,Qemu,Kvm,Cpuid,作为理解虚拟化的一部分,我试图扩展对KVM的支持,并定义一条新指令。该指令将使用以前未使用的操作码。 ref-ref.x86asm.net/coder32.html 现在,让我们假设一条类似于“CPUID”(导致vm退出)的指令,我想添加一条新指令,比如-“NEWCPUID”,它类似于priviledge中的“CPUID”,被虚拟机监控程序捕获,但在实现上有所不同 在浏览了一些在线资源之后,我能够理解如何定义新的系统调用,但我不确定需要为NEWCPUID添加linux源代码中的哪些文件?有没有比

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

现在,让我们假设一条类似于“CPUID”(导致vm退出)的指令,我想添加一条新指令,比如-“NEWCPUID”,它类似于priviledge中的“CPUID”,被虚拟机监控程序捕获,但在实现上有所不同

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

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


由于我对这一领域完全陌生,并且愿意学习这一点,有人能简单地向我解释一下如何完成这项任务吗?我需要正确的方向来实现这一目标。如果有一个参考/教程/博客描述这个过程,它将是非常有帮助的

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

  • 。。。但是我不确定linux源代码中的哪些文件需要为NEWCPUID添加代码? A-为KVM添加仿真的正确位置是arch/x86/KVM/emulate.c。看看操作码_表[]是如何定义的,以及它们执行的函数的挂钩。基本思想是来宾执行未定义的指令,如“db 0xunused”;这将导致退出,因为指令未定义。在KVM中,查看VMCS/VMCB中的rip,确定它是否是KVM知道的指令(如NEWCPUID),然后KVM调用x86_emulate_指令()

  • …有没有比仅仅依靠“查找”命令更好的方法? A-是,选择一个示例系统调用,然后使用符号交叉引用,如cscope

  • …简言之,我该如何完成这项任务? A-正如我在1中提到的,首先要找到一种方法让来宾尝试执行这个未使用的操作码(比如db技巧)。我认为汇编程序会试图拒绝未知的操作码。所以,这是第一步。其次,检查您的指令是否导致vmexit()。为此,可以使用跟踪。跟踪会发出大量输出,因此,必须使用一些过滤器选项。如果无法进行跟踪,只需在vmx_handle_exit(vmx.c)中打印一些内容。最后,从这里找到一种钩住自定义函数的方法。KVM已经有handle_exception()来处理来宾异常;这将是插入自定义函数的好地方。查看此函数如何调用simulate_指令来模拟要注入来宾的异常


  • 我故意跳过一些问题,因为我认为这些问题在学习过程中是很重要的。顺便说一句,我不认为这不是理解虚拟化的最佳方式。更好的方法可能是编写自己的用户空间管理程序,通过/dev/kvm或一个独立的管理程序来使用kvm服务

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

  • 。。。但是我不确定linux源代码中的哪些文件需要为NEWCPUID添加代码? A-为KVM添加仿真的正确位置是arch/x86/KVM/emulate.c。看看操作码_表[]是如何定义的,以及它们执行的函数的挂钩。基本思想是来宾执行未定义的指令,如“db 0xunused”;这将导致退出,因为指令未定义。在KVM中,查看VMCS/VMCB中的rip,确定它是否是KVM知道的指令(如NEWCPUID),然后KVM调用x86_emulate_指令()

  • …有没有比仅仅依靠“查找”命令更好的方法? A-是,选择一个示例系统调用,然后使用符号交叉引用,如cscope

  • …简言之,我该如何完成这项任务? A-正如我在1中提到的,首先要找到一种方法让来宾尝试执行这个未使用的操作码(比如db技巧)。我认为汇编程序会试图拒绝未知的操作码。所以,这是第一步。其次,检查您的指令是否导致vmexit()。为此,可以使用跟踪。跟踪会发出大量输出,因此,必须使用一些过滤器选项。如果无法进行跟踪,只需在vmx_handle_exit(vmx.c)中打印一些内容。最后,从这里找到一种钩住自定义函数的方法。KVM已经有handle_exception()来处理来宾异常;这将是插入自定义函数的好地方。查看此函数如何调用simulate_指令来模拟要注入来宾的异常


  • 我故意跳过一些问题,因为我认为这些问题在学习过程中是很重要的。顺便说一句,我不认为这不是理解虚拟化的最佳方式。更好的方法可能是编写自己的用户空间管理程序,通过/dev/kvm或一个独立的管理程序来使用kvm服务

    等等,好吧,KVM实际上没有做任何仿真。您如何建议添加“新指令”?你是想用一个无效的操作码来触发CPU异常吗?我想他说的是,毕竟你还是要处理特权指令。不确定这个错误是否也适用于“标准”非法操作码捕获。等等,好了,KVM实际上没有做任何仿真。您如何建议添加“新指令”?你是想用一个无效的操作码来触发CPU异常吗?我想他说的是,毕竟你还是要处理特权指令。不确定这种错误是否也适用于“标准”非法操作码捕获。