Используют ли VMM виртуальную память на хостах?

Я пытаюсь понять, как в прошлом выполнялась виртуализация с использованием таблиц теневых страниц. В статьях я читал все разговоры о переводе гостевой виртуальной памяти в хост-физическую. Объем памяти. Я понимаю, как таблицы теневых страниц устраняют необходимость в гостевом виртуальном переводе в гостевой физический. Мой вопрос в том, что случилось с шагом Host Virtual to Host Physical. (HVA --> HPA).

Диспетчеры виртуальных машин в цитируемых статьях вообще не используют виртуальную память на хосте? Предполагается ли, что они имеют прямой доступ к физической памяти хост-системы? Это вообще возможно? Я думал, что преобразование кеша TLB реализовано аппаратно MMU, и адреса каждой инструкции преобразуются из виртуальных в физические самим MMU. Но опять же, я не уверен, как код ядра работает с TLB? Инструкции ядра не проходят через TLB?


person Phani    schedule 05.02.2013    source источник


Ответы (2)


Я не уверен, правильно ли я понял вашу точку зрения, я изо всех сил стараюсь ответить на ваш вопрос.

Нет необходимости в HVA->HPA, потому что гостю нужен HPA вместо HVA. Это означает, что HVA бесполезен для гостя, обращающегося к его гостевой области памяти.

Таким образом, ожидаемый поток передачи может быть без учета таблицы теневых страниц:

GVA -> GPA -> HVA -> HPA

Но поскольку большинство гипервизоров работают в режиме ядра, кто знает, как распределяется память хоста и гостя, поэтому он может напрямую сопоставлять GPA с HPA и устранять необходимость в HVA:

GVA -> GPA -> HPA

Этот поток трансляции гостевой памяти не имеет ничего общего с пользовательским пространством гипервизора, поток которого HVA -> HPA.

Не уверен, что выше отвечает на ваш вопрос.

person Wayne    schedule 04.09.2013

Ответ может быть да или нет. Если да, гипервизор сопоставляет гостевую оперативную память с виртуальной памятью на хосте, поэтому хост может менять ее между оперативной памятью хоста и обратно. Если нет, гипервизор сопоставляет гостевую оперативную память с заблокированной физической памятью на хосте.

VirtualBox находится в группе нет. VirtualBox запускает драйвер устройства в ядре хоста и использует этот драйвер для выделения заблокированной памяти для гостевой оперативной памяти. Каждая страница гостевой оперативной памяти остается резидентной по фиксированному физическому адресу хоста, поэтому хост никогда не может выгрузить страницу. Из-за этого гостевая оперативная память должна быть меньше оперативной памяти хоста. В руководстве VirtualBox указано освободить от 256 МБ до 512 МБ для хоста. .

MMU может сопоставлять виртуальные адреса только с физическими адресами. В VirtualBox у гостя есть эмулированный MMU для сопоставления гостевых виртуальных адресов с гостевыми физическими адресами. VirtualBox имеет собственную карту гостевых физических адресов для физических адресов хоста и использует хост MMU для сопоставления гостевых виртуальных адресов с физическими адресами хоста. Из-за заблокированной памяти физические адреса узлов никогда не становятся недействительными.

Mac-на -Linux находится в группе да. Однажды я использовал его для запуска гостевой Mac OS 9 внутри хоста PowerPC Linux. Я выделил 256 МБ ОЗУ для Mac OS 9, но на моей реальной машине с Linux было только 64 МБ ОЗУ. Это сработало, потому что MOL сопоставляет гостевую оперативную память с виртуальной памятью хоста с помощью обычный mmap() вызов в пользовательском процессе. Затем MOL использует модуль ядра Linux для управления MMU хоста.

Но хост-MMU может отображать только физические адреса хоста, а не виртуальные. У гостя есть эмулированный MMU, который сопоставляет виртуальный гостевой компьютер с физическим гостевым. MOL добавляет базовый адрес для перевода физического гостевого компьютера в виртуальный хост. Модуль ядра MOL использует карту хоста для преобразования виртуального хоста в физический хост, а затем использует MMU хоста для сопоставления виртуального хоста с физическим хостом.

Если Linux выгрузит страницу гостевой оперативной памяти, то физический адрес хоста станет недействительным, и гостевая система может перезаписать чужую память и привести к сбою хоста. Должен быть какой-то способ уведомить MOL о том, что Linux заменил страницу. MOL решила эту проблему с помощью исправление внутренней функции ядра Linux с именем flush_map_page или flush_map_pages.

KVM также находится в группе да. Linux добавил функцию ядра под названием уведомления об управлении памятью для поддержки KVM. Когда QEMU использует KVM для виртуализации, он выделяет гостевую оперативную память в виртуальной памяти хоста. Уведомитель MMU сообщает KVM, когда хост выгружает страницу.

person George Koehler    schedule 09.09.2015