Как происходит переключение процессов в ВМ?
Для обычного автономного хоста разные процессы выполняют переключение контекста с помощью планировщика. Например, скажем, есть Процесс 1 и Процесс 2, затем управление переходит от Процесса 1 к Планировщику, а затем от Планировщика к Процессу 2, который затем выполняется, пока не вернет управление Планировщику для планирования другого процесса.
Я хочу знать, как этот переход с процесса 1 на процесс 2 происходит в виртуальной машине? ВМ звонит VM_EXIT()
каждый раз, когда происходит процесс переключения между двумя процессами внутри виртуальной машины? или планировщик хоста как-то связан с переключением процессов?
AFAIK, хост-ОС рассматривает виртуальную машину как единый процесс. Может ли кто-нибудь указать на некоторые подсказки, где я мог бы устранить эти сомнения?
2 ответа
Виртуальные машины не понимают, что происходит внутри, они просто моделируют оборудование.
Существует 3 основных метода моделирования ВМ. Наиболее очевидным является аппаратная эмуляция, чем и занимается Bochs. Это просто программный симулятор x86-совместимого ПК без какой-либо более глубокой магии. ПК - это машина для обработки данных, поэтому Bochs просто использует хост-ОС для сбора входных данных и передает их на эмулируемые виртуальные устройства, затем считывает выходные данные с этих устройств и использует хост для их представления. Это именно то, что делают консольные эмуляторы и подобные программы. Bochs не знает, что происходит внутри виртуальной машины, он работает на голом эмулируемом оборудовании. Понятие процессов слишком абстрактно для него, оно не должно заботиться о таких вещах - просто аппаратная эмуляция.
Второй тип виртуальных машин - это то, что было распространено до внедрения виртуализации с аппаратным ускорением. Эмуляция в стиле Бохса медленная, потому что она интерпретирует машинный код побайтово. Запуск голого байт-кода невозможен в работающей ОС из-за того, как работают процессоры (и они работают так по веской причине), но приложение может взять кусок байт-кода и отредактировать его, чтобы сделать его безопасным для выполнения в хост-ОС, затем выполните его как свой собственный код. Этап редактирования служит двум целям: он дезинфицирует код, чтобы сделать его возможным, и подключает моделируемые устройства ввода-вывода к соответствующим источникам данных / целевым объектам хоста. Тем не менее, для виртуальной машины не существует ничего похожего на процессы, это просто псевдоэмулируемый код на физическом процессоре, притворяясь, что это код программы.
Наконец, третий тип виртуальных машин - виртуализированные виртуальные машины с аппаратным ускорением. Требуется поддержка аппаратного обеспечения, но она есть у всех современных процессоров. Речь идет о том, что раньше я говорил, что невозможно: запускать низкоуровневый код параллельно с операционной системой хоста. Дело в том, что если он встроен в процессор, вы можете позволить ему правильно обрабатывать код. Это создаст среду песочницы для этого кода, предоставляя хосту контроль над этой песочницей. Таким образом, код виртуальной машины выполняется еще ближе к оборудованию, поэтому он работает быстрее. Это также ближе к использованию аппаратной кольцевой системы, но все еще не представляет точную концепцию процессов. Они всегда обрабатываются гостевыми ОС. Но в виртуальных машинах с аппаратным ускорением вы действительно можете увидеть нечто похожее на переключение контекста, например на хосте. Другие виды виртуальных машин всегда работают как программы уровня пользователя.
Переключение процессов внутри виртуальной машины происходит так же, как и на обычной машине. ОС просто меняет, над каким процессом она работает. Хост не знает или не заботится о том, что происходит внутри виртуальной машины - какая разница?