3

Для обычного автономного хоста разные процессы выполняют переключение контекста с помощью планировщика. Например, скажем, есть Процесс 1 и Процесс 2, затем управление переходит от Процесса 1 к Планировщику, а затем от Планировщика к Процессу 2, который затем выполняется, пока не вернет управление Планировщику для планирования другого процесса.

Я хочу знать, как этот переход с процесса 1 на процесс 2 происходит в виртуальной машине? Вызывает ли VM VM_EXIT() каждый раз, когда происходит переключение между двумя процессами внутри VM? или планировщик хоста как-то связан с переключением процессов?

AFAIK, хост-ОС рассматривает виртуальную машину как единый процесс. Может ли кто-нибудь указать на некоторые подсказки, где я мог бы устранить эти сомнения?

2 ответа2

2

Виртуальные машины не понимают, что происходит внутри, они просто моделируют оборудование.

Существует 3 основных метода моделирования ВМ. Наиболее очевидным является аппаратная эмуляция, чем и занимается Bochs. Это просто программный симулятор x86-совместимого ПК без какой-либо более глубокой магии. ПК - это машина для обработки данных, поэтому Bochs просто использует хост-ОС для сбора входных данных и передает их на эмулируемые виртуальные устройства, затем считывает выходные данные с этих устройств и использует хост для их представления. Это именно то, что делают консольные эмуляторы и подобные программы. Bochs не знает, что происходит внутри виртуальной машины, он работает на голом эмулируемом оборудовании. Понятие процессов слишком абстрактно для него, оно не должно заботиться о таких вещах - просто аппаратная эмуляция.

Второй тип виртуальных машин - это то, что было распространено до внедрения виртуализации с аппаратным ускорением. Эмуляция в стиле Bochs медленная, потому что она интерпретирует машинный код побайтово. Запуск голого байт-кода невозможен в работающей ОС из-за того, как работают процессоры (и они работают так по веской причине), но приложение может взять кусок байт-кода и отредактировать его, чтобы сделать его безопасным для выполнения в хост-ОС, затем выполните его как свой собственный код. Этап редактирования служит двум целям: он дезинфицирует код, чтобы сделать его возможным, и подключает моделируемые устройства ввода-вывода к соответствующим источникам данных / целям хоста. Тем не менее, ничего похожего на процессы для ВМ не существует, это просто псевдоэмулируемый код на физическом процессоре, притворяясь, что это код программы.

Наконец, третий тип виртуальных машин - виртуализированные виртуальные машины с аппаратным ускорением. Требуется поддержка аппаратного обеспечения, но она есть у всех современных процессоров. Речь идет о том, что раньше я говорил, что невозможно: запускать низкоуровневый код параллельно с операционной системой хоста. Дело в том, что если он встроен в процессор, вы можете позволить ему правильно обрабатывать код. Это создаст среду песочницы для этого кода, предоставляя хосту контроль над этой песочницей. Таким образом, код виртуальной машины выполняется еще ближе к оборудованию, поэтому он работает быстрее. Это также ближе к использованию аппаратной кольцевой системы, но все еще не представляет точную концепцию процессов. Они всегда обрабатываются гостевыми ОС. Но в виртуальных машинах с аппаратным ускорением вы действительно можете увидеть нечто похожее на переключение контекста, например на хосте. Другие виды виртуальных машин всегда работают как программы уровня пользователя.

0

Переключение процессов внутри виртуальной машины происходит так же, как и на обычной машине. ОС просто меняет, над каким процессом она работает. Хост не знает или не заботится о том, что происходит внутри виртуальной машины - какая разница?

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .