X86 监视器陷阱标志VM在当前指令后退出

X86 监视器陷阱标志VM在当前指令后退出,x86,intel,virtualization,osdev,X86,Intel,Virtualization,Osdev,我目前正在开发自己的小型虚拟机监控程序,它直接在(当前模拟的)硬件上运行,并利用Intel VT-x。我正在x86 Bochs模拟器中测试虚拟机监控程序。但是,我似乎无法正确设置监视器陷阱标志位,以便在来宾操作系统中的当前指令之后出现VM退出 英特尔SDM似乎没有包含我想要的内容,或者至少没有在我期望的地方解释它。我的目标是在当前指令之后导致VM退出,以防所述指令不会导致另一个VM退出。在我的情况下,在我通过在EPT条目中为相应的GPA设置适当的位来授予访问权限之后,我使用MTF标志来保护扩展页

我目前正在开发自己的小型虚拟机监控程序,它直接在(当前模拟的)硬件上运行,并利用Intel VT-x。我正在x86 Bochs模拟器中测试虚拟机监控程序。但是,我似乎无法正确设置监视器陷阱标志位,以便在来宾操作系统中的当前指令之后出现VM退出

英特尔SDM似乎没有包含我想要的内容,或者至少没有在我期望的地方解释它。我的目标是在当前指令之后导致VM退出,以防所述指令不会导致另一个VM退出。在我的情况下,在我通过在EPT条目中为相应的GPA设置适当的位来授予访问权限之后,我使用MTF标志来保护扩展页面表(EPT)中的页面。但是,许可仅授予一条指令的长度;指令成功后,MTF导致的VM退出应再次保护页面

目前,在执行指令之前,我的实现会导致MTF VM退出,这意味着,在我在EPTE中设置适当的位并随后恢复来宾操作系统之后,MTF VM退出会在不执行指令的情况下发生,这会导致无限循环,因为在MTF VM退出处理之后,执行会恢复到同一条指令,但是页面现在再次受到保护,这会导致另一个EPT冲突等

我正在VMCS的VM执行控件中启用MTF,并且我的VM条目中断信息字段设置如下:

static void vmx_store_interruption_information(uint32_t intr_info)
{
    vmcs_write32(VM_ENTRY_INTR_INFO_FIELD, intr_info);
}

static void vmx_inject_mtf(struct vcpu_vmx *vmx)
{
    /* intr_info = 0x80000700 */
    uint32_t intr_info = INTR_TYPE_OTHER_EVENT | INTR_INFO_VALID_MASK;

    vmx_store_interruption_information(intr_info);
}

现在,一种可能是简单地模拟一条指令,但这将导致一种过于复杂的方法,即为所有可能的指令创建一个操作码表。相反,我希望在指令之后导致MTF VM退出。

不要通过设置VM入口中断信息字段来请求MTF。相反,设置监视器陷阱标志,即基于主处理器的VM执行控制的第27位

当您设置VM条目中断信息字段时,它会导致MTF事件/在VM条目之后的第一条指令之前/发生(正是您所获得的行为)。我认为,使用此功能的原因是,如果您设置了MTF(在执行控件中),并且由于某种原因/除MTF之外/发生了VM退出,VMM可以恢复VM并立即强制MTF退出。否则,MTF退出将由于更高优先级的退出原因而错过


参见传感和诊断模块SDM第25.5.2节

您是否可以处理第一个MTF vm退出,它总是在指令执行之前发生,然后通过从该处理程序返回一步?如果它像EFLAGS中的正常TF一样,您可以使用MTF单步执行,因此它不应该在运行同一条指令之前重复退出vm,是吗?(说当客人前进时,它会触发)。无论如何,在下一个VM退出时,无论是来自MTF还是其他什么,都要进行更改并清除MTF。(我真的不知道VMX,只是猜测)简言之,设置MTF标志,什么都不做?目前,我正在设置MTF标志以启用MTF VM出口,并设置中断信息字段。如果没有设置中断信息字段,则不会出现MTF VM退出。处理器控件中只有MTF我刚刚注意到您说您正在VM入口控件中设置MTF。MTF在执行控件中。也许这就是为什么您没有得到预期的VM退出?@prl抱歉,这是我问题中的一个错误,我确实在VM执行控件中设置了位。谢谢你指出这一点。