Рабочая станция VMWare и платформа x86
Я изучаю виртуализацию из книги Таненбаума ("Современные операционные системы"). Я четко помню все основные концепции виртуализации, но не могу лучше понять, как работает VMWare Workstation.
Во-первых, рабочая станция VMWare состоит из двух компонентов:
- VMM: он заботится о выполнении инструкций.
- VMX: связывает VMM с операционной системой хоста.
VMM использует перед каждым (?) Выполнением "алгоритм принятия решения", чтобы установить, можно ли выполнить его, используя "прямое выполнение" (trap-and-emulate) или "двоичный перевод".
Таненбаум сказал, что разумная инструкция генерирует "ловушку" только в нескольких случаях (в этом случае VMM может использовать прямое выполнение, улучшая производительность).
Что мне непонятно, так это почему на платформе x86 разумная инструкция не всегда разумна (на платформе x86) и при каких обстоятельствах это так?
1 ответ
Я не читал книгу Таненбаума, это моя интерпретация слов автора.
Согласно Википедии, 18 чувствительных инструкций, которые нельзя запустить напрямую:
sgdt
(Читайте GDT хозяина, а не гостя)sidt
(Как указано выше, но для IDT)sldt
(Как указано выше, но для LDT)smsw
(Прочитайте контрольный регистр 0 хоста, а не гостевого)pushf
(Читайте флаги, особенно системные, хоста, а не гостя)popf
(Как и выше, но напишите, только некоторые из флагов)lar
(Прочтите права доступа из таблиц дескрипторов хоста, а не гостя)lsl
(Читайте ограничение сегмента из таблиц дескрипторов хоста, а не гостя)verr
,verw
(Проверьте доступ на чтение / запись, используя таблицы дескрипторов хоста, а не гостевые)pop
/push
(Используйте дескрипторы сегмента хоста для размера операндов и указателя стека)call FAR
,jump FAR
,int
,retf
(Передача управления в соответствии с таблицами дескрипторов хоста)str
(Установить регистр задач хоста)mov <segment registers>
(используйте таблицы дескрипторов хоста, а не гостевые)
Обоснование чувствительности - моя работа
Ни одна из этих инструкций не попадает в ловушку всегда.
Некоторые, не считая исключения доступа к памяти, никогда не делают: pushf
, popf
, lar
, lsl
, verr
, verw
, push
, pop
,
Некоторые ловушки, только если хост настроил их для этого: smsw
, sgdt
, sidt
, sldt
, str
,
Это, вероятно, не то, что Таненбаум намеревался сказать, хотя.
Некоторые ловушки почти наверняка, но некоторые значения могут заставить их работать: call FAR
, jmp FAR
, retf
, int
, Это, наверное, то, что имел в виду Таненбаум.
Проще говоря, инструкция, как jmp FAR 08h:00h
пытается получить доступ к "коду, помеченному номером 08h".
Это может или не может быть успешным в зависимости от того, какое ограничение хост наложил на "метку" 08h.
Большая часть ярлыка недоступна, и они будут ловушкой, но некоторые могут работать.
То же самое верно для call
а также retf
,int
обычно не перехватывает, но это опять же зависит от конфигурации ОС.
В общем, инструкции, которые зависят от структуры системы хоста, могут перехватывать определенные значения, но не другие.
Невозможно причинить вред, даже если инструкция успешно выполнится, но не может быть выполнена непосредственно в контексте виртуализации.