HYPERVISORS: специфическое отсутствие функциональности в разных технологиях виртуализации

Работая с виртуальными расширениями Intel VMX и ARM, я заметил отсутствие функциональности, которая была бы очень полезна при реализации гипервизоров.

В рамках работы гипервизора часто необходимо перехватить поведение гостя, но только для целей трассировки (то есть, команда может обычно выполняться гостем, но сначала нам нужно что-то сделать - например, ведение журнала).

Чтобы быть более точным, возьмите следующий пример: на гипервизоре Intel, который я реализовал некоторое время назад (с Windows 7 в качестве гостя), мне нужно было регистрироваться всякий раз, когда изменяется структура ядра Windows. Для этого я узнал физический адрес структуры ядра и удалил разрешение на запись гостя для соответствующей страницы EPT. Таким образом, всякий раз, когда гость пытался написать (изменить) структуру, произойдет нарушение EPT, что приведет к ловушке гипервизора.

После каждого такого нарушения EPT я бы использовал одну из следующих стратегий:

Стратегия 1:

  • Активируйте монитор-ловушку-флаг
  • Временно предоставьте гостю разрешения на запись региона (модификация EPT)
  • VMRESUME => гость выполнит инструкцию и VMEXIT сразу после, из-за активации MTF
  • на следующем VMEXIT я бы деактивировал MTF и снова запретил бы гостю записать структуру (= модификация EPT + аннулирование) и VMRESUME еще раз

Стратегия 2:

  • Подражайте инструкции, которая хочет написать структуру. Это подразумевало написание эмулятора (> дизассемблера).

Как вы можете видеть, обе эти стратегии немного сложны даже без учета многопроцессорности. Что касается стратегии 1, если бы Windows должна была быть виртуализирована на нескольких процессорах, нам также пришлось бы отправлять IPI другим ядрам, чтобы приостановить их, пока мы обрабатываем нарушение EPT. Плюс, это конкретный пример, который подразумевает конкретную стратегию. Другим примером трассировки может быть, например, регистрация и / или изменение параметров функции ядра всякий раз, когда она вызывается. В этом случае нам может понадобиться другая стратегия.

Я думаю, пришло время перейти к сути. Моя дилемма заключается в следующем. Простой способ избежать сложных стратегий программирования всякий раз, когда нам нужно отследить поведение гостя , состоял бы в том, чтобы технологии виртуализации предлагали возможность динамически выбирать, происходит ли прерывание инструкций до ИЛИ ПОСЛЕ их выполнения.

Еще до написания моего первого гипервизора (на Intel) я был почти уверен, что VMX предложит мне такую ​​функциональность. Мое мышление подсказало мне, что это будет очевидной функцией, предлагаемой любой технологией виртуализации на любой платформе, поэтому я был удивлен (и немного расстроен), когда обнаружил, что на самом деле это не так: не на Intel, не на ARM (как я недавно обнаружил) и, скорее всего, не на других платформах. Таким образом, мой вопрос на самом деле: почему? Почему "дизайнеры" виртуализации оборудования не реализуют такую ​​функциональность? Я уверен, что об этом уже думали, поэтому единственный возможный ответ для меня, по-видимому, заключается в том, что аппаратная реализация такой функциональности будет очень трудной или даже невозможной, хотя я не понимаю, почему это так. Это тот случай?

Заранее спасибо за ваши ответы:)

РЕДАКТИРОВАТЬ

Хотя я не дал ясного объяснения, я также хотел бы указать на тот факт, что существуют десятки случаев, когда программист хочет уловить некоторое поведение гостя с намерением изменить его эффект (таким образом, подразумевая больше, чем отслеживание), но в который этот вид функциональности все равно будет очень полезным.

Возьмите для примера следующий пример. Допустим, я хочу, чтобы мой гипервизор управлял связью гостя с устройством с отображенной памятью (или даже полностью имитировал одно - очень распространенное требование для современных гипервизоров). В большинстве случаев мы будем сообщать гостю, что устройство сопоставлено с памятью по адресу A, и перехватывает запись / чтение на этот адрес. Когда захваченная инструкция пытается переместить область по адресу A, в настоящее время мы вынуждены ее дизассемблировать и эмулировать. Если бы гипервизор предоставил нам возможность разрешить выполнение инструкции с временным разрешением чтения и записи и сразу же перехватить ее, эмуляция инструкции стала бы ненужной, поскольку мы могли бы позволить ей выполнить и "добавить" желаемый эффект впоследствии.

1 ответ

Вы можете попасть в ловушку только перед инструкцией, потому что это то, что обеспечивает оборудование. Теоретически, виртуальная машина может реагировать на вашу ловушку в гипервизоре и фактически что-то с этим делать (изменять любые связанные с памятью аргументы за вашей спиной), поэтому альтернатива не очень полезна.

Извини, мужик, так оно и есть.

Другие вопросы по тегам