Виртуальный безопасный режимVirtual Secure Mode

Виртуальный безопасный режим (VSM) — это набор возможностей гипервизора и просветлений, предлагаемых для размещения и гостевых секций, которые позволяют создавать и управлять новыми границами безопасности в программном обеспечении операционной системы.Virtual Secure Mode (VSM) is a set of hypervisor capabilities and enlightenments offered to host and guest partitions which enables the creation and management of new security boundaries within operating system software. VSM — это механизм гипервизора, на котором основаны функции безопасности Windows, включая Device Guard, Credential Guard, виртуальные модули и экранированные виртуальные машины.VSM is the hypervisor facility on which Windows security features including Device Guard, Credential Guard, virtual TPMs and shielded VMs are based. Эти функции безопасности появились в Windows 10 и Windows Server 2016.These security features were introduced in Windows 10 and Windows Server 2016.

VSM позволяет программному обеспечению операционной системы в корневых и гостевых разделах создавать изолированные области памяти для хранения и обработки системных ресурсов безопасности.VSM enables operating system software in the root and guest partitions to create isolated regions of memory for storage and processing of system security assets. Доступ к этим изолированным регионам контролируется и предоставляется исключительно с помощью низкоуровневой оболочки, которая является частью надежного уровня надежности системы (TCB), обладающей высоким уровнем доверия.Access to these isolated regions is controlled and granted solely through the hypervisor, which is a highly privileged, highly trusted part of the system’s Trusted Compute Base (TCB). Поскольку гипервизор работает на более высоком уровне привилегий по сравнению с программным обеспечением операционной системы и имеет эксклюзивный контроль над ключевыми системными ресурсами, такими как элементы управления доступом к памяти в ЦП ММУ и IOMMU на ранних этапах инициализации системы, гипервизор может защищать эти изолированные регионы от несанкционированного доступа, даже от программного обеспечения операционной системы (например, ядро ОС и драйверы устройств) с доступом или «Ring 0»).Because the hypervisor runs at a higher privilege level than operating system software and has exclusive control of key system hardware resources such as memory access permission controls in the CPU MMU and IOMMU early in system initialization, the hypervisor can protect these isolated regions from unauthorized access, even from operating system software (e.g., OS kernel and device drivers) with supervisor mode access (i.e. CPL0, or “Ring 0”).

В этой архитектуре, даже если стандартное программное обеспечение на уровне системы, работающее в режиме супервизора (например, ядро, драйверы и т. д.), скомпрометировано вредоносными программами, ресурсы в изолированных регионах, защищенные гипервизором, могут оставаться защищенными.With this architecture, even if normal system level software running in supervisor mode (e.g. kernel, drivers, etc.) is compromised by malicious software, the assets in isolated regions protected by the hypervisor can remain secured.

Уровень виртуального доверия (VTL)Virtual Trust Level (VTL)

VSM обеспечивает и поддерживает изоляцию через виртуальные уровни доверия (Втлс).VSM achieves and maintains isolation through Virtual Trust Levels (VTLs). Втлс включены и управляются как для каждого раздела, так и для каждого виртуального процессора.VTLs are enabled and managed on both a per-partition and per-virtual processor basis.

Виртуальные уровни доверия являются иерархическими, а более высокие уровни имеют более высокий уровень привилегий, чем более низкие.Virtual Trust Levels are hierarchical, with higher levels being more privileged than lower levels. VTL0 — это наименее Привилегированный уровень, где VTL1 является более привилегированным, чем VTL0, VTL2 имеет более привилегированный доступ, чем VTL1 и т. д.VTL0 is the least privileged level, with VTL1 being more privileged than VTL0, VTL2 being more privileged than VTL1, etc.

В архитектуре поддерживается до 16 уровней Втлс. Однако гипервизор может реализовать менее 16 VTL.Architecturally, up to 16 levels of VTLs are supported; however a hypervisor may choose to implement fewer than 16 VTL’s. В настоящее время реализуются только два Втлс.Currently, only two VTLs are implemented.

typedef UINT8 HV_VTL, *PHV_VTL;

#define HV_NUM_VTLS 2
#define HV_INVALID_VTL ((HV_VTL) -1)
#define HV_VTL_ALL 0xF

Каждый VTL имеет собственный набор защиты доступа к памяти.Each VTL has its own set of memory access protections. Эти защиты доступа управляются гипервизором в физическом адресном пространстве раздела и поэтому не могут быть изменены программным обеспечением системного уровня, выполняемым в разделе.These access protections are managed by the hypervisor in a partition’s physical address space, and thus cannot be modified by system level software running in the partition.

Так как более привилегированные Втлс могут применять собственные средства защиты памяти, более высокие Втлс могут эффективно защищать области памяти от более низких Втлс.Since more privileged VTLs can enforce their own memory protections, higher VTLs can effectively protect areas of memory from lower VTLs. На практике это позволяет более низкому VTLу защищать области изолированной памяти, защищая их с более высоким VTL.In practice, this allows a lower VTL to protect isolated memory regions by securing them with a higher VTL. Например, VTL0 может сохранить секрет в VTL1, после чего он сможет получить доступ только к VTL1.For example, VTL0 could store a secret in VTL1, at which point only VTL1 could access it. Даже если VTL0 скомпрометирован, секретный код будет защищен.Even if VTL0 is compromised, the secret would be safe.

Защита VTLVTL Protections

Существует несколько аспектов для достижения изоляции между Втлс:There are multiple facets to achieving isolation between VTLs:

  • Защита доступа к памяти. Каждый VTL поддерживает набор защиты доступа к физической памяти гостевого компьютера.Memory Access Protections: Each VTL maintains a set of guest physical memory access protections. Программное обеспечение, работающее на определенном VTL, может получать доступ к памяти только в соответствии с этими защитой.Software running at a particular VTL can only access memory in accordance with these protections.
  • Состояние виртуального процессора. виртуальные процессоры поддерживают отдельное состояние "на VTL".Virtual Processor State: Virtual processors maintain separate per-VTL state. Например, каждый VTL определяет набор частных вице-президентов.For example, each VTL defines a set of a private VP registers. Программное обеспечение, работающее на более низком VTL, не может получить доступ к состоянию регистра закрытого виртуального процессора VTL.Software running at a lower VTL cannot access the higher VTL’s private virtual processor’s register state.
  • Прерывания. Вместе с отдельным состоянием процессора каждый VTL также имеет собственную подсистему прерывания (локальный APIC).Interrupts: Along with a separate processor state, each VTL also has its own interrupt subsystem (local APIC). Это позволяет более высокому Втлс обрабатывать прерывания, не мешая помехам от более низкого VTL.This allows higher VTLs to process interrupts without risking interference from a lower VTL.
  • Страницы наложения. определенные страницы наложения поддерживаются для каждого VTL, так что более высокий Втлс имеет надежный доступ.Overlay Pages: Certain overlay pages are maintained per-VTL such that higher VTLs have reliable access. Пример:E.g. для каждого VTL имеется отдельная страница оверлея гипервызовов.there is a separate hypercall overlay page per VTL.

Обнаружение и состояние VSMVSM Detection and Status

Функция VSM объявляется секциям с помощью флага привилегии Акцессвсм Partition.The VSM capability is advertised to partitions via the AccessVsm partition privilege flag. Только секции со всеми следующими привилегиями могут использовать VSM: Акцессвсм, Акцессвпрегистерс и Акцесссиникрегс.Only partitions with all of the following privileges may utilize VSM: AccessVsm, AccessVpRegisters, and AccessSynicRegs.

Обнаружение возможностей VSMVSM Capability Detection

Гости должны использовать следующий регистр, зависящий от модели, для доступа к отчету о возможностях VSM:Guests should use the following model-specific register to access a report on VSM capabilities:

