Как KVM / QEMU и гостевая ОС обрабатывают сбой страницы - PullRequest
1 голос
/ 15 марта 2020

Например, у меня есть хост-ОС (скажем, Ubuntu) с включенным KVM. Я запускаю виртуальную машину с QEMU для запуска гостевой ОС (скажем, CentOS). Говорят, что для хост-ОС эта виртуальная машина является просто процессом. Таким образом, с точки зрения хоста, он обрабатывает сбои страниц как обычно (например, выделяет фрейм страницы по мере необходимости, при необходимости меняет страницы на основе активных / неактивных списков).

Вот вопрос и мое понимание. В гостевой ОС, поскольку она все еще является полноценной ОС, я предполагаю, что в ней все еще есть все механизмы, обрабатывающие виртуальную память. Он видит некоторую виртуализированную физическую память, предоставленную QEMU. Под виртуализированной физической памятью я подразумеваю, что гостевая ОС не знает, что она находится в виртуальной машине, и все еще работает, как на реальной физической машине, но то, что она имеет, действительно является абстракцией, данной QEMU. Таким образом, даже если ей выделен фрейм страницы, если он отсутствует в таблице страниц гостя, гостевая ОС все равно вызовет сбой страницы, а затем отобразит некоторую страницу во фрейме. Что еще хуже, может быть двухстраничный сбой, когда гость сначала выделяет несколько фреймов страницы при сбое страницы, что вызывает сбой страницы в хост-ОС.

Однако я также слышал что-то вроде мелкой (или теневой) страницы таблица, которая, кажется, могла бы оптимизировать эту ненужную ошибку двойной страницы и проблему таблицы двойной страницы. Я также рассмотрел некоторые другие реализации ядра, в частности уникальные ядра, например, OSv , IncludeOS , et c. Я не нашел ничего связанного с ошибкой страницы и механизмами таблицы страниц. Я видел некоторые символы, такие как page_fault_handler, но не такие огромные, как в коде ядра Linux. Кажется, в этих реализациях unikernel управление памятью не имеет большого значения. Поэтому я предполагаю, что QEMU / KVM и некоторые технологии Intel для виртуализации уже справились с этим.

Какие-нибудь идеи в этой теме c? Или, если у вас есть хорошие ссылки / документы / ресурсы по этой проблеме, или некоторые советы будут очень полезны.

1 Ответ

3 голосов
/ 15 марта 2020

Существует два способа поддержки гостевой физической памяти в QEMU / KVM: EPT и таблицы теневых страниц. (EPT - это определенный Intel механизм. Другие процессоры поддерживают нечто подобное, о котором я не буду здесь говорить.)

EPT означает расширенные таблицы страниц. Это второй уровень подкачки, поддерживаемый ЦП в дополнение к обычным таблицам страниц процессора. При работе в ВМ обычные таблицы страниц используются для преобразования гостевых виртуальных адресов в гостевые физические адреса, а таблицы EPT используются для перевода гостевых физических адресов в физические адреса хоста. Этот двухуровневый перевод выполняется для каждого доступа к памяти в гостевой системе. (TLB процессора скрывают большую часть стоимости.) Таблицы EPT управляются VMM, а таблицы обычных страниц - гостем. Если страница отсутствует в таблицах гостевой страницы, это вызывает сбой страницы в гостевой системе, точно так же, как вы описали. Если страница присутствует в таблицах гостевой страницы, но отсутствует в EPT, это вызывает выход виртуальной машины с нарушением EPT, поэтому VMM может обработать отсутствующую страницу.

Таблицы теневых страниц используются, когда EPT недоступен. , Таблицы теневых страниц - это копии таблиц гостевых страниц, которые включают в себя сопоставления GVA-GPA и GPA-HPA в одном наборе таблиц страниц. Когда происходит сбой страницы, это всегда вызывает выход виртуальной машины. VMM проверяет, отображается ли отсутствующая страница в таблицах гостевой страницы. Если это не так, то VMM вставляет ошибку страницы в гостевую систему для обработки. Если страница отображается в таблицах гостевой страницы, то VMM обрабатывает ошибку так же, как и в случае нарушения EPT. Эффективное управление таблицами теневых страниц в нескольких процессах в гостевой системе может быть очень сложным.

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

...