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

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

Обнаружение компонентов и интерфейсов (x64)

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

  • Инструкция CPUID — используется для статических функций и сведений о версии.
  • MSR (регистры для конкретной модели) — используется для значений состояния и элементов управления.
  • Регистры, сопоставленные с памятью, используются для значений состояния и управления.
  • Прерывания процессора— используется для асинхронных событий, уведомлений и сообщений.

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

Обнаружение гипервизора

Прежде чем использовать интерфейсы гипервизора, программное обеспечение должно сначала определить, работает ли он в виртуализированной среде. На платформах x64, соответствующих этой спецификации, это делается путем выполнения инструкции CPUID со значением входных данных (EAX) 1. При выполнении код должен проверить 31 бит регистра ECX ("гипервизор присутствует"). Если этот бит задан, гипервизор присутствует. В неиртуализированной среде бит будет ясно.

CPUID.01h.ECX:31 // if set, virtualization present

Если задана функция гипервизора, дополнительные конечные листы ЦПП можно запросить дополнительные сведения о соответствующем гипервизоре и его возможностях. Два таких отпуска гарантированно будут доступны: 0x40000000 и 0x40000001. Последующие нумерованные листья также могут быть доступны.

Стандартные листья ЦПП ЦП

При запросе конечного элемента 0x40000000 гипервизор возвращает сведения, предоставляющие максимальный номер конечного номера ЦПП ЦП И Сигнатуру поставщика.

Register Предоставленная информация
EAX Максимальное входное значение для сведений О ЦП ЦП гипервизора
EBX Подпись идентификатора поставщика гипервизора
ECX Подпись идентификатора поставщика гипервизора
EDX Подпись идентификатора поставщика гипервизора

Если конечный объект 0x40000001 запрашивается, он вернет значение, представляющее идентификацию интерфейса гипервизора, нейтрального от поставщика. Это определяет семантику листьев.0x40000020x400000FF

Register Предоставленная информация
EAX Подпись интерфейса гипервизора.
EBX Зарезервировано
ECX Зарезервировано
EDX Зарезервировано

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

Выходы ЦПД гипервизора Майкрософт

На гипервизорах, соответствующих интерфейсу ЦП ЦП Майкрософт, 0x40000000 регистры и 0x40000001 конечные регистры будут иметь следующие значения.

Конечный диапазон ЦПП ЦПП - 0x40000000

EAX определяет максимальный конечный лист ЦП. EBX-EDX содержит подпись идентификатора поставщика гипервизора. Подпись идентификатора поставщика должна использоваться только для создания отчетов и диагностики.

Register Предоставленная информация
EAX Максимальное входное значение для сведений О ЦПП гипервизора. В гипервизорах Майкрософт это будет по крайней мере 0x40000005.
EBX 0x7263694D — "Micr"
ECX 0x666F736F —"osof"
EDX 0x76482074 — "t Hv"

Идентификация нейтрализуемого поставщика гипервизора — 0x40000001

EAX содержит подпись идентификации интерфейса гипервизора. Это определяет семантику листьев.0x400000020x400000FF

Register Предоставленная информация
EAX 0x31237648— "Hv#1"
EBX Зарезервировано
ECX Зарезервировано
EDX Зарезервировано

Гипервизоры, соответствующие интерфейсу Hv#1, также предоставляют по крайней мере следующие листья.

Удостоверение системы гипервизора — 0x40000002

Register Биты Предоставленная информация
EAX Номер сборки
EBX 31-16 Основная версия
15-0 Малая версия

Идентификация компонентов гипервизора — 0x40000003

EAX и EBX указывают, какие функции доступны секции на основе текущих привилегий секции.