Адрес MSRMSR address Имя регистраRegister Name ОписаниеDescription
0x000D00060x000D0006 HV_X64_REGISTER_VSM_CAPABILITIESHV_X64_REGISTER_VSM_CAPABILITIES Отчет о возможностях VSM.Report on VSM capabilities.

Формат "регистрация VSM" в MSR выглядит следующим образом:The format of the Register VSM Capabilities MSR is as follows:

BitsBits ОписаниеDescription АтрибутыAttributes
6363 Dr6SharedDr6Shared ЧтениеRead
62:4762:47 мбеквтлмаскMbecVtlMask ЧтениеRead
4646 дениловервтлстартупDenyLowerVtlStartup ЧтениеRead
45:045:0 рсвдзRsvdZ ЧтениеRead

Dr6Shared указывает гостевому ресурсу, является ли Dr6 общим регистром между Втлс.Dr6Shared indicates to the guest whether Dr6 is a shared register between the VTLs.

Мвеквтлмаск указывает гостевому Втлсу, для которого можно включить Мбек.MvecVtlMask indicates to the guest the VTLs for which Mbec can be enabled.

Дениловервтлстартуп указывает гостевому администратору, может ли VTL сбрасывать вице-президент на более низком уровне VTL.DenyLowerVtlStartup indicates to the guest whether a Vtl can deny a VP reset by a lower VTL.

Регистр состояния VSMVSM Status Register

Помимо флага привилегий секции, для получения дополнительных сведений о состоянии VSM можно использовать два виртуальных регистра: HvRegisterVsmPartitionStatus и HvRegisterVsmVpStatus .In addition to a partition privilege flag, two virtual registers can be used to learn additional information about VSM status: HvRegisterVsmPartitionStatus and HvRegisterVsmVpStatus.

хврегистервсмпартитионстатусHvRegisterVsmPartitionStatus

Хврегистервсмпартитионстатус — это регистр только для чтения на секцию, который является общим для всех Втлс.HvRegisterVsmPartitionStatus is a per-partition read-only register that is shared across all VTLs. Этот регистр содержит сведения о том, какие Втлс были включены для секции, для которой включены элементы управления выполнением на основе режима, а также максимальное разрешенное VTL.This register provides information about which VTLs have been enabled for the partition, which VTLs have Mode Based Execution Controls enabled, as well as the maximum VTL allowed.

typedef union
{
    UINT64 AsUINT64;
    struct {
        UINT64 EnabledVtlSet : 16;
        UINT64 MaximumVtl : 4;
        UINT64 MbecEnabledVtlSet: 16;
        UINT64 ReservedZ : 28;
    };
} HV_REGISTER_VSM_PARTITION_STATUS;

хврегистервсмвпстатусHvRegisterVsmVpStatus

Хврегистервсмвпстатус является регистром только для чтения и совместно используется всеми Втлс.HvRegisterVsmVpStatus is a read-only register and is shared across all VTLs. Это регистр для каждого президента, то есть каждый виртуальный процессор обслуживает свой собственный экземпляр.It is a per-VP register, meaning each virtual processor maintains its own instance. Этот регистр содержит сведения о том, какие Втлс включены, что активно, а также о режиме МБЕК, активном в вице-президенте.This register provides information about which VTLs have been enabled, which is active, as well as the MBEC mode active on a VP.

typedef union
{
    UINT64 AsUINT64;
    struct
    {
        UINT64 ActiveVtl : 4;
        UINT64 ActiveMbecEnabled : 1;
        UINT64 ReservedZ0 : 11;
        UINT64 EnabledVtlSet : 16;
        UINT64 ReservedZ1 : 32;
    };
} HV_REGISTER_VSM_VP_STATUS;

Активевтл — идентификатор контекста VTL, который в настоящее время активен на виртуальном процессоре.ActiveVtl is the ID of the VTL context that is currently active on the virtual processor.

Активембеценаблед указывает, что в настоящее время МБЕК активен на виртуальном процессоре.ActiveMbecEnabled specifies that MBEC is currently active on the virtual processor.

Енабледвтлсет — это битовая карта VTL, которая включена на виртуальном процессоре.EnabledVtlSet is a bitmap of the VTL’s that are enabled on the virtual processor.

Исходное состояние секционирования VTLPartition VTL Initial state

При запуске или сбросе секции начинается выполнение в VTL0.When a partition starts or resets, it begins running in VTL0. Все остальные Втлс отключаются при создании секции.All other VTLs are disabled at partition creation.

Включение VTLVTL Enablement

Чтобы начать использовать VTL, более низкий VTL должен инициировать следующее:To begin using a VTL, a lower VTL must initiate the following:

  1. Включите целевой VTL для секции.Enable the target VTL for the partition. Это делает VTL общедоступным для секции.This makes the VTL generally available for the partition.
  2. Включите целевой VTL на одном или нескольких виртуальных процессорах.Enable the target VTL on one or more virtual processors. Это делает VTL доступным для вице-президента и задает его первоначальный контекст.This makes the VTL available for a VP, and sets its initial context. Рекомендуется, чтобы все ВПС имели одинаковые включенные Втлс.It is recommended that all VPs have the same enabled VTLs. Включение VTL на некоторых ВПС (но не все) может привести к непредвиденному поведению.Having a VTL enabled on some VPs (but not all) can lead to unexpected behavior.
  3. После того как VTL включен для раздела и вице-президента, он может начать настройку защиты доступа после установки флага Енаблевтлпротектион.Once the VTL is enabled for a partition and VP, it can begin setting access protections once the EnableVtlProtection flag has been set.

Обратите внимание, что Втлс не обязательно должен быть последовательным.Note that VTLs need not be consecutive.

Включение целевого VTL для секцииEnabling a Target VTL for a Partition

Вызов хвкалленаблепартитионвтл используется для включения VTL для определенной секции.The HvCallEnablePartitionVtl hypercall is used to enable a VTL for a certain partition. Обратите внимание, что до фактического выполнения программного обеспечения в определенном VTL необходимо включить VTL на виртуальных процессорах в секции.Note that before software can actually execute in a particular VTL, that VTL must be enabled on virtual processors in the partition.

Включение целевого VTL для виртуальных процессоровEnabling a Target VTL for Virtual Processors

После включения VTL для секции ее можно включить на виртуальных процессорах секции.Once a VTL is enabled for a partition, it can be enabled on the partition’s virtual processors. Вызов хвкалленаблевпвтл можно использовать для включения втлс для виртуального процессора, который задает его первоначальный контекст.The HvCallEnableVpVtl hypercall can be used to enable VTLs for a virtual processor, which sets its initial context.

Виртуальные процессоры имеют один "контекст" на VTL.Virtual processors have one “context” per VTL. При переключении VTL также переключается закрытое состояние VTL.If a VTL is switched, the VTL's private state is also switched.

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

После включения VTL его конфигурация может быть изменена вице-президентом, работающим на равном или более высоком VTL.Once a VTL has been enabled, its configuration can be changed by a VP running at an equal or higher VTL.

Конфигурация секцииPartition Configuration

Атрибуты уровня раздела можно настроить с помощью регистра Хврегистервсмпартитионконфиг.Partition-wide attributes can be configured using the HvRegisterVsmPartitionConfig register. Существует один экземпляр этого регистра для каждого VTL (больше 0) на каждом разделе.There is one instance of this register for each VTL (greater than 0) on every partition.

Каждый VTL может изменить собственный экземпляр HV_REGISTER_VSM_PARTITION_CONFIG, а также экземпляры для более низкого Втлс.Every VTL can modify its own instance of HV_REGISTER_VSM_PARTITION_CONFIG, as well as instances for lower VTLs. Втлс не может изменить этот регистр для более высоких Втлс.VTLs may not modify this register for higher VTLs.

