вложенная виртуализация

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

Эта возможность доступна только гостевым секциям. Он должен быть включен для каждой виртуальной машины. Вложенная виртуализация не поддерживается в корневой секции Windows.

Для определения различных уровней вложенной виртуализации используется следующая терминология:

Срок Definition
Гипервизор L0 Гипервизор Hyper-V, работающий на физическом оборудовании.
Корневой каталог L1 Корневая операционная система Windows.
L1 Гостевой Виртуальная машина Hyper-V без вложенного гипервизора.
Гипервизор L1 Вложенный гипервизор, работающий в Hyper-V виртуальной машине.
Корневой каталог L2 Корневая операционная система Windows, работающая в контексте Hyper-V виртуальной машины.
Гость L2 Вложенная виртуальная машина, выполняющаяся в контексте Hyper-V виртуальной машины.

По сравнению с операционной системой гипервизоры могут нести значительную регрессию производительности при запуске на виртуальной машине. Гипервизоры L1 можно оптимизировать для запуска в Hyper-V виртуальной машине с помощью просвещенных интерфейсов, предоставляемых гипервизором L0.

Эта возможность в настоящее время поддерживается только в x64.

Просвещенные VMCS (Intel)

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

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

Гипервизор L1 может использовать просвещенные VMCS, написав 1 в соответствующее поле на странице поддержки виртуального процессора. Другое поле на странице поддержки VP управляет активной в настоящее время просвещенной VMCS. Каждая просвещенная виртуальная машина имеет размер ровно одной страницы (4 КБ) и должна быть изначально ноль. Инструкции VMPTRLD не должны выполняться, чтобы сделать в vmCS активной или текущей.

После того как гипервизор L1 выполняет запись виртуальной машины с просвещенной виртуальной машиной, виртуальная машина считается активной на процессоре. Включенная виртуальная машина может быть активна только на одном процессоре одновременно. Гипервизор L1 может выполнить инструкцию VMCLEAR для перехода просвещенного vmCS из активного в неактивное состояние. Любые инструкции VMREAD или VMWRITE во время активной виртуальной машины не поддерживаются и могут привести к непредвиденному поведению.

Структура HV_VMX_ENLIGHTENED_VMCS определяет макет просвещенной виртуальной машины. Все не искусственные поля сопоставляют с кодировкой Intel physical VMCS.

Очистка полей

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

Очистка полей контролируется с помощью искусственного поля "CleanFields" просвещенного VMCS. По умолчанию все биты задаются таким образом, что гипервизор L0 должен перезагрузить соответствующие поля VMCS для каждой вложенной записи виртуальной машины.

Обнаружение компонентов

Поддержка просвещенного интерфейса VMCS сообщается с 0x40000004 ЦПID.

Просвещенная структура VMCS имеет версию для учета будущих изменений. Каждая просвещенная структура VMCS содержит поле версии, которое сообщается гипервизором L0.

В настоящее время поддерживается только версия VMCS: 1.

Рекомендации по реализации гипервизора

Для большинства полей VMCS соответствующее просвещенное поле VMCS поддерживается для виртуальной машины, если поле VMCS поддерживается для виртуальной машины, как определено с помощью механизмов обнаружения функций архитектуры. Исключения передаются в конечных 0x4000000A ЦПID.

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

Гипервизор Hyper-V L0 не будет указывать на поддержку поля VMCS, для которого не определено поле vmCS или исключение. Если другому гипервизору L0 требуется новое поле виртуальной машины или исключение для определения, обратитесь в корпорацию Майкрософт.

Enlighened VMCB fields (AMD)

AMD имеет зарезервированное пространство в VMCB для использования гипервизора, а также связанный чистый бит. Зарезервированные байты находятся в разделе управления, смещение 0x3E0-3FF VMCB. Чистый бит равен 31 (чистый бит должен быть недействительным всякий раз, когда гипервизор изменяет область "просветления" VMCB).

Hyper-V использует зарезервированную область VMCB для настройки просвещения. Структура HV_SVM_ENLIGHTENED_VMCB_FIELDS документирует формат.

Просвещенное растровое изображение MSR

Гипервизор L0 эмулирует элементы управления MSR-Bitmap на платформах Intel и AMD, которые позволяют программному обеспечению виртуализации управлять доступом MSR.

Гипервизор L1 может взаимодействовать с гипервизором L0, чтобы сделать MSR более эффективным. Он может включить просвещенные растровые карты MSR, задав соответствующее поле в полях VMCS / VMCB значение 1. При включении гипервизор L0 не отслеживает растровые карты MSR для изменений. Вместо этого гипервизор L1 должен недействительным соответствующее поле очистки после внесения изменений в одно из растровых карт MSR.