Register Биты Предоставленная информация
EAX Соответствует битам 31-0 HV_PARTITION_PRIVILEGE_MASK
EBX Соответствует битам 63-32 HV_PARTITION_PRIVILEGE_MASK
ECX 4-0 Зарезервировано
5 Invariant Mperf доступен
6 Стек тени руководителя доступен
7 Доступны архитектурные PMU
8 Перехват перехвата исключений доступен
31-9 Зарезервировано
EDX 0 Не рекомендуется (ранее указывалось на доступность инструкции MWAIT)
1 Поддержка гостевой отладки доступна
2 Поддержка монитора производительности доступна
3 Доступна поддержка событий динамического секционирования физических ЦП
4 Доступна поддержка передачи блока входных параметров hypercall через регистры XMM
5 Доступна поддержка состояния простоя виртуального гостя
6 Поддержка состояния спящего режима гипервизора доступна
7 Доступна поддержка запросов к расстояниям NUMA
8 Доступна поддержка определения частот таймера
9 Доступна поддержка внедрения проверок искусственных машин
10 Доступна поддержка гостевых msR
11 Доступна поддержка отладки MSR
12 Доступна поддержка NPIEP
13 DisableHypervisorAvailable
14 ExtendedGvaRangesForFlushVirtualAddressListAvailable
15 Доступна поддержка возврата выходных данных гиперкела через регистры XMM
16 Зарезервировано
17 SintPollingModeAvailable
18 HypercallMsrLockAvailable
19 Использование прямых искусственных таймеров
20 Поддержка регистрации PAT, доступной для VSM
двадцать один Поддержка регистрации bndcfgs, доступной для VSM
двадцать два Зарезервировано
23 Поддержка несанкционированного таймера с искусственным временем
25-24 Зарезервировано
26 Поддерживается функция последней записи ветви (LBR) Intel
31-27 Зарезервировано

Рекомендации по реализации — 0x40000004

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

Register Биты Предоставленная информация
EAX 0 Рекомендуется использовать гиперколл для коммутаторов адресного пространства, а не инструкции MOV на CR3.
1 Рекомендуется использовать гиперколл для локальных сбросов TLB, а не инструкций INVLPG или MOV в CR3.
2 Рекомендуется использовать гиперколл для удаленных сбросов TLB, а не межпроцессорных прерываний.
3 Рекомендуется использовать MSR для доступа к APIC регистров EOI, ICR и TPR, а не для сопоставленных с памятью коллег.
4 Рекомендуется использовать msR с гипервизором для запуска системного сброса.
5 Рекомендуется использовать расслабленное время для этой секции. При использовании виртуальная машина должна отключить любое время ожидания наблюдателя, которые зависят от своевременной доставки внешних прерываний.
6 Рекомендуется использовать переназначку DMA.
7 Рекомендуется использовать повторную обработку прерываний.
8 Зарезервировано.
9 Рекомендуется не рекомендуется использовать autoEOI.
10 Рекомендуется использовать гиперклайл SyntheticClusterIpi.
11 Рекомендуется использовать более новый интерфейс ExProcessorMasks.
12 Указывает, что гипервизор вложен в Hyper-V секции.
13 Рекомендуется использовать INT для системных вызовов MBEC.
14 Рекомендуется использовать вложенный гипервизор с помощью просвещенного интерфейса VMCS. Также указывает, что дополнительные вложенные просветления могут быть доступны (см. конечные 0x4000000A).
15 UseSyncedTimeline — указывает, что секция должна использовать предвзятость QueryPerformanceCounter, предоставляемую корневой секцией.
16 Зарезервировано
17 UseDirectLocalFlushEntire — указывает, что гость должен переключить CR4. PGE для очистки всей подсистемы балансировки нагрузки, так как это более производительно, чем создание гиперкалл.
18 NoNonArchitecturalCoreSharing — указывает, что общий доступ к ядрам невозможен. Это можно использовать в качестве оптимизации, чтобы избежать затрат на производительность STIBP.
31-19 Зарезервировано
EBX Рекомендуемое количество попыток повторить сбой спинлока перед уведомлением гипервизора о сбоях. 0xFFFFFFFF указывает, что никогда не уведомляется.
ECX 6-0 ImplementedPhysicalAddressBits — сообщает о ширине физического адреса (MAXPHYADDR), сообщаемой физическими процессорами системы. Если все биты содержат 0, функция не поддерживается. Обратите внимание, что указанное значение — это фактическое количество битов физического адреса, а не битовое положение, используемое для представления этого числа.
31-7 Зарезервировано
EDX Зарезервировано

