Хотя это не отвечает на вопрос, это связано с удалением проверок ограничения сегмента в 64-битном режиме, что, предположительно, делает защиту обработчиков прерываний гипервизора «невозможной» без аппаратной виртуализации, что является обсуждением, которое люди могут ожидать, увидев этот заголовок вопроса. "нарушение некоторых существующих реализаций" я согласен, но не "невозможно".
Первоначальная версия x86-64 (AMD64) не допускала программной полной виртуализации из-за отсутствия поддержки сегментации в длинном режиме, что делало невозможной защиту памяти гипервизора, в частности, защиту обработчика ловушек. который выполняется в адресном пространстве гостевого ядра.
Я вижу это повсюду, но я не уверен. Для защиты обработчиков прерываний гипервизора или IDT сегментация не требуется. Вы можете сделать это с помощью подкачки.
Сделайте так, чтобы определенный диапазон виртуальных адресов в SPT всегда отображал обработчики прерываний гипервизора и IDT по виртуальному адресу, по которому он находится на хосте. Для IDT требуется 1 страница 4 КиБ. Эти страницы в SPT сделаны супервизорами, то есть гостевое ядро в кольце 1 не может писать на них, потому что это вызовет ловушку прямо в IDT, которая отображается на гостевую. Теперь позвоните 0, код может быть выполнен. Когда гость выполняет чтение / запись в эти зарезервированные диапазоны виртуальных адресов, он не должен знать, что они зарезервированы, то есть драйвер гипервизора молча перенаправляет доступ с определенными CR3 на чистую страницу. Чтение / запись из гостевого ядра кольца 1 вызовет GPF, а CR2 будет содержать адрес, на который была предпринята попытка записи. Обычно происходит ошибка страницы, а затем отправляется RIP с инструкцией на повторную попытку, но в данном случае он не может этого сделать. Ему необходимо декодировать и выполнить чтение / запись в RIP в кадре прерывания на новую физическую страницу хоста, преобразовав ее с помощью специальной внутренней таблицы исключительно для тех зарезервированных областей, созданных, когда гость изменяет PTE, а затем увеличить RIP .
person
Lewis Kelsey
schedule
29.04.2020