Таблицы теневых страниц используются гипервизором для отслеживания состояния, в котором гость «думает», что его таблицы страниц должны быть.Гость не может получить доступ к аппаратным таблицам страниц, потому что тогда он, по сути, будет иметь контроль над машиной.Таким образом, гипервизор хранит «реальные» отображения (гостевой виртуальный -> физический хост) в аппаратном обеспечении при выполнении соответствующего гостя и сохраняет представление таблиц страниц, которые, по мнению гостя, он использует «в тени» или припо крайней мере, так мне нравится думать об этом.
Обратите внимание, что это позволяет избежать шага перевода GVA-> GPA.
Что касается ошибок страниц, ничего не меняется с точки зрения оборудования (помните, гипервизор делает так, чтобы таблицы страниц, используемые оборудованием, содержали отображения GVA-> HPA),ошибка страницы просто сгенерирует исключение и перенаправит на соответствующий обработчик исключений.Однако, когда происходит сбой страницы во время работы виртуальной машины, это исключение может быть «перенаправлено» гипервизору, который затем может обработать его соответствующим образом.
Гипервизор должен создавать эти таблицы теневых страниц при просмотре страницы.неисправности, вызванные гостем.Когда гость записывает сопоставление в одну из своих таблиц страниц, гипервизор сразу не узнает, поэтому таблицы теневых страниц не будут мгновенно «синхронизированы» с намерениями гостя.Таким образом, гипервизор будет создавать таблицы теневых страниц, например, следующим образом:
- Гость записывает отображение для VA
0xdeadbeef
в свои таблицы страниц (место в памяти), но помните,это отображение не используется аппаратными средствами. - Гостевые доступы
0xdeadbeef
, что приводит к сбою страницы, поскольку таблицы реальных страниц не были обновлены для добавления отображения - Сбой страницыотправляется на гипервизор
- Гипервизор просматривает таблицы гостевых страниц и замечает, что они отличаются от таблиц теневых страниц, говорит: «Эй, я еще не создал реальное отображение для
0xdeadbeef
» - Таким образом, он обновляет свои таблицы теневых страниц и создает соответствующее
0xdeadbeef
-> отображение HPA для используемого оборудования.
Предыдущий случай называется сбой теневой страницы , посколькуэто вызвано исключительно внедрением виртуализации памяти.Таким образом, обработка ошибки страницы остановится на гипервизоре, и гостевая ОС не будет даже знать, что это произошло.Обратите внимание, что гость может также генерировать подлинные сбои страниц из-за отображений, которые он еще не пытался создать, и гипервизор перенаправит их обратно в гость.Также следует понимать, что весь этот процесс подразумевает, что каждый сбой страницы , возникающий во время выполнения гостя, должен вызывать выход в VMM, чтобы таблицы теневых страниц могли быть обновлены.Это дорого, и одна из причин, почему была введена аппаратная поддержка для виртуализации памяти.( здесь - это краткое введение во вложенные или расширенные таблицы страниц)
Хорошая ссылка на это эта книга