Виртуальная MMU

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

Реализация виртуальной MMU зависит от архитектуры. В этом документе рассматриваются как платформы x64, так и ARM64 с четко помеченными разделами, зависящими от платформы.

Обзор виртуальной MMU

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

Compatibility

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

На платформах x64

Виртуальная MMU на платформах x64 обычно совместима с физическим MMU, найденным в процессоре x64. Существуют следующие различия, наблюдаемые гостем:

  • The CR3. PWT и CR3. Биты PCD могут не поддерживаться в некоторых реализациях гипервизора. В таких реализациях любая попытка гостя задать эти флаги с помощью инструкции MOV в CR3 или переключатель шлюза задач будет игнорироваться. Попытки программного задания этих битов с помощью HvSetVpRegisters или HvCallSwitchVirtualAddressSpace могут привести к ошибке.
  • Биты PWT и PCD в записи конечной таблицы (например, PTE для 4-K страниц и PDE для больших страниц) указывают возможность кэширования сопоставленной страницы. Биты PAT, PWT и PCD в записях таблицы неконечной страницы указывают на кэшируемость следующей таблицы страницы в иерархии. Некоторые реализации гипервизора могут не поддерживать эти флаги. В таких реализациях все доступы к таблицам страниц, выполняемым гипервизором, выполняются с помощью атрибутов кэша обратной записи. Это влияет, в частности, на доступ и грязные биты, записанные в записи таблицы страницы. Если гость задает биты PAT, PWT или PCD в неконечных записях таблицы страницы, сообщение "неподдерживаемая функция" может быть создано, когда виртуальный процессор обращается к странице, сопоставленной этой таблицей страницы.
  • Бит CR0.CD (отключение кэша) может не поддерживаться в некоторых реализациях гипервизора. В таких реализациях CR0.CD бит должен иметь значение 0. Любая попытка гостевого задания этого флага с помощью инструкции MOV в CR0 будет игнорироваться. Попытки программного задания этого бита через HvSetVpRegisters приведет к ошибке.
  • MSR (тип адреса страницы) — это регистр каждого VP. Тем не менее, когда все виртуальные процессоры в секции задают для ПАТ MSR одно и то же значение, новый эффект становится эффектом на уровне секций.
  • По соображениям безопасности и изоляции инструкция INVD будет виртуализирована, чтобы действовать как инструкция WBINVD с некоторыми различиями. В целях безопасности вместо этого следует использовать CLFLUSH.

Устаревшие операции управления балансировкой нагрузки

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

На платформах x64

Архитектура x64 предоставляет следующие механизмы управления TLB:

  • Инструкция INVLPG запрещает перевод одной страницы из TLB процессора. Если указанный виртуальный адрес изначально сопоставлен с 4-K-страницей, перевод этой страницы удаляется из TLB. Если указанный виртуальный адрес изначально сопоставлен как "большая страница" (2 МБ или 4 МБ в зависимости от режима MMU), перевод всей большой страницы удаляется из TLB. Инструкция INVLPG очищает как глобальные, так и не глобальные переводы. Глобальные переводы определяются как те, которые имеют "глобальный" битовый набор в записи таблицы страницы.
  • MOV to CR3 инструкции и параметры задач, которые изменяют переводы CR3 недействительными для всех не глобальных страниц в TLB обработчика.
  • Инструкция MOV to CR4, которая изменяет CR4. Бит PGE (глобальное включение страницы) — CR4. Бит PSE (расширения размера страницы) или CR4. PaE (расширения адресов страницы) делает недействительными все переводы (глобальные и не глобальные) в подсистеме балансировки нагрузки процессора.

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

На платформах ARM64

Архитектура ARM64 предоставляет механизмы управления балансировкой нагрузки с помощью инструкций TLBI (TLB Invalidate). Дополнительные сведения см. в руководстве по архитектуре ARM.

Примечание: Инструкции по обслуживанию кэша set/way (например, DC ISW, DC CSW, DC CISW) не поддерживаются в виртуализированных средах и обрабатываются как no-ops.