Ограничения реализации гипервизора — 0x40000005

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

Register Предоставленная информация
EAX Максимальное число поддерживаемых виртуальных процессоров
EBX Максимальное число поддерживаемых логических процессоров
ECX Максимальное количество векторов физических прерываний, доступных для перемежения прерываний.
EDX Зарезервировано

Компоненты оборудования реализации — 0x40000006

Указывает, какие аппаратные функции обнаружены и в настоящее время используются гипервизором.

Register Биты Предоставленная информация
EAX 0 Поддержка поддержки наложения APIC обнаруживается и используется.
1 Поддержка растровых карт MSR обнаруживается и используется.
2 Обнаружена и используется поддержка счетчиков производительности архитектуры.
3 Поддержка перевода адресов второго уровня обнаруживается и используется.
4 Обнаружена и используется поддержка повторного сопоставления DMA.
5 Поддержка перемысливания прерываний обнаружена и используется.
6 Указывает, что в оборудовании присутствует скруббер патрульного патруля памяти.
7 Защита DMA используется.
8 Запрашивается HPET.
9 Искусственные таймеры являются переменными.
13-10 Уровень гипервизора текущего гостя — 0, если он не вложен.
14 Обязательный режим физического назначения.
15 Используйте VMFUNC для переключателя карты псевдонимов.
16 Поддержка ноль аппаратной памяти присутствует.
17 Поддержка неограниченного гостя присутствует.
18 Поддержка выделения ресурсов (RDT-A, PQOS-A) присутствует.
19 Поддержка мониторинга ресурсов (RDT-M, PQOS-M) присутствует.
20 Поддержка гостевого виртуального PMU присутствует.
двадцать один Поддержка гостевой виртуальной LBR присутствует.
двадцать два Поддержка гостевой виртуальной IPT присутствует.
23 Поддержка эмуляции APIC присутствует.
двадцать четыре Обнаружена таблица ACPI WDAT и используется гипервизором.
31-25 Зарезервировано
EBX Зарезервировано
ECX Зарезервировано
EDX Зарезервировано

Идентификация вложенных функций гипервизора — 0x40000009

Описывает функции, предоставляемые секцией гипервизором при выполнении вложенных объектов. EAX описывает доступ к виртуальным MSR. EDX описывает доступ к гипермасштабированиям.

Register Биты Предоставленная информация
EAX 1-0 Зарезервировано
2 AccessSynicRegs
3 Зарезервировано
4 AccessIntrCtrlRegs
5 AccessHypercallMsrs
6 AccessVpIndex
11-7 Зарезервировано
12 AccessReenlightenmentControls
31-13 Зарезервировано
EBX Зарезервировано
ECX Зарезервировано
EDX 3-0 Зарезервировано
4 XmmRegistersForFastHypercallAvailable
14-5 Зарезервировано
15 FastHypercallOutputAvailable
16 Зарезервировано
17 SintPollingModeAvailable
31-18 Зарезервировано

Функции вложенной виртуализации гипервизора — 0x4000000A

Указывает, какие вложенные оптимизации виртуализации доступны для вложенного гипервизора.

