В настоящее время я разрабатываю свой собственный небольшой гипервизор, который работает непосредственно на аппаратном обеспечении (в настоящее время эмулируемом) и использует Intel VT-x.Я тестирую гипервизор в эмуляторе x86 Bochs.Однако я не могу правильно установить бит Monitor Trap Flag , чтобы выход виртуальной машины происходил после текущей инструкции в гостевой ОС.
Intel SDM не выполняеткажется, содержит то, что я ищу, или, по крайней мере, это не объясняется в том месте, где я ожидал.Моя цель - вызвать выход виртуальной машины после текущей инструкции, если указанная инструкция не вызывает другой выход виртуальной машины.В моей ситуации я использую флаг MTF для защиты страницы в Расширенной таблице страниц (EPT) после того, как я предоставил доступ, установив соответствующий бит в записи EPT для соответствующего GPA.Тем не менее, разрешение предоставляется только на длину одной инструкции;после успешного выполнения инструкции выход виртуальной машины, вызванный MTF, должен снова защитить страницу.
В настоящее время моя реализация вызывает выход виртуальной машины MTF за до , инструкция даже выполняется, то есть сразу послеЯ установил соответствующий бит в EPTE и затем возобновил гостевую ОС, выход из MTF VM происходит без выполнения инструкции, что вызывает бесконечный цикл, поскольку после обработки выхода из MTF VM выполнение возобновляется до той же самой инструкции, но страницытеперь снова защищен, что приводит к другому нарушению EPT и т. д.
Я включаю MTF в элементах управления VM-исполнения VMCS, и мое поле Информация о прерывании входа 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 после инструкции.