【发布时间】:2019-05-15 06:25:42
【问题描述】:
我目前正在开发自己的小型虚拟机管理程序,它直接在(当前模拟的)硬件上运行并利用英特尔 VT-x。我正在 x86 Bochs 模拟器中测试管理程序。但是,我似乎无法正确设置 Monitor Trap Flag 位,以便虚拟机退出发生 来宾操作系统中的当前指令之后。
英特尔 SDM 似乎不包含我正在寻找的内容,或者至少,它没有在我期望的地方进行解释。我的目标是在当前指令之后 导致 VM 退出,以防所述指令不会导致另一个 VM 退出。在我的情况下,在我通过设置相应 GPA 的 EPT 条目中的适当位来授予访问权限后,我正在使用 MTF 标志来保护 扩展页表 (EPT) 中的页面。但是,该权限仅授予一条指令的长度;指令成功后,由MTF引起的VM退出应该再次保护页面。
目前,我的实现导致MTF VM退出在指令甚至执行之前,这意味着,在我在EPTE中设置适当位并随后恢复来宾操作系统之后,MTF VM退出发生没有执行指令,这会导致无限循环,因为在 MTF VM 退出处理后,执行会恢复到相同的指令,但页面现在再次受到保护,这会导致另一个 EPT 违规等。
我在 VMCS 的 VM 执行控件中启用 MTF,并且我的 VM-entry Interruption-Information 字段设置如下:
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 退出。
【问题讨论】:
-
你能处理第一个MTF vm-exit,它总是在指令执行之前发生,然后从那个处理程序返回单步吗?如果它就像 EFLAGS 中的普通 TF,你可以单步执行 MTF,所以它不应该在运行相同的指令之前重复 vm-exit,不是吗? (Difference between trap flag (TF) and monitor trap flag? 说它在客人前进时触发)。无论如何,然后在下一个 VM 退出时,无论是来自 MTF 还是其他什么,都进行更改并清除 MTF。 (我不太了解 VMX,只是猜测)
标签: x86 intel virtualization osdev