typedef union
{
    UINT64 AsUINT64;
    struct
    {
        UINT64 EnableVtlProtection : 1;
        UINT64 DefaultVtlProtectionMask : 4;
        UINT64 ZeroMemoryOnReset : 1;
        UINT64 DenyLowerVtlStartup : 1;
        UINT64 ReservedZ : 2;
        UINT64 InterceptVpStartup : 1;
        UINT64 ReservedZ : 54; };
} HV_REGISTER_VSM_PARTITION_CONFIG;

Поля этого регистра описаны ниже.The fields of this register are described below.

Включить защиту VTLEnable VTL Protections

После включения VTL необходимо установить флаг Енаблевтлпротектион, прежде чем он сможет приступить к применению защиты памяти.Once a VTL has been enabled, the EnableVtlProtection flag must be set before it can begin applying memory protections. Этот флаг однократно перезаписывается. Это означает, что после установки его нельзя изменить.This flag is write-once, meaning that once it has been set, it cannot be modified.

Маска защиты по умолчаниюDefault Protection Mask

По умолчанию система применяет защиту RWX ко всем сопоставленным страницам, а также ко всем будущим страницам с поддержкой горячего добавления.By default, the system applies RWX protections to all currently mapped pages, and any future “hot-added” pages. Страницы с поддержкой горячего добавления ссылаются на любую память, которая добавляется в секцию во время операции изменения размера.Hot-added pages refer to any memory that is added to a partition during a resize operation.

Более высокий VTL может задать другую политику защиты памяти по умолчанию, указав Дефаултвтлпротектионмаск в HV_REGISTER_VSM_PARTITION_CONFIG.A higher VTL can set a different default memory protection policy by specifying DefaultVtlProtectionMask in HV_REGISTER_VSM_PARTITION_CONFIG. Эта маска должна быть установлена во время включения VTL.This mask must be set at the time the VTL is enabled. Он не может быть изменен после того, как он задан, и удаляется только при сбросе раздела.It cannot be changed once it is set, and is only cleared by a partition reset.

bitBit ОписаниеDescription
00 ЧтениеRead
11 записьWrite
22 Выполнение в пользовательском режиме (УМКС)User Mode Execute (UMX)
33 Выполнение в режиме ядра (КМКС)Kernel Mode Execute (KMX)

Обнуление памяти при сбросеZero Memory on Reset

Зеромемонресет — это бит, определяющий, будет ли память обнулена перед сбросом секции.ZeroMemOnReset is a bit that controls if memory is zeroed before a partition is reset. Эта конфигурация включена по умолчанию.This configuration is on by default. Если бит установлен, память секции обнуляется после сброса, чтобы память с более высоким VTL не могла быть скомпрометирована более низким VTL.If the bit is set, the partition’s memory is zeroed upon reset so that a higher VTL’s memory cannot be compromised by a lower VTL. Если этот бит очищен, память секции не сбрасывается при сбросе.If this bit is cleared, the partition’s memory is not zeroed on reset.

дениловервтлстартупDenyLowerVtlStartup

Флаг Дениловервтлстартуп определяет, может ли виртуальный процессор запускаться или сбрасываться на более низком уровне Втлс.The DenyLowerVtlStartup flag controls if a virtual processor may be started or reset by lower VTLs. Сюда входят архитектурные способы сброса виртуального процессора (например, СИПИ в x64), а также вызов хвкаллстартвиртуалпроцессор .This includes architectural ways of resetting a virtual processor (e.g. SIPI on X64) as well as the HvCallStartVirtualProcessor hypercall.

интерцептвпстартупInterceptVpStartup

Если установлен флаг Интерцептвпстартуп, то при запуске или сбросе виртуального процессора создается пересечение с более высоким VTL.If InterceptVpStartup flag is set, starting or resetting a virtual processor generates an intercept to the higher VTL.

Настройка нижнего ВтлсConfiguring Lower VTLs

Следующий регистр может использоваться более высоким Втлс для настройки поведения более низкого Втлс:The following register can be used by higher VTLs to configure the behavior of lower VTLs:

typedef union
{
    UINT64 AsUINT64;
    struct
    {
        UINT64 MbecEnabled : 1;
        UINT64 TlbLocked : 1;
        UINT64 ReservedZ : 62;
    };
} HV_REGISTER_VSM_VP_SECURE_VTL_CONFIG;

Каждый VTL (выше 0) имеет экземпляр этого регистра для каждого VTL ниже самого.Each VTL (higher than 0) has an instance of this register for every VTL lower than itself. Например, VTL2 будет иметь два экземпляра этого регистра: один для VTL1, а второй — для VTL0.For example, VTL2 would have two instances of this register – one for VTL1, and a second for VTL0.

Поля этого регистра описаны ниже.The fields of this register are described below.

мбеценабледMbecEnabled

Это поле определяет, включено ли МБЕК для более низкого VTL.This field configures whether MBEC is enabled for the lower VTL.

тлблоккедTlbLocked

Это поле блокирует TLB нижнего VTL.This field locks the lower VTL’s TLB. Эту возможность можно использовать для предотвращения недействительностей TLB, которые могут повлиять на Втлс более высокого уровня VTL.This capability can be used to prevent lower VTLs from causing TLB invalidations which might interfere with a higher VTL. Если этот бит задан, все запросы на очистку адресного пространства от нижнего VTL блокируются до тех пор, пока блокировка не будет удалена.When this bit is set, all address space flush requests from the lower VTL are blocked until the lock is lifted.

Чтобы разблокировать TLB, более VTL может снять этот бит.To unlock the TLB, the higher VTL can clear this bit. Кроме того, когда вице-президент возвращается к более низкому VTLу, он освобождает все блокировки TLB, которые он удерживает.Also, once a VP returns to a lower VTL, it releases all TLB locks which it holds at the time.

Запись VTLVTL Entry

VTL является "входным", когда вице-президент переключается с более низкого VTL на более высокий.A VTL is “entered” when a VP switches from a lower VTL to a higher one. Это может происходить по следующим причинам:This can happen for the following reasons:

  1. Вызов VTL: это то, что программное обеспечение явно пожелает вызывать код в более высоком VTL.VTL call: this is when software explicitly wishes to invoke code in a higher VTL.
  2. Безопасное прерывание: Если для более высокого VTL получено прерывание, то вице-президент будет вводить более высокий VTL.Secure interrupt: if an interrupt is received for a higher VTL, the VP will enter the higher VTL.
  3. Безопасный перехват. при определенных действиях запустится защищенное прерывание (например, доступ к определенному пакету MSRs).Secure intercept: certain actions will trigger a secure interrupt (accessing certain MSRs for example).

После того как VTL, он должен выйти из него.Once a VTL is entered, it must voluntarily exit. Более высокий VTL не может быть вытеснен более низким VTL.A higher VTL cannot be preempted by a lower VTL.

Определение причины записи VTLIdentifying VTL Entry Reason

Для правильной реакции на запись более VTL может потребоваться знать причину, по которой она была введена.In order to react appropriately to an entry, a higher VTL might need to know the reason it was entered. Для различения причин входа запись VTL включается в структуру HV_VP_VTL_CONTROL .To discern between entry reasons, the VTL entry is included in the HV_VP_VTL_CONTROL structure.

Вызов VTLVTL Call

"Вызов VTL" происходит, когда более ранняя VTL инициирует запись в более высокий VTL (например, для защиты области памяти с более высоким VTL) через вызов хвкаллвтлкалл .A “VTL call” is when a lower VTL initiates an entry into a higher VTL (for example, to protect a region of memory with the higher VTL) through the HvCallVtlCall hypercall.

Вызовы VTL сохраняют состояние общих регистров в параметрах VTL.VTL calls preserve the state of shared registers across VTL switches. Закрытые регистры сохраняются на уровне "на VTL".Private registers are preserved on a per-VTL level. Исключением из этих ограничений являются регистры, необходимые для последовательности вызовов VTL.The exception to these restrictions are the registers required by the VTL call sequence. Для вызова VTL требуются следующие регистры:The following registers are required for a VTL call:

