我目前正在开发自己的小型虚拟机管理程序,该程序可直接在(当前仿真的)硬件上运行并利用Intel VT-x。我正在x86 Bochs模拟器中测试管理程序。但是,我似乎无法正确设置 Monitor Trap Flag 位,以便在来宾OS中的当前指令后 之后,VM退出。
Intel SDM似乎没有包含我要查找的内容,或者至少没有在我期望的位置进行解释。我的目标是在当前指令之后 导致VM退出,以防该指令不会导致另一个VM退出。在我的情况下,我通过设置相应GPA的EPT条目中的适当位来使用MTF标志来保护扩展页面表(EPT)中的页面。但是,仅在一条指令的长度内授予该权限;成功执行指令后,由MTF导致的VM退出应再次保护该页面。
当前,我的实现导致
我正在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。
答案 0 :(得分:1)
不要通过设置VM输入中断信息字段来请求MTF。而是将Monitor Trap Flag设置为基于主处理器的VM执行控件的第27位。
设置VM条目中断信息字段时,它将在MTM条目之后的第一条指令之前/之前引起MTF事件(正是您得到的行为)。我相信使用此功能的原因是,如果您在执行控件中设置了MTF,并且由于某种原因(而不是MTF)而导致VM退出,则VMM可以恢复VM并立即强制退出MTF。否则,由于优先级较高的退出原因,将错过MTF退出。
请参阅SDM的25.5.2节。