Как работает гипервизор – очень тривиальный вопрос, но часто для многих пользователей не очень понятный. Прежде чем ответить на этот вопрос, я хотел бы освежить некоторые основные вещи. В основном это два режима работы процессора. Режимы – пользовательский режим – режим ядра. При запуске приложения пользовательского режима ОС создаёт процесс с частным виртуальным адресным пространством для воспроизведения. У вас может быть запущено много процессов в пользовательском пространстве, но их можно запускать только изолированно. Таким образом, если один процесс выходит из строя, другие процессы не пострадают. Но пользовательским процессам могут потребоваться специальные сервисы от ОС (например: – ввод-вывод, создание дочерних процессов).
Это может быть достигнуто путём выполнения системных вызовов, которые временно переключают процесс в режим ядра, с помощью метода, называемого перехватом. Инструкции, которые могут быть выполнены только в режиме ядра (например: – системные вызовы), называются конфиденциальными инструкциями. Существует также набор инструкций, которые могут быть перехвачены при выполнении в пользовательском режиме. Давайте назовем их привилегированными инструкциями.
Согласно Popek и Goldberg, машина является виртуализируемой, если чувствительная инструкция является подмножеством привилегированной инструкции.
Следуя принципу, изложенному выше, появились гипервизоры типа 1. В этом случае хост-ОС не нужна, она полностью работает на голом железе. Виртуальные машины (ВМ) работают как пользовательские процессы в пользовательском режиме. Но операционная система понятия не имеет, что это всего лишь пользовательский процесс для гипервизора. Таким образом, режим ядра виртуальных машин также называется режимом виртуального ядра. Когда гостевая ОС, работающая на виртуальной машине (думая, что она находится в режиме ядра), выполняет конфиденциальную инструкцию, возникает ловушка (в данном случае привилегированная команда) для гипервизора. Гипервизор может «проверить» инструкцию, чтобы узнать, кто её выдал.
- Если инструкция от гостевой ОС (в случае режима виртуального ядра), она сразу же выполняется.
- Если инструкция от пользовательской программы на ВМ, она эмулирует то, что будет делать реальное оборудование/ядро.
Похоже, что всё это именно так и работает!! Но, подождите, почему тогда это называется тип-1? Это потому что у нас есть и тип-2. Во-первых, давайте поймем, почему у нас есть ещё один тип.
Помните золотое правило? Позвольте мне повторить это для вас. «Машина виртуализируемая, если конфиденциальная инструкция является подмножеством привилегированной инструкции». Проще говоря, если вы делаете что-то в пользовательском режиме, что вам не разрешено, аппаратное обеспечение должно перехватывать такие запросы. Были процессоры, такие как Intel 386, которые этому строго не следовали. Несколько чувствительных инструкций в 386 могли быть проигнорированы, если выполнялись в пользовательском режиме (например: – POPF). Очевидно, что в этих случаях запуск полных ОС на виртуальной машине не будет работать, потому что некоторые из чувствительных инструкций будут проигнорированы или могут привести к сбою. Тем не менее, последние процессоры имеют поддержку VT (поддержка виртуализации).
Отсюда появился гипервизор 2-го типа, любезно предоставленный VMware. Он использует технику, названную бинарным переводом. Давайте поймем, как VMware обрабатывает этот тип.
Аппаратное обеспечение работает под управлением операционной системы, как и ваш компьютер. Любое создание виртуальной машины похоже на установку программного пакета. После установки гостевой ОС на виртуальный диск её можно загрузить во время выполнения. Когда программа выполняется с виртуального диска, она сканирует код, сначала ища основные блоки (инструкции, которые не изменяют счетчик программы). Если базовые блоки содержат какую-либо секретную инструкцию, она заменяется вызовом процедуры VM, которая её обрабатывает. Таким образом, эмулируются секретные инструкции.
Существует ещё один тип, называемый паравиртуализацией, который изменяет источник гостевой ОС и заменяет конфиденциальные инструкции вызовами API для самого гипервизора. Следовательно, гипервизор теперь становится не чем иным, как микроядром.
Чтобы этот пост был интересным и читабельным, я остановлюсь здесь. Хотя я говорил только о виртуализации ЦП, можно также обратить внимание на виртуализацию памяти и ввода-вывода в гипервизорах.