X64x64 x86x86 ОписаниеDescription
RCXRCX EDX: EAXEDX:EAX Указывает входные данные для элемента управления вызовом VTL для низкоуровневой оболочкиSpecifies a VTL call control input to the hypervisor
RAXRAX ECXECX ЗарезервированоReserved

Все биты входного элемента управления вызовом VTL в настоящее время зарезервированы.All bits in the VTL call control input are currently reserved.

Ограничения вызова VTLVTL Call Restrictions

Вызовы VTL могут быть инициированы только из самого привилегированного режима процессора.VTL calls can only be initiated from the most privileged processor mode. Например, в системах x64 вызов VTL может происходить только из CPL0.For example, on x64 systems a VTL call can only come from CPL0. Вызов VTL, инициированный из режима процессора, который является любым, но наиболее привилегированным в системе приводит к добавлению #UD исключения в виртуальный процессор.A VTL call initiated from a processor mode which is anything but the most privileged on the system results in the hypervisor injecting a #UD exception into the virtual processor.

Вызов VTL может переключиться только на следующий самый высокий VTL.A VTL call can only switch into the next highest VTL. Иными словами, если включено несколько Втлс, вызов не может пропускать VTL.In other words, if there are multiple VTLs enabled, a call cannot “skip” a VTL. Следующие действия приводят к возникновению исключения #UD:The following actions result in a #UD exception:

  • Вызов VTL, инициированный из режима процессора, который является любым, но наиболее привилегированным в системе (зависящим от архитектуры).A VTL call initiated from a processor mode which is anything but the most privileged on the system (architecture specific).
  • Вызов VTL из реального режима (x86/x64)A VTL call from real mode (x86/x64)
  • Вызов VTL на виртуальном процессоре, где целевая VTL отключена (или еще не включена).A VTL call on a virtual processor where the target VTL is disabled (or has not been already enabled).
  • Вызов VTL с недопустимым входным значением элемента управленияA VTL call with an invalid control input value

Выход из VTLVTL Exit

Переключение на более низкий VTL называется "return".A switch to a lower VTL is known as a “return”. После завершения обработки VTL может инициировать возврат VTL, чтобы переключиться на более низкий VTL.Once a VTL has finished processing, it can initiate a VTL return in order to switch to a lower VTL. Единственный способ, с помощью которого может возвращаться VTL, — это то, что более высокий VTL добровольно запустит его.The only way a VTL return can occur is if a higher VTL voluntarily initiates one. Более низкие VTL никогда не могут занижать приоритет.A lower VTL can never preempt a higher one.

VTL возвратVTL Return

"VTL return" — когда более высокий VTL инициирует переключение в более низкий VTL через вызов хвкаллвтлретурн .A “VTL return” is when a higher VTL initiates a switch into a lower VTL through the HvCallVtlReturn hypercall. Аналогично вызову VTL, состояние закрытого процессора выключается, а общее состояние остается на месте.Similar to a VTL call, private processor state is switched out, and shared state remains in place. Если нижняя VTL явно вызывается в более высоком VTL, гипервизор увеличивает указатель инструкций более высокого VTL до завершения возврата, чтобы он мог продолжаться после вызова VTL.If the lower VTL has explicitly called into the higher VTL, the hypervisor increments the higher VTL’s instruction pointer before the return is complete so that it may continue after a VTL call.

Для последовательности кода возврата VTL требуется использовать следующие регистры:A VTL Return code sequence requires the use of the following registers:

X64x64 x86x86 ОписаниеDescription
RCXRCX EDX: EAXEDX:EAX Указывает входные данные элемента управления, возвращаемые VTL для низкоуровневой оболочкиSpecifies a VTL return control input to the hypervisor
RAXRAX ECXECX ЗарезервированоReserved

Входные данные элемента управления возврата VTL имеют следующий формат:The VTL return control input has the following format:

BitsBits ПолеField ОписаниеDescription
63:163:1 рсвдзRsvdZ
00 Быстрый возвратFast return Регистры не восстанавливаютсяRegisters are not restored

Следующие действия приводят к созданию исключения #UD:The following actions will generate a #UD exception:

  • Предпринята повторная VTL, когда самая низкая VTL в данный момент активнаAttempting a VTL return when the lowest VTL is currently active
  • При использовании VTL возвращается Недопустимое входное значение элемента управленияAttempting a VTL return with an invalid control input value
  • При попыток VTL возвращается из режима процессора, который является любым, но наиболее привилегированным в системе (зависящим от архитектуры).Attempting a VTL return from a processor mode which is anything but the most privileged on the system (architecture specific)

Быстрый возвратFast Return

В ходе обработки возврата гипервизор может восстановить состояние регистра нижнего VTLа из структуры HV_VP_VTL_CONTROL .As a part of processing a return, the hypervisor can restore the lower VTL’s register state from the HV_VP_VTL_CONTROL structure. Например, после обработки безопасного прерывания вы можете возвращать более высокий VTL, не нарушая состояние нижнего VTL.For example, after processing a secure interrupt, a higher VTL may wish to return without disrupting the lower VTL’s state. Таким образом, низкоуровневая оболочка предоставляет механизм для простого восстановления регистров нижнего VTLа до значения до их предварительного вызова, хранящегося в структуре элемента управления VTL.Therefore, the hypervisor provides a mechanism to simply restore the lower VTL’s registers to their pre-call value stored in the VTL control structure.

Если такое поведение не требуется, более высокое VTL может использовать "быстрый возврат".If this behavior is not necessary, a higher VTL can use a “fast return”. Быстрый возврат происходит, когда гипервизор не восстанавливает состояние Register из структуры управления.A fast return is when the hypervisor does not restore register state from the control structure. Это следует использовать, если возможно, чтобы избежать ненужной обработки.This should be utilized whenever possible to avoid unnecessary processing.

В этом поле можно задать бит 0 VTL возвращаемого входного значения.This field can be set with bit 0 of the VTL return input. Если задано значение 0, регистры восстанавливаются из структуры HV_VP_VTL_CONTROL.If it is set to 0, the registers are restored from the HV_VP_VTL_CONTROL structure. Если этот бит имеет значение 1, регистры не восстанавливаются (быстрый возврат).If this bit is set to 1, the registers are not restored (a fast return).

Помощь по странице вызоваHypercall Page Assist

Гипервизор предоставляет механизмы для помощи с вызовами VTL и возврата через страницу вызова.The hypervisor provides mechanisms to assist with VTL calls and returns via the hypercall page. Эта страница абстрагирует конкретную последовательность кода, необходимую для переключения Втлс.This page abstracts the specific code sequence required to switch VTLs.

Последовательностей кода для выполнения вызовов VTL и возвратов можно получить, выполнив конкретные инструкции на странице вызова.The code sequences to execute VTL calls and returns may be accessed by executing specific instructions in the hypercall page. Фрагменты вызова и возврата расположены в смещении на странице гипервызовов, определяемой виртуальным регистром Хврегистервсмкодепажеоффсет.The call/return chunks are located at an offset in the hypercall page determined by the HvRegisterVsmCodePageOffset virtual register. Это регистр только для чтения и для всей секции с отдельным экземпляром на VTL.This is a read-only and partition-wide register, with a separate instance per-VTL.

VTL может выполнить вызов VTL/return с помощью инструкции CALL.A VTL can execute a VTL call/return using the CALL instruction. ВЫЗОВ правильного расположения на странице гипервызовов вызовет вызов VTL/Return.A CALL to the correct location in the hypercall page will initiate a VTL call/return.

