Что именно делают таблицы теневых страниц (для VMMs)?

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

ie.

вместо:

гостевая ОС - > VMM + виртуальная физическая память - > хост-ОС - > хост-оборудование

просто:

гостевая ОС - > VMM - > хост-ОС - > хост-оборудование

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

2 ответов


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

обратите внимание, что это позволяет избежать шага перевода GVA - >GPA.

что касается ошибок страницы, ничего не меняется от оборудования!--10--> точка зрения (помните, гипервизор делает так, что таблицы страниц, используемые оборудованием, содержат сопоставления GVA->HPA), ошибка страницы просто генерирует исключение и перенаправляет на соответствующий обработчик исключений. Однако при возникновении ошибки страницы во время работы виртуальной машины это исключение может быть "перенаправлен" на гипервизор, который затем может обрабатывать его соответствующим образом.

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

  • гость пишет отображение для VA 0xdeadbeef в это таблицы страниц (местоположение в памяти), но помните, что это сопоставление не используется оборудованием.
  • гостевые доступы 0xdeadbeef, что вызывает ошибку страницы, потому что реальные таблицы страниц не были обновлены, чтобы добавить отображение
  • ошибка страницы передается гипервизору
  • гипервизор смотрит на таблицы гостевых страниц и замечает, что они отличаются от таблиц теневых страниц, говорит: "Эй, я не создал реальное отображение для 0xdeadbeef но"
  • таким образом, он обновляет свои таблицы теневых страниц и создает соответствующий 0xdeadbeef->отображение HPA для используемого оборудования.

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

хорошей ссылкой для этого является книги


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

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

ссылки: