|
|
Инструкции Intel VMX
Технология Intel VMX определяет следующие процессорные инструкции.
VMXON m64
Включает режим VMX root operation. Программа приобретает полномочия супервизора виртуального режима. Операнд инструкции m64 - 64-битная ячейка памяти, из которой считывается указатель VMXON Pointer - физический адрес региона VMXON. Считывается поле VMCS Revision ID из региона VMXON и его значение проверяется на совместимость с моделью процессора. После перехода в режим VMX запрещены следующие функции: механизм программного сброса процессора (сигнал INIT), маскирование адресной линии A20 (сигнал A20M), то есть линия A20 будет разрешена, независимо от состояния этого сигнала. Инструкция может использоваться только в Protected Mode. Для успешного перехода в режим VMX, текущий режим работы процессора и состояние битов в регистрах управления CR0 и CR4 должны удовлетворять ряду условий.
VMXOFF
Выключает режим VMX root operation, отменяет действие инструкции VMXON. Процессор возвращается в "обычный" режим.
VMPTRLD m64
Загружает значение указателя VMCS Pointer из 64-битной ячейки памяти, адрес которой задан операндом m64. Регион VMCS, адресуемый указателем, приобретает статус активного и текущего региона VMCS. Считывается поле VMCS Revision ID из региона VMCS и его значение проверяется на совместимость с моделью процессора. После загрузки указателя VMCS Pointer, программа может начинать монтировать поля управления виртуальной машиной, используя инструкции VMREAD, VMWRITE.
VMPTRST m64
Сохраняет значение указателя VMCS Pointer в 64-битную ячейку памяти, адрес которой задан операндом m64.
VMCLEAR m64
Очищает состояние блока VMCS, адрес которого находится в 64-битной ячейке памяти, адрес которой задан операндом m64. Если указан адрес текущего блока VMCS, то последний приобретает статус недостоверного. Виртуальная машина, описываемая данным блоком, получает статус остановленной. Точный список полей блока VMCS, обновляемых в ходе очистки и записываемые в них данные зависят от модели процессора. Так как данные блока VMCS могут кэшироваться во внутренних буферах процессора, ожидая отложенной записи, в обязанности инструкции VMCLEAR также входит выполнение указанной отложенной записи.
VMREAD r/m64, r64, VMREAD r/m32, r32
Считывает из текущего блока VMCS элемент, код которого указан в операнде-источнике (регистре r64 или r32) и помещает данный элемент в операнд получатель (регистр или ячейку памяти r/m64 или r/m32). Инструкция обращается к элементам блока VMCS, используя их коды, а не адреса ячеек памяти. Коды элементов перечислены в [5]. Отметим, что обращаться к элементам блока VMCS, используя обычные инструкции работы с ячейками памяти, не рекомендуется по двум причинам:
1) Форматирование региона VMCS зависит от модели процессора и не документировано. При использовании инструкций VMREAD и VMWRITE это учитывается автоматически, так как в данных инструкциях задается не адрес элемента, а его код, а адрес автоматически генерирует процессор по коду. Но если мы читаем элемент блока VMCS инструкцией MOV, используя адрес элемента, потребуется настройка адреса в соответствии с моделью процессора, что крайне неудобно.
2) Данные региона VMCS кэшируются во внутренних буферах процессора. Инструкции VMREAD и VMWRITE автоматически учитывают это и гарантируют когерентность состояния блока VMCS в памяти и в процессоре. А при чтении элемента блока VMCS инструкцией MOV (как обычной ячейки памяти), мы можем прочитать устаревшие данные, не обновленные процессором. При записи элемента блока VMCS инструкцией MOV процессор может "не заметить" изменения состояния перезаписанного элемента, если использует его копию из внутреннего буфера.
VMWRITE r64, r/m64, VMWRITE r32, r/m32
Значение операнда-источника (r/m64 или r/m32) записывается в указанный элемент текущего блока VMCS. Код элемента указан в операнде-получателе (r64 или r32). Инструкция обращается к элементам блока VMCS, используя их коды, а не адреса ячеек памяти. См. пояснение в описании инструкции VMREAD.
VMLAUNCH
Запускает виртуальную машину, управляемую текущим блоком VMCS, то есть тем блоком VMCS, адрес которого находится в регистре VMCS Pointer. Предполагается, что исходно данная виртуальная машина остановлена (Launch State = Clear). После выполнения серии проверок, процессор переключается из режима супервизора (VMX root operation) в режим "гостя" (VMX non-root operation) и начинает выполнение "гостевой" программы.
VMRESUME
Запускает виртуальную машину, управляемую текущим блоком VMCS. Эта инструкция отличается от инструкции VMLAUNCH тем, что предназначена для возобновления работы уже запущенной виртуальной машины, которая временно вернула управление в супервизор, например из-за попытки доступа к системным ресурсам, обращаться к которым "гостевая" программа не имеет права. VMRESUME применяется, когда текущее состояние Launch State = Launched.
VMCALL
Завершает выполнение виртуальной машины и передает управление в супервизор (VM Monitor). Выполняется VM Exit, то есть переключение процессора из состояния VMX non-root operation в состояние VMX root operation. Эта инструкция позволяет осуществлять явный вызов сервисных процедур супервизора из "гостевой" программы.
|
|