typedef union
{
    UINT64 AsUINT64;
    struct
    {
        UINT64 VtlCallOffset : 12;
        UINT64 VtlReturnOffset : 12;
        UINT64 ReservedZ : 40;
    };
} HV_REGISTER_VSM_CODE_PAGE_OFFSETS;

Чтобы суммировать, пошаговые инструкции по вызову последовательности кода с помощью страницы вызова:To summarize, the steps for calling a code sequence using the hypercall page are as follows:

  1. Отображение страницы гипервызовов в GPA-пространстве VTLMap the hypercall page into a VTL’s GPA space
  2. Определите правильное смещение для последовательности кода (вызов VTL или Return).Determine the correct offset for the code sequence (VTL call or return).
  3. Выполните последовательность кода с помощью вызова.Execute the code sequence using CALL.

Защита доступа к памятиMemory Access Protections

Одной из необходимых функций защиты, предоставляемых VSM, является возможность изолировать доступ к памяти.One necessary protection provided by VSM is the ability to isolate memory accesses.

Более высокие Втлс имеют высокий уровень контроля над типом доступа к памяти, допустимый более низким Втлс.Higher VTLs have a high degree of control over the type of memory access permissible by lower VTLs. Существует три основных типа защиты, которые можно указать с помощью более высокого VTL для конкретной страницы GPA: чтение, запись и выполнение.There are three basic types of protections that can be specified by a higher VTL for a particular GPA page: Read, Write, and eXecute. Они определены в следующей таблице.These are defined in the following table:

ИмяName ОписаниеDescription
ЧтениеRead Определяет, разрешен ли доступ для чтения к странице памятиControls whether read access is allowed to a memory page
записьWrite Определяет, разрешен ли доступ на запись к странице памятиControls whether write access allowed to a memory page
ExecuteExecute Определяет, разрешены ли выборки инструкций для страницы памяти.Controls whether instruction fetches are allowed for a memory page.

Эти три типа комбинируются для следующих типов защиты памяти:These three combine for the following types of memory protection:

  1. Нет доступаNo access
  2. Только для чтения, без выполненияRead-only, no execute
  3. Только чтение, выполнениеRead-only, execute
  4. Чтение/запись, без выполненияRead/write, no execute
  5. Чтение/запись, выполнениеRead/write, execute

Если параметр "Управление выполнением на основе режима (МБЕК))" имеет значение енабед, то можно отдельно установить защиту пользователя и режима ядра.If “mode based execution control (MBEC))” is enabed, user and kernel mode execute protections can be set seperately.

Более высокие Втлс могут устанавливать защиту памяти для GPA через вызов хвкаллмодифивтлпротектионмаск .Higher VTLs can set the memory protection for a GPA through the HvCallModifyVtlProtectionMask hypercall.

Иерархия защиты памятиMemory Protection Hierarchy

Разрешения на доступ к памяти можно задать с помощью нескольких источников для конкретного VTL.Memory access permissions can be set by a number of sources for a particular VTL. Разрешения для каждого VTL потенциально могут быть ограничены несколькими другими Втлс, а также разделом узла.Each VTL’s permissions can potentially be restricted by a number of other VTLs, as well as by the host partition. Порядок применения защиты заключается в следующем:The order in which protections are applied is the following:

  1. Защита памяти, заданная узломMemory protections set by the host
  2. Защита памяти, установленная более высоким ВтлсMemory protections set by higher VTLs

Иными словами, VTL защиты заменяют защиту узла.In other words, VTL protections supersede host protections. Втлс более высокого уровня заменяет Втлс нижнего уровня.Higher-level VTLs supersede lower-level VTLs. Обратите внимание, что VTL не может устанавливать разрешения на доступ к памяти для самого себя.Note that a VTL may not set memory access permissions for itself.

Встроенный интерфейс не должен накладываться на тип, отличный от RAM, в ОЗУ.A conformant interface is expected to not overlay any non-RAM type over RAM.

Нарушения доступа к памятиMemory Access Violations

Если вице-президент, работающий на более низком VTLе, попытается нарушать защиту памяти, установленную более высоким VTL, создается перехват.If a VP running at a lower VTL attempts to violate a memory protection set by a higher VTL, an intercept is generated. Этот перехват получен более высоким VTL, который задает защиту.This intercept is received by the higher VTL which set the protection. Это позволяет более высокому Втлсу справляться с нарушением в каждом конкретном случае.This allows higher VTLs to deal with the violation on a case-by-case basis. Например, более высокий VTL может возвращать ошибку или эмулировать доступ.For example, the higher VTL may choose to return a fault, or emulate the access.

Управление выполнением на основе режима (МБЕК)Mode Based Execute Control (MBEC)

Если VTL помещает ограничение памяти на более низкий VTL, может потребоваться различие между режимами пользователя и ядра при предоставлении права на выполнение.When a VTL places a memory restriction on a lower VTL, it may wish to make a distinction between user and kernel mode when granting an “execute” privilege. Например, если проверки целостности кода были выполнены в более высоком VTL, возможность отличить пользовательский режим от режима ядра означает, что VTL может обеспечить целостность кода только для приложений в режиме ядра.For example, if code integrity checks were to take place in a higher VTL, the ability to distinguish between user-mode and kernel-mode would mean that a VTL could enforce code integrity for only kernel-mode applications.

Помимо традиционных трех способов защиты памяти (чтение, запись, выполнение), МБЕК вводит различие между режимом пользователя и режимом ядра для выполнения защиты.Apart from the traditional three memory protections (read, write, execute), MBEC introduces a distinction between user-mode and kernel-mode for execute protections. Таким образом, если МБЕК включен, VTL имеет возможность установить четыре типа защиты памяти:Thus, if MBEC is enabled, a VTL has the opportunity to set four types of memory protections:

ИмяName ОписаниеDescription
ЧтениеRead Определяет, разрешен ли доступ для чтения к странице памятиControls whether read access is allowed to a memory page
записьWrite Определяет, разрешен ли доступ на запись к странице памятиControls whether write access allowed to a memory page
Выполнение в пользовательском режиме (УМКС)User Mode Execute (UMX) Определяет, разрешены ли выборки инструкций, созданные в пользовательском режиме, для страницы памяти.Controls whether instruction fetches generated in user-mode are allowed for a memory page. Примечание. Если МБЕК отключен, этот параметр игнорируется.NOTE: If MBEC is disabled, this setting is ignored.
Выполнение в режиме ядра (УМКС)Kernel Mode Execute (UMX) Определяет, разрешены ли выборки инструкций, созданные в режиме ядра, для страницы памяти.Controls whether instruction fetches generated in kernel-mode are allowed for a memory page. Примечание. Если МБЕК отключен, этот параметр управляет доступом на выполнение как в пользовательском режиме, так и в режиме ядра.NOTE: If MBEC is disabled, this setting controls both user-mode and kernel-mode execute accesses.

Память, помеченная с помощью защиты "выполнение в режиме пользователя", будет исполняемым только при работе виртуального процессора в пользовательском режиме.Memory marked with the “User-Mode Execute” protections would only be executable when the virtual processor is running in user-mode. Аналогичным образом, память, выполняемая режимом ядра, будет исполняемым только при работе виртуального процессора в режиме ядра.Likewise, “Kernel-Mode Execute” memory would only be executable when the virtual processor is running in kernel-mode.

КМКС и УМКС могут быть независимо установлены таким образом, что разрешения на выполнение применяются по-разному в режиме пользователя и ядра.KMX and UMX can be independently set such that execute permissions are enforced differently between user and kernel mode. Поддерживаются все сочетания УМКС и КМКС, за исключением КМКС = 1, УМКС = 0.All combinations of UMX and KMX are supported, except for KMX=1, UMX=0. Поведение этой комбинации не определено.The behavior of this combination is undefined.