Register Биты Предоставленная информация
EAX 7-0 Просвещенная версия VMCS (низкая)
15-8 Просвещенная версия VMCS (высокая)
16 Зарезервировано
17 Указывает поддержку прямых гипермасштабирования виртуальных потоков.
18 Указывает поддержку гипермасштабирования HvCallFlushGuestPhysicalAddressSpace и HvCallFlushGuestGuestPhysicalAddressList (на платформах x64).
19 Указывает поддержку использования просвещенного растрового изображения MSR.
20 Указывает поддержку объединения исключений виртуализации в классе исключений сбоя страницы.
двадцать один Указывает поддержку ненулевого значения поля 0x00002802 (GuestIa32DebugCtl) в VMCS.
двадцать два Указывает поддержку просвещенной подсистемы балансировки нагрузки на платформах AMD. Очистки ASID не влияют на записи TLB, производные от ДНЯО. Гипермасштабирование должно использоваться для недопустимых записей TLB ДНЯО. Также указывает на поддержку гипермасштабирования HvCallFlushGuestGuestPhysicalAddressSpace и HvCallFlushGuestGuestPhysicalAddressList.
31-21 Зарезервировано
EBX 0 Указывает поддержку полей GuestPerfGlobalCtrl и HostPerfGlobalCtrl в просвещенных VMCS.
31-1 Зарезервировано
ECX Зарезервировано
EDX Зарезервировано

Управление версиями

Сведения о версии гипервизора кодируются в конечной строке 0x40000002. Предоставляются два номера версий: основная версия и версия службы.

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

Клиентам настоятельно рекомендуется проверять наличие функций гипервизора с помощью ЦПИД 0x400000030x40000005 , а не сравнивать с диапазонами версий.

Обнаружение компонентов и интерфейсов (ARM64)

В архитектуре ARM64 для обнаружения функций и интерфейсов используются следующие механизмы:

  • Запросы HvRegister через HvCallGetVpRegisters — используются для статических функций и сведений о версии.
  • Регистры, сопоставленные с памятью, используются для значений состояния и управления.

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

Обнаружение гипервизора

Прежде чем использовать большинство интерфейсов гипервизора, программное обеспечение должно сначала определить, работает ли он в виртуализированной среде.

В ARM64 гостевое программное обеспечение может обнаружить гипервизор с помощью стандартного интерфейса SMCCC (Соглашение о вызовах SMC). Обнаружение выполняется с помощью инструкции HVC или SMC с идентификатором 0xC600FF0 функции в X0 (это соответствует 64-разрядному вызову гипервизора для конкретного поставщика, VENDOR_HYP_FUNCTION_CODE_UID). Вызов следует соглашениям SMCCC, включая imm16 из 0. Гипервизор Майкрософт возвращает следующие значения, представляющие GUID 4d32ba58-cd24-4764-8eef-6c7516597024:

Register Ценность
X0 0x4d32ba58
X1 0xcd244764
X2 0x8eef6c75
X3 0x16597024

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

Регистры компонентов гипервизора

Платформы ARM64 запрашивают сведения о гипервизоре с помощью синтетических регистров, а не инструкций ЦПID. Эти регистры предоставляют эквивалентные сведения своим аналогам ЦП X64 и получают доступ через HvCallGetVpRegisters. Все регистры функций возвращают 128-разрядные значения.

Удостоверение системы гипервизора — HvRegisterHypervisorVersion

Возвращает сведения о версии, закодированные в 128-разрядном значении. Макет идентичен 0x40000002 конечной 0x40000002 ЦП 64 с значениями регистра x64, упакованными в 128-разрядный результат (EAX в битах 31-0, EBX в битах 63-32, ECX в битах 95-64, EDX в битах 127-96).

Идентификация компонентов гипервизора — HvRegisterPrivilegesAndFeaturesInfo

Эквивалентно 0x40000003 конечной 0x40000003 ЦП 64 ЦП. Указывает, какие функции доступны секции на основе текущих привилегий секции. Возвращает 128-разрядное значение со следующими полями:

