Виртуализация памяти

До сих пор рассматривался вопрос о том, как виртуализировать центральный процессор. Но в компьютерной системе содержится не только процессор. Имеются также память и устройства ввода-вывода. Они также должны быть виртуализированы.
Давайте посмотрим, как это делается.

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

Предположим, к примеру, что виртуальная машина запущена и установленная на ней гостевая операционная система решила отобразить свои виртуальные страницы 7, 4 и 3 на физические страницы 10, 11 и 12 соответственно. Она строит таблицы страниц, в которых содержится это отображение, и загружает аппаратный регистр для указания на таблицу страниц верхнего уровня. Эта инструкция является служебной. На центральном процессоре с VT-технологией произойдет системное прерывание. С помощью динамической трансляции будет выдан вызов процедуры гипервизора. На паравир- туализированной операционной системе будет сгенерирован гипервызов. Чтобы не усложнять задачу, давайте предположим, что системное прерывание привело к передаче управления в гипервизор первого типа, но задача точно та же для всех трех вариантов.

Что теперь делает гипервизор? Одно из решений заключается в фактическом выделении физических страниц 10, 11 и 12 этой виртуальной машине и настройке текущей таблицы страниц на отображение виртуальных страниц 7, 4 и 3 виртуальной машины на их использование. Пока все в порядке.

Теперь предположим, что вторая виртуальная машина запускается, отображает свои виртуальные страницы 4, 5 и 6 на физические страницы 10, 11 и 12 и загружает регистр управления указателем на свою таблицу страниц. Гипервизор перехватывает системное прерывание, но что он должен делать? Он не может использовать это отображение, потому что физические страницы 10, 11 и 12 уже используются. Он может найти свободные страницы, скажем, 20, 21 и 22, и воспользоваться ими, но сначала должен создать новую таблицу страниц, отображающую виртуальные страницы 4, 5 и 6 виртуальной машины 2 на страницы 20, 21 и 22. Если будет запущена еще одна виртуальная машина, которая попытается использовать физические страницы 10, 11 и 12, придется создавать отображение и для них. В общем, для каждой виртуальной машины гипервизору нужно создавать теневую таблицу страниц (shadow page table), отображающую виртуальные страницы, используемые виртуальной машиной, на реальные страницы, предоставляемые гипервизором.

Хуже того, при каждом изменении гостевой операционной системой своих таблиц страниц гипервизор должен также вносить изменения в теневую таблицу страниц. Например, если гостевая операционная система заново отобразит виртуальную страницу 7 на то, что ей видится как физическая страница 200 (вместо страницы 10), гипервизор должен знать об этом изменении. Беда в том, что гостевая операционная система может вносить изменения в свои таблицы страниц просто путем записи в память. Служебные операции для этого не требуются, следовательно, гипервизор даже не знает об изменениях и, конечно же, не может обновить теневые таблицы страниц, используемые фактическим оборудованием.

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

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

Еще одно, также не очень изящное решение заключается в прямо противоположных действиях. В этом случае гипервизор просто позволяет гостевой операционной системе добавить новое отображение к ее таблицам страниц, как она того пожелает. Как только это происходит, в теневых таблицах страниц ничего не меняется. Фактически гипервизор даже ничего не знает об этом. Но как только гостевая операционная система пытается обратиться к любой из новых страниц, происходит ошибка отсутствия страницы и управление переходит к гипервизору. Он изучает таблицы страниц гостевой операционной системы с целью выявления отображения, которое ему следует добавить, и если таковое имеется, добавляет его и заново выполняет инструкцию, на которой произошел сбой. А что происходит, когда гостевая операционная система удаляет отображение из своих таблиц страниц? Понятно, что гипервизор не вправе ожидать возникновения ошибки отсутствия страницы, потому что ее не будет. Удаление отображения из таблицы страниц случается в виде инструкции INVLPG (которая в действительности предназначена для аннулирования TLB-записи). Следовательно, гипервизор перехватывает эту инструкцию и удаляет отображение и из теневой таблицы страниц. Это решение также не самое лучшее, но оно работает.

Обе технологии становятся причиной множества ошибок отсутствия страницы, а такие ошибки обходятся дорого. Обычно мы различаем «нормальные» ошибки отсутствия страницы, вызываемые гостевой программой, обращающейся к странице, выгруженной из оперативной памяти, и ошибки отсутствия страницы, связанные с обеспечением синхронизации теневых таблиц страниц и таблиц страниц гостевой операционной системы. Первые называются ошибками отсутствия страницы, вызванными гостевой операционной системой (guest-induced page faults), и поскольку они перехватываются гипервизором, то должны быть снова введены в гостевую операционную систему. А это все обходится недешево. Последние называются ошибками отсутствия страницы, вызванными гипервизором (hypervisor-induced page faults), и обрабатываются путем обновления теневых таблиц страниц.

Ошибки отсутствия страницы всегда дорого обходятся, но особенно явно это проявляется в виртуализированной среде, поскольку они приводят к так называемым выходам из виртуальной машины (VM exit), то есть к ситуации, в которой управление возвращается гипервизору. Рассмотрим, что нужно сделать центральному процессору для такого VM-выхода. Сначала он записывает причину VM-выхода, чтобы гипервизор знал, что делать. Он также записывает адрес гостевой инструкции, ставшей причиной выхода. Затем осуществляется переключение контекста, которое включает в себя сохранение всех регистров. Затем он загружает состояние процессора гипервизора. И только потом гипервизор может приступить к обработке ошибки отсутствия страницы, начало которой было таким дорогостоящим. И когда наконец-то все будет сделано, процессор должен выполнить все шаги в обратном порядке. Процесс может занять десятки тысяч или даже более тактов. Неудивительно, что специалисты стараются извернуться так, чтобы сократить количество выходов.

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

7.6.1.

<< | >>
Источник: Э. ТАНЕНБАУМ Х. БОС. СОВРЕМЕННЫЕ ОПЕРАЦИОННЫЕ СИСТЕМ Ы 4-е ИЗДАНИЕ. 2015

Еще по теме Виртуализация памяти:

  1. ПРЕДСТАВЛЕНИЕ ПАМЯТИ
  2. Гигиена памяти.
  3. укрепление памяти
  4. ТЕОРИЯ ПАМЯТИ
  5. V. 2. 5. Структура парциального хранилища памяти.
  6. Сила памяти
  7. В психологии различают четыре типа памяти.
  8. V. 2. МОДЕЛЬ ПАРЦИАЛЬНОГО ХРАНИЛИЩА ПАМЯТИ ЧЕЛОВЕКА
  9. следующие виды памяти
  10. Энерго-информационные ключи к памяти Атлантиды
  11. Роль памяти и воображения
  12. 9.2. БАРЬЕРЫ ПАМЯТИ
  13. 9.11. С ПОМОЩЬЮ ПАМЯТИ
  14. 4.7. МЕТОД ПОРТАТИВНОГО БАНКА ПАМЯТИ
  15. Игры на развитие памяти
  16. Правило учета изменения информации в процессе ее сохранения в памяти.
  17. Глава 9. КЛАДОВАЯ ПАМЯТИ
  18. Таинственные узоры Атлантиды – шифры великой памяти