По умолчанию МБЕК отключен для всех Втлс и виртуальных процессоров.MBEC is disabled by default for all VTLs and virtual processors. Если МБЕК отключен, бит выполнения в режиме ядра определяет ограничение доступа к памяти.When MBEC is disabled, the kernel-mode execute bit determines memory access restriction. Таким словами, если МБЕК отключен, КМКС = 1 Code является исполняемым как в ядре, так и в пользовательском режиме.Thus, if MBEC is disabled, KMX=1 code is executable in both kernel and user-mode.

Таблицы дескрипторовDescriptor Tables

Любой код пользовательского режима, обращающийся к таблицам дескрипторов, должен находиться на страницах GPA, помеченных как КМКС = УМКС = 1.Any user-mode code that accesses descriptor tables must be in GPA pages marked as KMX=UMX=1. Программное обеспечение, получающее доступ к таблицам дескрипторов из страницы GPA, помеченной КМКС = 0, не поддерживается и приводит к общей ошибке защиты.User-mode software accessing descriptor tables from a GPA page marked KMX=0 is unsupported and results in a general protection fault.

Конфигурация МБЕКMBEC configuration

Чтобы использовать управление выполнением на основе режима, его необходимо включить на двух уровнях:To make use of Mode-based execution control, it must be enabled at two levels:

  1. Если VTL включен для секции, МБЕК должен быть включен с помощью ХвкалленаблепартитионвтлWhen the VTL is enabled for a partition, MBEC must be enabled using HvCallEnablePartitionVtl
  2. МБЕК необходимо настроить для каждого президента и VTL, используя Хврегистервсмвпсекуревтлконфиг.MBEC must be configured on a per-VP and per-VTL basis, using HvRegisterVsmVpSecureVtlConfig.

МБЕК взаимодействие с предотвращением выполнения в режиме супервизора (СМЕП)MBEC Interaction with Supervisor Mode Execution Prevention (SMEP)

Supervisor-Mode предотвращение выполнения (СМЕП) — это функция процессора, поддерживаемая на некоторых платформах.Supervisor-Mode Execution Prevention (SMEP) is a processor feature supported on some platforms. СМЕП может повлиять на работу МБЕК из-за ограничения доступа супервизора к страницам памяти.SMEP can impact the operation of MBEC due to its restriction of supervisor access to memory pages. Низкоуровневая оболочка соответствует следующим политикам, связанным с СМЕП:The hypervisor adheres to the following policies related to SMEP:

  • Если СМЕП недоступна для гостевой ОС (из-за возможностей оборудования или режима совместимости процессора), МБЕК не затрагивается.If SMEP is not available to the guest OS (whether it be because of hardware capabilities or processor compatibility mode), MBEC operates unaffected.
  • Если СМЕП доступен и включен, МБЕК не затрагивается.If SMEP is available, and is enabled, MBEC operates unaffected.
  • Если СМЕП доступен и отключен, все ограничения Execute управляются элементом управления КМКС.If SMEP is available, and is disabled, all execute restrictions are governed by the KMX control. Таким же будет разрешено выполнять только код, помеченный как КМКС = 1.Thus, only code marked KMX=1 will be allowed to execute.

Изоляция состояния виртуального процессораVirtual Processor State Isolation

Виртуальные процессоры сохраняют отдельные состояния для каждого активного VTL.Virtual processors maintain separate states for each active VTL. Однако некоторые из этих состояний являются частными для конкретного VTL, а оставшееся состояние является общим для всех Втлс.However, some of this state is private to a particular VTL, and the remaining state is shared among all VTLs.

Состояние, сохраняемое на VTL (State which is preserved per VTL (a.k.a. закрытое состояние) сохраняется гипервизором в VTL переходах.private state) is saved by the hypervisor across VTL transitions. Если инициируется коммутатор VTL, гипервизор сохраняет текущее закрытое состояние для активного VTL, а затем переключается на частное состояние целевого VTL.If a VTL switch is initiated, the hypervisor saves the current private state for the active VTL, and then switches to the private state of the target VTL. Общее состояние остается активным независимо от параметров VTL.Shared state remains active regardless of VTL switches.

Закрытое состояниеPrivate State

Как правило, каждый VTL имеет собственные контрольные регистры, регистр RIP, RSP Register и MSRs.In general, each VTL has its own control registers, RIP register, RSP register, and MSRs. Ниже приведен список конкретных регистров и MSRs, которые являются частными для каждого VTL.Below is a list of specific registers and MSRs which are private to each VTL.

Частный пакет MSRs:Private MSRs:

  • SYSENTER_CS, SYSENTER_ESP, SYSENTER_EIP, STAR, ЛСТАР, КСТАР, СФМАСК, ЕФЕР, PAT, KERNEL_GSBASE, FS. BASE, GS. БАЗОВЫЙ, TSC_AUXSYSENTER_CS, SYSENTER_ESP, SYSENTER_EIP, STAR, LSTAR, CSTAR, SFMASK, EFER, PAT, KERNEL_GSBASE, FS.BASE, GS.BASE, TSC_AUX
  • HV_X64_MSR_HYPERCALLHV_X64_MSR_HYPERCALL
  • HV_X64_MSR_GUEST_OS_IDHV_X64_MSR_GUEST_OS_ID
  • HV_X64_MSR_REFERENCE_TSCHV_X64_MSR_REFERENCE_TSC
  • HV_X64_MSR_APIC_FREQUENCYHV_X64_MSR_APIC_FREQUENCY
  • HV_X64_MSR_EOIHV_X64_MSR_EOI
  • HV_X64_MSR_ICRHV_X64_MSR_ICR
  • HV_X64_MSR_TPRHV_X64_MSR_TPR
  • HV_X64_MSR_APIC_ASSIST_PAGEHV_X64_MSR_APIC_ASSIST_PAGE
  • HV_X64_MSR_NPIEP_CONFIGHV_X64_MSR_NPIEP_CONFIG
  • HV_X64_MSR_SIRBPHV_X64_MSR_SIRBP
  • HV_X64_MSR_SCONTROLHV_X64_MSR_SCONTROL
  • HV_X64_MSR_SVERSIONHV_X64_MSR_SVERSION
  • HV_X64_MSR_SIEFPHV_X64_MSR_SIEFP
  • HV_X64_MSR_SIMPHV_X64_MSR_SIMP
  • HV_X64_MSR_EOMHV_X64_MSR_EOM
  • HV_X64_MSR_SINT0 — HV_X64_MSR_SINT15HV_X64_MSR_SINT0 – HV_X64_MSR_SINT15
  • HV_X64_MSR_STIMER0_CONFIG — HV_X64_MSR_STIMER3_CONFIGHV_X64_MSR_STIMER0_CONFIG – HV_X64_MSR_STIMER3_CONFIG
  • HV_X64_MSR_STIMER0_COUNT — HV_X64_MSR_STIMER3_COUNTHV_X64_MSR_STIMER0_COUNT – HV_X64_MSR_STIMER3_COUNT
  • Локальные регистры APIC (включая CR8/ТПР)Local APIC registers (including CR8/TPR)