Поддержка просвещенного растрового изображения MSR сообщается в 0x4000000A ЦПID.

Совместимость с динамической миграцией

Hyper-V имеет возможность динамического переноса дочерней секции с одного узла на другой узел. Динамические миграции обычно прозрачны для дочерней секции. Однако в случае вложенной виртуализации гипервизор L1 может иметь представление о миграции.

Уведомление о динамической миграции

Гипервизор L1 может запрашивать уведомление при переносе его секции. Эта возможность перечисляется в ЦПID как привилегия AccessReenlightenmentControls. Гипервизор L0 предоставляет искусственный msR (HV_X64_MSR_REENLIGHTENMENT_CONTROL), который может использоваться гипервизором L1 для настройки вектора прерываний и целевого процессора. Гипервизор L0 вводит прерывание с указанным вектором после каждой миграции.

#define HV_X64_MSR_REENLIGHTENMENT_CONTROL (0x40000106)

typedef union
{
    UINT64 AsUINT64;
    struct
    {
        UINT64 Vector :8;
        UINT64 RsvdZ1 :8;
        UINT64 Enabled :1;
        UINT64 RsvdZ2 :15;
        UINT64 TargetVp :32;
    };
} HV_REENLIGHTENMENT_CONTROL;

Указанный вектор должен соответствовать фиксированному прерыванию APIC. TargetVp задает индекс виртуального процессора.

Эмуляция TSC

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

Гипервизор L0 при необходимости эмулирует все доступы TSC после миграции до тех пор, пока гипервизор L1 не сможет перекомпилировать значение TscScale. Гипервизор L1 может отказаться от эмуляции TSC, написав HV_X64_MSR_TSC_EMULATION_CONTROL MSR. При желании гипервизор L0 эмулирует доступ TSC после миграции.

Гипервизор L1 может запрашивать, если доступ к TSC в настоящее время эмулируется с помощью HV_X64_MSR_TSC_EMULATION_STATUS MSR. Например, гипервизор L1 может подписаться на уведомления Live Migration и запрашивать состояние TSC после получения прерывания миграции. Она также может отключить эмуляцию TSC (после обновления значения TscScale) с помощью этого MSR.

#define HV_X64_MSR_TSC_EMULATION_CONTROL (0x40000107)
#define HV_X64_MSR_TSC_EMULATION_STATUS (0x40000108)

typedef union
{
    UINT64 AsUINT64;
    struct
    {
        UINT64 Enabled :1;
        UINT64 RsvdZ :63;
    };
 } HV_TSC_EMULATION_CONTROL;

typedef union
{
    UINT64 AsUINT64;
    struct
    {
        UINT64 InProgress : 1;
        UINT64 RsvdP1 : 63;
    };
} HV_TSC_EMULATION_STATUS;

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

Виртуальная подсистема балансировки нагрузки, предоставленная гипервизором, может быть расширена для кэширования переводов из 2 GPAs в GPA. Как и в случае с TLB на логическом процессоре, виртуальная подсистема балансировки нагрузки является несогласованным кэшем, и эта согласованность видна гостям. Гипервизор предоставляет операции для управления TLB.

Прямой виртуальный сброс

Гипервизор предоставляет гипермасштабирование (HvCallFlushVirtualAddressSpace, HvCallFlushVirtualAddressSpaceEx, HvCallFlushVirtualAddressList и HvCallFlushVirtualAddressListEx), которые позволяют операционным системам более эффективно управлять виртуальной подсистемой балансировки нагрузки. Гипервизор L1 может разрешить гостевой использовать эти гиперкалили и делегировать ответственность за их обработку гипервизору L0. Для этого требуется использование страницы поддержки секционирования (и виртуальной виртуальной виртуальной машины на платформах Intel).

При использовании виртуальная подсистема балансировки нагрузки теги всех кэшированных сопоставлений с идентификатором вложенного контекста (VMCS или VMCB), создавшего их. В ответ на прямой гиперклаг виртуальной очистки от гостя L2 гипервизор L0 недействителен для всех кэшированных сопоставлений, созданных вложенными контекстами, где

  • VmId совпадает с идентификатором виртуальной машины вызывающего объекта
  • Указанный VpId содержится в указанном обработчике или HV_FLUSH_ALL_PROCESSORS

Поддержка прямых виртуальных очистки сообщается в конечных 0x4000000A ЦПID.

Конфигурация

