根据当前指令

时间:2018-12-14 00:31:49

标签: x86 intel virtualization osdev

我目前正在开发自己的小型虚拟机管理程序,该程序可直接在(当前仿真的)硬件上运行并利用Intel VT-x。我正在x86 Bochs模拟器中测试管理程序。但是,我似乎无法正确设置 Monitor Trap Flag 位,以便在来宾OS中的当前指令后 之后,VM退出。

Intel SDM似乎没有包含我要查找的内容,或者至少没有在我期望的位置进行解释。我的目标是在当前指令之后 导致VM退出,以防该指令不会导致另一个VM退出。在我的情况下,我通过设置相应GPA的EPT条目中的适当位来使用MTF标志来保护扩展页面表(EPT)中的页面。但是,仅在一条指令的长度内授予该权限;成功执行指令后,由MTF导致的VM退出应再次保护该页面。

当前,我的实现导致 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。

1 个答案:

答案 0 :(得分:1)

不要通过设置VM输入中断信息字段来请求MTF。而是将Monitor Trap Flag设置为基于主处理器的VM执行控件的第27位。

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

请参阅SDM的25.5.2节。