Биты Предоставленная информация
31-0 Соответствует битам 31-0 HV_PARTITION_PRIVILEGE_MASK
63-32 Соответствует битам 63-32 HV_PARTITION_PRIVILEGE_MASK
64 Доступна поддержка гостевой отладки.
65 Поддержка монитора производительности доступна.
66 Доступна поддержка событий динамического секционирования физических ЦП.
67 Доступна поддержка состояния простоя виртуального гостя.
68 Доступна поддержка состояния спящего режима гипервизора.
69 Доступна поддержка запросов расстояний NUMA.
70 Доступна поддержка определения частот таймера.
71 Доступна поддержка внедрения проверок синтетических машин.
72 Доступна поддержка регистров аварийного сбоя гостевых версий.
73 Зарезервировано.
74 DisableHypervisorAvailable.
75 Зарезервировано.
76 SintPollingModeAvailable.
77 Используйте прямые искусственные таймеры.
127-78 Зарезервировано.

Рекомендации по реализации — HvRegisterFeaturesInfo

Эквивалентно 0x40000004 конечной 0x40000004 ЦП 64 ЦП. Указывает, какое поведение гипервизора рекомендует операционной системе реализовать для оптимальной производительности. Возвращает 128-разрядное значение.

Биты Предоставленная информация
0 UseHvRegisterForReset — в ARM64 всегда имеет значение false (вместо этого секции должны использовать PSCI SYSTEM_RESET).
1 Рекомендуется использовать расслабленное время для этой секции. При использовании виртуальная машина должна отключить любое время ожидания наблюдателя, которые зависят от своевременной доставки внешних прерываний.
2 Рекомендуется использовать гиперклайл SyntheticClusterIpi. В ARM64 это значение равно false для корневой секции (которая должна использовать ICC_SGI1R_EL1 напрямую) и значение true для гостевых секций.
3 Рекомендуется использовать более новый интерфейс ExProcessorMasks.
4 Указывает, что гипервизор вложен в Hyper-V секции.
5 Указывает, что секция должна использовать предвзятость QueryPerformanceCounter, предоставляемую корневой секцией.
20-6 Зарезервировано
двадцать один UseHypercallForMmioAccess
двадцать два UseGpaPinningHypercall
23 Пробуждение
25-24 Зарезервировано
26 MapPartitionEventLogBuffer
31-27 Зарезервировано
63-32 Рекомендуемое количество попыток повторить сбой спинлока перед уведомлением гипервизора о сбоях. 0xFFFFFFFF указывает, что никогда не уведомляется.
127-64 Зарезервировано

Ограничения реализации гипервизора — HvRegisterImplementationLimitsInfo

Описывает ограничения масштабирования, поддерживаемые в текущей реализации гипервизора. Если любое значение равно нулю, гипервизор не предоставляет соответствующие сведения. Возвращает 128-разрядное значение с макетом, идентичным конечным 0x40000005 ЦП X64, с значениями регистра x64, упакованными в 128-разрядный результат (EAX в битах 31-0, EBX в битах 63-32, ECX в битах 95-64, EDX в битах 127-96).

Функции оборудования реализации — HvRegisterHardwareFeaturesInfo

Эквивалентно 0x40000006 конечной 0x40000006 ЦП 64 ЦП. Указывает, какие аппаратные функции обнаружены и в настоящее время используются гипервизором. Возвращает 128-разрядное значение.

Биты Предоставленная информация
0 Обнаружена и используется поддержка счетчиков производительности архитектуры.
1 Поддержка перевода адресов второго уровня обнаруживается и используется.
2 Обнаружена и используется поддержка повторного сопоставления DMA.
3 Поддержка перемысливания прерываний обнаружена и используется.
4 Указывает, что в оборудовании присутствует скруббер патрульного патруля памяти.
5 Защита DMA используется.
6 Искусственные таймеры являются переменными.
127-7 Зарезервировано

Управление версиями

Сведения о версии гипервизора кодируются в HvRegisterHypervisorVersion. Формат соответствует эквиваленту x64.