Прямая обработка гипермасштабирования виртуальных гипермасштабирования включена:

  1. Задание поля NestedEnlightenmentsControl.Features.DirectHypercall на странице поддержки виртуального процессора значение 1.
  2. Задание поля EnlightenmentsControl.NestedFlushVirtualHypercall для просвещенного vmCS или VMCB равным 1.

Прежде чем включить его, гипервизор L1 должен настроить следующие дополнительные поля просвещенных VMCS / VMCB:

  • VpId: идентификатор виртуального процессора, который управляет освещенными элементами управления VMCS или VMCB.
  • VmId: идентификатор виртуальной машины, к которой принадлежит просвещенная виртуальная машина или VMCB.
  • PartitionAssistPage: гостевой физический адрес страницы поддержки секции.

Гипервизор L1 также должен предоставлять следующие возможности своим гостям через CPUID.

  • UseHypercallForLocalFlush
  • UseHypercallForRemoteFlush

Страница "Помощь по секции"

Страница помощи секционирования — это выровненная область размера страницы памяти, которую гипервизор L1 должен выделить и ноль, прежде чем использовать гипермасштабирование прямого сброса. Его GPA должен быть записан в соответствующее поле в просвещенном vmCS /VMCB.

struct
{
    UINT32 TlbLockCount;
} VM_PARTITION_ASSIST_PAGE;

Искусственные VM-Exit

Если страница поддержки секционирования вызывающего объекта TlbLockCount не является нулевой, гипервизор L0 предоставляет VM-Exit с искусственной причиной выхода в гипервизор L1 после обработки прямого виртуального гиперкела.

На платформах Intel VM-Exit с причиной HV_VMX_SYNTHETIC_EXIT_REASON_TRAP_AFTER_FLUSH выхода поставляется. На платформах AMD VM-Exit с кодом HV_SVM_EXITCODE_ENL выхода доставляется, а для exitInfo1 задано значение HV_SVM_ENL_EXITCODE_TRAP_AFTER_FLUSH.

#define HV_VMX_SYNTHETIC_EXIT_REASON_TRAP_AFTER_FLUSH 0x10000031

#define HV_SVM_EXITCODE_ENL 0xF0000000
#define HV_SVM_ENL_EXITCODE_TRAP_AFTER_FLUSH   (1)

Перевод адресов второго уровня

Если вложенная виртуализация включена для гостевой секции, модуль управления памятью (MMU), предоставляемый секцией, включает поддержку перевода адресов второго уровня. Преобразование адресов второго уровня — это возможность, которая может использоваться гипервизором L1 для виртуализации физической памяти. При использовании некоторые адреса, которые будут рассматриваться как гостевые физические адреса (GPAs), обрабатываются как гостевые физические адреса (L2 GPAs) и переводятся в GPA путем обхода набора структур разбиения по страницам.

Гипервизор L1 может решить, как и где использовать адресные пространства второго уровня. Каждое адресное пространство второго уровня определяется гостевым значением 64-разрядного идентификатора. На платформах Intel это значение совпадает с указателем EPT. На платформах AMD значение равно полю NCR3 VMCB.

Compatibility

Возможности перевода адресов второго уровня, предоставляемые гипервизором, обычно совместимы с поддержкой VMX или SVM для преобразования адресов. Однако существуют следующие различия, доступные для гостевых наблюдений:

  • В внутренней среде гипервизор может использовать теневые таблицы страниц, которые переводят L2 GPAs в spAs. В таких реализациях эти таблицы теневой страницы отображаются программным обеспечением как большие TLB. Однако может наблюдаться несколько различий. Во-первых, таблицы теневой страницы можно совместно использовать между двумя виртуальными процессорами, в то время как традиционные TLB являются структурами каждого процессора и являются независимыми. Этот общий доступ может отображаться, так как доступ к страницам одним виртуальным процессором может заполнить запись таблицы теневой страницы, которая впоследствии используется другим виртуальным процессором.
  • Некоторые реализации гипервизора могут использовать внутреннюю защиту таблиц гостевой страницы для ленивого сброса сопоставлений MMU из внутренних структур данных (например, теневых таблиц страниц). Это невидимо для гостя, так как запись в эти таблицы будет обрабатываться прозрачно гипервизором. Однако записи, выполняемые на базовых страницах GPA другими секциями или устройствами, могут не активировать соответствующий сброс TLB.
  • В некоторых реализациях гипервизора ошибка страницы второго уровня может не привести к недопустимости кэширования сопоставлений.

Просвещенные на втором уровне очистки подсистемы балансировки нагрузки

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

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

