Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/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 为什么在kvm中一段时间后MTF位复位?_Linux Kernel_Virtual Machine_X86 64_Qemu_Kvm - Fatal编程技术网

Linux kernel 为什么在kvm中一段时间后MTF位复位?

Linux kernel 为什么在kvm中一段时间后MTF位复位?,linux-kernel,virtual-machine,x86-64,qemu,kvm,Linux Kernel,Virtual Machine,X86 64,Qemu,Kvm,我一直在玩VMX和KVM,有一些更一般和更精确的问题 我用virtual manager创建了一个VM,因为我认为(从我在网上读到的内容来看)这是让来宾运行Ubuntu 18.04(在我的例子中)或整个操作系统的最简单方法。这是否添加/更改了KVM/qemu实现中的任何内容,或者只是一个接口 据我在KVM中的理解(当插入内核模块(KVM和KVM_intel)时),内核确实扮演了虚拟机监控程序的角色。这是正确的吗?在这个假设下,我假设一个新的内核模块将成为hypervisor的一部分。在一个基本内

我一直在玩VMX和KVM,有一些更一般和更精确的问题

  • 我用virtual manager创建了一个VM,因为我认为(从我在网上读到的内容来看)这是让来宾运行Ubuntu 18.04(在我的例子中)或整个操作系统的最简单方法。这是否添加/更改了KVM/qemu实现中的任何内容,或者只是一个接口
  • 据我在KVM中的理解(当插入内核模块(KVM和KVM_intel)时),内核确实扮演了虚拟机监控程序的角色。这是正确的吗?在这个假设下,我假设一个新的内核模块将成为hypervisor的一部分。在一个基本内核模块中,我使用VMREAD从VMCS中读取一些值。其中一个值是GUEST_IDTR_BASE(在vmx.h中定义),用于读取GUEST的IDTR。出于某种原因,主机IDTR和来宾IDTR具有相同的值?这是正确的吗?如果是,背后的原因是什么?如果不是,我不理解什么
  • 我试图更改vmx.c中的handle_monitor_陷阱,只添加一些print语句,以了解是否发生了某些事情以及何时调用并重新编译kvm_intel模块。然后,在单独的模块中,更改MTF位(按照英特尔手册,它应该是基于CPU的VM EXEC控制中的第27位) 与
  • 其中value是我从基于CPU的VM执行控制或0x8000000读取的旧值,encoding只是基于CPU的VM执行控制。当我将模块插入内核时(当然只有在VM运行时),我修改的处理程序才会被调用。问题:

    • 经过很短的一段时间后,它就停止了(位再次为0)。有什么东西复位了吗?这是怎么发生的?qemu是否也参与其中
    • 例如,在打印Rip时,在来宾中执行循环时,正在打印的Rip每一步都会增加,并且不会返回。vm正在执行什么?我是否退出了正确的VM,或者在KVM或qemu中是否存在我不知道的其他结构
    我禁用了除一个cpu之外的所有cpu,以确保我会更改“正确”的VMC,因为如果我从手册中正确理解它,不同的内核上可能会有不同的VMC

    总的来说,如果您能给我任何帮助,我将非常感激。如果您对如何更好地导航源代码有任何建议,我将非常感谢,因为我的经验很少

  • virtmanager是libvirt的包装器,libvirt又是多个vmm(包括QEMU,它可以包装KVM)的包装器
  • 正如@prl所提到的,没有任何东西可以阻止主机和来宾具有相同的idtr值。尽管相同,但它们实际上不会映射到相同的主机物理地址,因为来宾的值表示来宾物理地址。在非老式x86硬件上,该来宾物理地址将通过EPT(扩展页表)重新映射
  • 您的驱动程序不“拥有”VMCS。下次KVM写入该VMCS的基于CPU的_VM_EXEC_控件时,它将破坏您编写的内容。您可以更改KVM以启用MTF

  • 在第二季度,如果您在主机和客户机中运行相同的操作系统,那么它们在这些方面可能具有相同的值也就不足为奇了。在第三季度,我的虚拟机监控程序在非常特定的情况下启用MTF,并且总是在下一个VM条目上禁用MTF,除非导致启用MTF的条件仍然存在。我不知道qemu的情况,但可能类似。我希望qemu不希望另一个模块操纵执行控制。每个CPU总是有一个单独的VMC。因为您有guest RIP值,所以如果它是内核地址,应该很容易在guest内核的链接映射中查找它。如果是用户地址,那就更难了。谢谢@prl!是的,当然是0x8000000。我不确定昨天写问题时我在想什么。在我的代码中,我设置了正确的位,否则,我认为不会调用handle\u monitor\u trap。问题2。这是有道理的!非常感谢。那么翻译发生在哪里呢?或者他们共用同一IDT?但是,当向IDT添加新向量并尝试从来宾调用它时,它找不到自定义处理程序,而我的主机却找到了。
    __asm__ __volatile__ ("vmwrite %[value], %[encoding]; setna %[ret]" 
           : [ret]"=rm"(ret)
           : [value]"rm"(value), [encoding]"r"(encoding) : "cc", "memory");