Усовершенствования виртуальной подсистемы балансировки нагрузки

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

Гипервизор поддерживает следующие гипермасштабирование для недопустимых TLB:

Гиперколл Description
HvCallFlushVirtualAddressSpace Отменяет все записи виртуальной подсистемы балансировки нагрузки, принадлежащие указанному адресного пространства.
HvCallFlushVirtualAddressSpaceEx Аналогично HvCallFlushVirtualAddressSpace, принимает разреженный набор VP в качестве входных данных.
HvCallFlushVirtualAddressList Отменяет часть указанного адресного пространства.
HvCallFlushVirtualAddressListEx Аналогично HvCallFlushVirtualAddressList, принимает разреженный набор VP в качестве входных данных.

В некоторых системах (с достаточной поддержкой виртуализации в оборудовании) устаревшие инструкции по управлению балансировкой нагрузки могут быть быстрее для локальной или удаленной (кросспроцессорной) недопустимой балансировки нагрузки. Гости, которые заинтересованы в оптимальной производительности, должны использовать конечные 0x40000004 ЦПID, чтобы определить, какие поведения следует реализовать с помощью гипермасштабирования:

  • UseHypercallForAddressSpaceSwitch: Если этот флаг задан, вызывающий объект должен предположить, что быстрее использовать HvCallSwitchVirtualAddressSpace для переключения между адресными пространствами. Если этот флаг понятен, рекомендуется использовать инструкцию MOV to CR3.
  • UseHypercallForLocalFlush: если этот флаг задан, вызывающий объект должен предположить, что быстрее использовать гипермасштабирование (в отличие от INVLPG или MOV to CR3), чтобы очистить одну или несколько страниц из виртуальной подсистемы балансировки нагрузки.
  • UseHypercallForRemoteFlushAndLocalFlushEntire: если этот флаг задан, вызывающий объект должен предположить, что быстрее использовать гипермасштабирование (в отличие от использования прерываний между обработчиками) для очистки одного или нескольких страниц из виртуальной подсистемы балансировки нагрузки.

На платформах ARM64 гости обычно должны использовать архитектурные механизмы для управления балансировкой нагрузки.

Общие сведения об элементе управления кэшем памяти

Гипервизор поддерживает параметры кэшируемости, определяемые гостем, для страниц, сопоставленных в пространстве GVA гостя. Подробное описание доступных параметров кэширования и их значений см. в документации Intel или AMD.

Когда виртуальный процессор обращается к странице через пространство GVA, гипервизор учитывает биты атрибутов кэша (PAT, PWT и PCD) в записи таблицы гостевой страницы, используемой для сопоставления страницы. Эти три бита используются в качестве индекса в регистре PAT раздела (тип адреса страницы) для поиска окончательного параметра кэширования страницы.

Страницы, доступ к которым осуществляется непосредственно через пространство GPA (например, при отключении разбиения по страницам, так как CR0.PG очищается) используйте кэшируемость, определяемую MTRR. Если реализация гипервизора не поддерживает виртуальные MTRR, предполагается кэширование WB.

Сочетание типов кэша между секцией и гипервизором

Гости должны знать, что некоторые страницы в пространстве GPA могут получить доступ к гипервизору. В следующем списке, хотя и не исчерпывающим, приведены несколько примеров:

  • Страницы, содержащие входные или выходные параметры для гипермасштабирования
  • Все страницы наложения, включая страницу гиперкалли, страницы SynIC SIEF и SIM-карты, а также страницы статистики
  • Страницы поддержки VP и другие страницы интерфейса гипервизора

Гипервизор всегда выполняет доступ к параметрам гиперкаллов и страницам наложения с помощью Write-Back кэшируемых атрибутов:

  • На платформах x64: тип кэша WB (Write-Back) через PAT
  • На платформах ARM64: обычная память с внутренней и внешней записью, чтением и выделением, Write-Allocate атрибутами

Гипервизор всегда выполняет доступ к параметрам гиперкаллов и страницам наложения с помощью параметра кэширования WB.