Гиперколл Description
HvCallFlushGuestPhysicalAddressSpace отменяет кэшированные сопоставления GPA l2 с GPA в адресном пространстве второго уровня.
HvCallFlushGuestPhysicalAddressList отменяет кэшированные сопоставления GVA / L2 GPA с GPA в пределах части адресного пространства второго уровня.

На платформах AMD все записи TLB помечаются по архитектуре с идентификатором ASID (идентификатором адресного пространства). Недопустимое значение ASID приводит ко всем балансировкам нагрузки, связанным с ASID, недействительным. Вложенный гипервизор может при необходимости выбрать "просвещенный TLB", установив в HV_SVM_ENLIGHTENED_VMCB_FIELDS значение "1" в формате "1". Если вложенный гипервизор выбирает просветление, ASID недействительно удаляет все подсистемы балансировки нагрузки, производные от преобразования адресов первого уровня (т. е. виртуального адресного пространства). Для очистки записей TLB, производных от вложенной таблицы страницы (ДНЯО) и принудительного перестроения таблиц теневой страницы HvCallFlushGuestPhysicalAddressSpace или HvCallFlushGuestGuestPhysicalAddressList необходимо использовать.

Исключения вложенной виртуализации

На платформах Intel. Гипервизор L1 может использовать объединение исключений виртуализации в классе исключений сбоя страницы. Гипервизор L0 объявляет поддержку этого зажигания в листе ЦПID вложенных функций виртуализации гипервизора.

Это просвещение можно включить, задав VirtualizationException значение "1" в структуре данных HV_NESTED_ENLIGHTENMENTS_CONTROL на странице поддержки виртуального процессора.

Вложенные msr виртуализации

Вложенный регистр индекса VP

Гипервизор L1 предоставляет MSR, который сообщает базовый индекс VP текущего процессора.

АДРЕС MSR Имя регистрации Description
0x40001002 HV_X64_MSR_NESTED_VP_INDEX В вложенной корневой секции сообщает базовый индекс VP текущего процессора.

Вложенные synIC MSR

В вложенной корневой секции следующие MSR разрешают доступ к соответствующим регистрам SynIC базового гипервизора.

Чтобы найти индекс базового процессора, вызывающие должны сначала использовать HV_X64_MSR_NESTED_VP_INDEX.

АДРЕС MSR Имя регистрации Базовая MSR
0x40001080 HV_X64_MSR_NESTED_SCONTROL HV_X64_MSR_SCONTROL
0x40001081 HV_X64_MSR_NESTED_SVERSION HV_X64_MSR_SVERSION
0x40001082 HV_X64_MSR_NESTED_SIEFP HV_X64_MSR_SIEFP
0x40001083 HV_X64_MSR_NESTED_SIMP HV_X64_MSR_SIMP
0x40001084 HV_X64_MSR_NESTED_EOM HV_X64_MSR_EOM
0x40001090 HV_X64_MSR_NESTED_SINT0 HV_X64_MSR_SINT0
0x40001091 HV_X64_MSR_NESTED_SINT1 HV_X64_MSR_SINT1
0x40001092 HV_X64_MSR_NESTED_SINT2 HV_X64_MSR_SINT2
0x40001093 HV_X64_MSR_NESTED_SINT3 HV_X64_MSR_SINT3
0x40001094 HV_X64_MSR_NESTED_SINT4 HV_X64_MSR_SINT4
0x40001095 HV_X64_MSR_NESTED_SINT5 HV_X64_MSR_SINT5
0x40001096 HV_X64_MSR_NESTED_SINT6 HV_X64_MSR_SINT6
0x40001097 HV_X64_MSR_NESTED_SINT7 HV_X64_MSR_SINT7
0x40001098 HV_X64_MSR_NESTED_SINT8 HV_X64_MSR_SINT8
0x40001099 HV_X64_MSR_NESTED_SINT9 HV_X64_MSR_SINT9
0x4000109A HV_X64_MSR_NESTED_SINT10 HV_X64_MSR_SINT10
0x4000109B HV_X64_MSR_NESTED_SINT11 HV_X64_MSR_SINT11
0x4000109C HV_X64_MSR_NESTED_SINT12 HV_X64_MSR_SINT12
0x4000109D HV_X64_MSR_NESTED_SINT13 HV_X64_MSR_SINT13
0x4000109E HV_X64_MSR_NESTED_SINT14 HV_X64_MSR_SINT14
0x4000109F HV_X64_MSR_NESTED_SINT15 HV_X64_MSR_SINT15