Закрытые регистры:Private registers:

  • RIP, RSPRIP, RSP
  • рфлагсRFLAGS
  • CR0, CR3, CR4CR0, CR3, CR4
  • DR7DR7
  • ИДТР, ГДТРIDTR, GDTR
  • CS, DS, ES, FS, GS, СС, TR, ЛДТРCS, DS, ES, FS, GS, SS, TR, LDTR
  • TSCTSC
  • DR6 (* зависит от типа процессора.DR6 (*dependent on processor type. Чтение виртуального регистра Хврегистервсмкапабилитиес для определения общего или частного состоянияRead HvRegisterVsmCapabilities virtual register to determine shared/private status)

Общее состояниеShared State

Втлс общее состояние, чтобы сократить затраты на переключение контекстов.VTLs share state in order to cut down on the overhead of switching contexts. Состояние общего доступа также позволяет обеспечить некоторое необходимое взаимодействие между Втлс.Sharing state also allows some necessary communication between VTLs. Большая часть общего назначения и регистров с плавающей точкой являются общими, как и большинство архитектур MSRs.Most general purpose and floating point registers are shared, as are most architectural MSRs. Ниже приведен список конкретных MSRs и регистров, которые являются общими для всех Втлс:Below is the list of specific MSRs and registers that are shared among all VTLs:

Общий пакет MSRs:Shared MSRs:

  • HV_X64_MSR_TSC_FREQUENCYHV_X64_MSR_TSC_FREQUENCY
  • HV_X64_MSR_VP_INDEXHV_X64_MSR_VP_INDEX
  • HV_X64_MSR_VP_RUNTIMEHV_X64_MSR_VP_RUNTIME
  • HV_X64_MSR_RESETHV_X64_MSR_RESET
  • HV_X64_MSR_TIME_REF_COUNTHV_X64_MSR_TIME_REF_COUNT
  • HV_X64_MSR_GUEST_IDLEHV_X64_MSR_GUEST_IDLE
  • HV_X64_MSR_DEBUG_DEVICE_OPTIONSHV_X64_MSR_DEBUG_DEVICE_OPTIONS
  • мтррсMTRRs
  • MCG_CAPMCG_CAP
  • MCG_STATUSMCG_STATUS

Общие регистры:Shared registers:

  • RAX, Рбкс, РККС, RDX, РСИ, RDI, РБПRax, Rbx, Rcx, Rdx, Rsi, Rdi, Rbp
  • CR2CR2
  • R8 — R15R8 – R15
  • DR0 – DR5DR0 – DR5
  • Состояние с плавающей точкой X87X87 floating point state
  • Состояние XMMXMM state
  • Состояние AVXAVX state
  • XCR0 (КСФЕМ)XCR0 (XFEM)
  • DR6 (* зависит от типа процессора.DR6 (*dependent on processor type. Чтение виртуального регистра Хврегистервсмкапабилитиес для определения общего или частного состоянияRead HvRegisterVsmCapabilities virtual register to determine shared/private status)

Режим реального времениReal Mode

Режим реального времени не поддерживается для VTL больше 0.Real mode is not supported for any VTL greater than 0. Втлс больше 0 может выполняться в 32-разрядном или 64-разрядном режиме.VTLs greater than 0 can run in 32-bit or 64-bit mode.

Управление прерываниями VTLVTL Interrupt Management

Чтобы обеспечить высокий уровень изоляции между виртуальными уровнями доверия, виртуальный безопасный режим предоставляет отдельную подсистему прерывания для каждого VTL, включенного на виртуальном процессоре.In order to achieve a high level of isolation between Virtual Trust Levels, Virtual Secure Mode provides a separate interrupt subsystem for each VTL enabled on a virtual processor. Это гарантирует, что VTL сможет отправлять и получать прерывания без помех от менее защищенных VTL.This ensures that a VTL is able to both send and receive interrupts without interference from a less secure VTL.

Каждый VTL имеет собственный контроллер прерываний, который активен только в том случае, если виртуальный процессор работает в этой конкретной VTL.Each VTL has its own interrupt controller, which is only active if the virtual processor is running in that particular VTL. Если виртуальный процессор переключает состояния VTL, то контроллер прерываний, активный на процессоре, также переключается.If a virtual processor switches VTL states, the interrupt controller active on the processor is also switched.

Прерывание, нацеленное на VTL, которое выше, чем активное VTL, приведет к немедленному переключению VTL.An interrupt targeted at a VTL which is higher than the active VTL will cause an immediate VTL switch. Более высокие VTL могут получить прерывание.The higher VTL can then receive the interrupt. Если больше VTL не удается получить прерывание из-за значения ТПР/CR8, то прерывание удерживается как "Pending", а VTL не переключается.If the higher VTL is unable to receive the interrupt because of its TPR/CR8 value, the interrupt is held as “pending” and the VTL does not switch. Если имеется несколько Втлс с ожидающими прерываниями, самый высокий VTL имеет приоритет (без уведомления об более низких VTLах).If there are multiple VTLs with pending interrupts, the highest VTL takes precedence (without notice to the lower VTL).

Если прерывание нацелено на более низкий VTL, это прерывание не доставляется до следующего перехода виртуального процессора в целевой VTL.When an interrupt is targeted at a lower VTL, the interrupt is not delivered until the next time the virtual processor transitions into the targeted VTL. INIT и Startup ИПИС, нацеленные на более низкие VTL, удаляются на виртуальном процессоре с включенным более высоким VTL.INIT and startup IPIs targeted at a lower VTL are dropped on a virtual processor with a higher VTL enabled. Поскольку ИНИЦИАЛИЗАЦИя/СИПИ заблокирована, для запуска процессоров следует использовать вызов хвкаллстартвиртуалпроцессор .Since INIT/SIPI is blocked, the HvCallStartVirtualProcessor hypercall should be used to start processors.

РФЛАГС. НАЛИЧИИRFLAGS.IF

В целях переключения Втлс, РФЛАГС. Если не влияет на то, активирует ли защищенное прерывание параметр VTL.For the purposes of switching VTLs, RFLAGS.IF does not affect whether a secure interrupt triggers a VTL switch. Если РФЛАГС. Если флажок снят для маскирования прерываний, прерывания в более высоком Втлс по-прежнему будут приводить к VTL коммутатору более высокого уровня VTL.If RFLAGS.IF is cleared to mask interrupts, interrupts into higher VTLs will still cause a VTL switch to a higher VTL. При принятии решения о немедленном прерывании учитывается только значение ТПР/CR8 более высокого VTL.Only the higher VTL’s TPR/CR8 value is taken into account when deciding whether to immediately interrupt.

Это поведение также влияет на отложенные прерывания при возврате VTL.This behavior also affects pending interrupts upon a VTL return. Если РФЛАГС. Если бит снят для маскирования прерываний в заданном VTL, а VTL возвращает (на более низкий VTL), гипервизор выполнит повторное вычисление всех ожидающих прерываний.If the RFLAGS.IF bit is cleared to mask interrupts in a given VTL, and the VTL returns (to a lower VTL), the hypervisor will reevaluate any pending interrupts. Это приведет к немедленному вызову более высокого VTL.This will cause an immediate call back to the higher VTL.

Помощь в уведомлении о виртуальных прерыванияхVirtual Interrupt Notification Assist

Более высокие Втлс могут зарегистрироваться для получения уведомления, если они блокируют немедленную доставку прерываний на более низкий VTL того же виртуального процессора.Higher VTLs may register to receive a notification if they are blocking immediate delivery of an interrupt to a lower VTL of the same virtual processor. Более высокие Втлс могут включить функцию помощи по уведомлению виртуальных прерываний (вина) через виртуальную Хврегистервсмвина Register:Higher VTLs can enable Virtual Interrupt Notification Assist (VINA) via a virtual register HvRegisterVsmVina:

typedef union
{
    UINT64 AsUINT64;
    struct
    {
        UINT64 Vector : 8;
        UINT64 Enabled : 1;
        UINT64 AutoReset : 1;
        UINT64 AutoEoi : 1;
        UINT64 ReservedP : 53;
    };
} HV_REGISTER_VSM_VINA;

Каждый VTL у каждого президента имеет собственный экземпляр вина, а также собственную версию Хврегистервсмвина.Each VTL on each VP has its own VINA instance, as well as its own version of HvRegisterVsmVina. Средство вина создаст пограничным прерывание для текущего активного VTL, когда прерывание для более низкого уровня VTL готово к немедленной доставке.The VINA facility will generate an edge triggered interrupt to the currently active higher VTL when an interrupt for the lower VTL is ready for immediate delivery.

Чтобы предотвратить переполнение прерываний, возникающих при включении этого средства, средство вина включает некоторое ограниченное состояние.In order to prevent a flood of interrupts occurring when this facility is enabled, the VINA facility includes some limited state. При создании прерывания вина состояние устройства вина меняется на "утверждено".When a VINA interrupt is generated, the VINA facility’s state is changed to “Asserted.” Отправка конца прерывания в Синт, связанный с механизмом вина, не приведет к очистке состояния "утверждено".Sending an end-of-interrupt to the SINT associated with the VINA facility will not clear the “Asserted” state. Утвержденное состояние можно очистить только одним из двух способов:The asserted state can only be cleared in one of two ways:

  1. Состояние можно вручную очистить, записав в поле Винаассертед структуры HV_VP_VTL_CONTROL .The state can manually be cleared by writing to the VinaAsserted field of the HV_VP_VTL_CONTROL structure.
  2. Состояние автоматически снимается со следующей записи в VTL, если в регистре Хврегистервсмвина включен параметр автоматического сброса в записи VTL.The state is automatically cleared on the next entry to the VTL if the “auto-reset on VTL entry” option is enabled in the HvRegisterVsmVina register.

Это позволяет коду, работающему на безопасном VTLе, получать уведомления о первом прерывании, полученном для более низкого VTL.This allows code running at a secure VTL to just be notified of the first interrupt that is received for a lower VTL. Если защищенный VTL желает получать уведомления о дополнительных прерываниях, он может очистить поле Винаассертед на странице помощника по вице-президенту и будет уведомлен о следующем новом прерывании.If a secure VTL wishes to be notified of additional interrupts, it can clear the VinaAsserted field of the VP assist page, and it will be notified of the next new interrupt.

Безопасные перехватыSecure Intercepts

Гипервизор позволяет более высоко VTL устанавливать перехваты для событий, происходящих в контексте более низкого VTL.The hypervisor allows a higher VTL to install intercepts for events that take place in the context of a lower VTL. Это дает более Втлс более высокий уровень контроля над VTL ресурсами.This gives higher VTLs an elevated level of control over lower-VTL resources. Безопасные перехваты можно использовать для защиты критически важных для системы ресурсов и предотвращения атак с низким Втлс.Secure intercepts can be used to protect system-critical resources, and prevent attacks from lower-VTLs.

Защищенный перехват помещается в очередь на более высокий VTL, и этот VTL становится готов к работе в вице-президенте.A secure intercept is queued to the higher VTL, and that VTL is made runnable on the VP.

Безопасные типы перехватаSecure Intercept Types

Тип перехватаIntercept Type Конст применяется кIntercept Applies To
Доступ к памятиMemory access Попытка получить доступ к средствам защиты GPA, установленным более высоким VTL.Attempting to access GPA protections established by a higher VTL.
Управление доступом к региструControl register access Попытка доступа к набору контрольных регистров, заданных более высоким VTL.Attempting to access a set of control registers specified by a higher VTL.

Вложенные перехватыNested Intercepts

Несколько Втлс могут устанавливать безопасные перехваты для одного и того же события в более низком VTL.Multiple VTLs can install secure intercepts for the same event in a lower VTL. Таким же путем определяется иерархия, позволяющая решить, где будут уведомлены вложенные перехваты.Thus, a hierarchy is established to decide where nested intercepts are notified. Ниже приведен порядок, в котором уведомления перехватываются.The following list is the order of where intercept are notified:

  1. Нижняя VTLLower VTL
  2. Более высокая VTLHigher VTL

Обработка безопасных перехватовHandling Secure Intercepts

После получения уведомления VTL о безопасном перехвате оно должно предпринимать действия, чтобы более низкий VTL можно было продолжить.Once a VTL has been notified of a secure intercept, it must take action such that the lower VTL can continue. Более высокие VTL могут справиться с перехватом несколькими способами, включая: внедрение исключения, Эмуляция доступа или предоставление доступа к прокси.The higher VTL can handle the intercept in a number of ways, including: injecting an exception, emulating the access, or providing a proxy to the access. В любом случае, если необходимо изменить частное состояние младшего VTLго ВИЦЕd, следует использовать хвкаллсетвпрегистерс .In any case, if the private state of the lower VTL VP needs to be modified, HvCallSetVpRegisters should be used.

Перехваты безопасных регистровSecure Register Intercepts

Более высокий VTL может перехватывать доступ к определенным контрольным регистрам.A higher VTL can intercept on accesses to certain control registers. Это достигается путем настройки HvX64RegisterCrInterceptControl с помощью вызова хвкаллсетвпрегистерс .This is achieved by setting HvX64RegisterCrInterceptControl using the HvCallSetVpRegisters hypercall. Установка контрольного бита в HvX64RegisterCrInterceptControl запустит перехват для каждого доступа к соответствующему регистру управления.Setting the control bit in HvX64RegisterCrInterceptControl will trigger an intercept for every access of the corresponding control register.

typedef union
{
    UINT64 AsUINT64;
    struct
    {
        UINT64 Cr0Write : 1;
        UINT64 Cr4Write : 1;
        UINT64 XCr0Write : 1;
        UINT64 IA32MiscEnableRead : 1;
        UINT64 IA32MiscEnableWrite : 1;
        UINT64 MsrLstarRead : 1;
        UINT64 MsrLstarWrite : 1;
        UINT64 MsrStarRead : 1;
        UINT64 MsrStarWrite : 1;
        UINT64 MsrCstarRead : 1;
        UINT64 MsrCstarWrite : 1;
        UINT64 ApicBaseMsrRead : 1;
        UINT64 ApicBaseMsrWrite : 1;
        UINT64 MsrEferRead : 1;
        UINT64 MsrEferWrite : 1;
        UINT64 GdtrWrite : 1;
        UINT64 IdtrWrite : 1;
        UINT64 LdtrWrite : 1;
        UINT64 TrWrite : 1;
        UINT64 MsrSysenterCsWrite : 1;
        UINT64 MsrSysenterEipWrite : 1;
        UINT64 MsrSysenterEspWrite : 1;
        UINT64 MsrSfmaskWrite : 1;
        UINT64 MsrTscAuxWrite : 1;
        UINT64 MsrSgxLaunchControlWrite : 1;
        UINT64 RsvdZ : 39;
    };
} HV_REGISTER_CR_INTERCEPT_CONTROL;

Регистры маскиMask Registers

Чтобы обеспечить более точный контроль, подмножество контрольных регистров также имеет соответствующие регистры маски.To allow for finer control, a subset of control registers also have corresponding mask registers. Регистры маски можно использовать для установки перехватов на подмножестве соответствующих контрольных регистров.Mask registers can be used to install intercepts on a subset of the corresponding control registers. Если регистр маски не определен, любой доступ (как определено HvX64RegisterCrInterceptControl) запустит перехват.Where a mask register is not defined, any access (as defined by HvX64RegisterCrInterceptControl) will trigger an intercept.

Гипервизор поддерживает следующие регистры маски: HvX64RegisterCrInterceptCr0Mask, HvX64RegisterCrInterceptCr4Mask и HvX64RegisterCrInterceptIa32MiscEnableMask.The hypervisor supports the following mask registers: HvX64RegisterCrInterceptCr0Mask, HvX64RegisterCrInterceptCr4Mask and HvX64RegisterCrInterceptIa32MiscEnableMask.

DMA и устройстваDMA and Devices

Устройства эффективно имеют тот же уровень привилегий, что и VTL0.Devices effectively have the same privilege level as VTL0. Когда VSM включен, вся выделенная устройством память помечается как VTL0.When VSM is enabled, all device-allocated memory is marked as VTL0. Все доступы через DMA имеют те же привилегии, что и VTL0.Any DMA accesses have the same privileges as VTL0.