Виртуальные процессорыVirtual Processors

В каждой секции может быть не более одного виртуального процессора.Each partition may have zero or more virtual processors.

Индексы виртуального процессораVirtual Processor Indices

Виртуальный процессор определяется кортежем, состоящим из идентификатора его секции и его индекса процессора.A virtual processor is identified by a tuple composed of its partition ID and its processor index. Индекс процессора назначается виртуальному процессору при его создании и не изменяется с течением времени существования виртуального процессора.The processor index is assigned to the virtual processor when it is created, and it is unchanged through the lifetime of the virtual processor.

В некоторых ситуациях можно использовать специальное значение HV_ANY_VP для указания "любого виртуального процессора".A special value HV_ANY_VP can be used in certain situations to specify “any virtual processor”. Значение HV_VP_INDEX_SELF можно использовать для указания собственного индекса вице-президента.A value of HV_VP_INDEX_SELF can be used to specify one’s own VP index.

typedef UINT32 HV_VP_INDEX;

#define HV_ANY_VP ((HV_VP_INDEX)-1)

#define HV_VP_INDEX_SELF ((HV_VP_INDEX)-2)

Идентификатор виртуального процессора может быть извлечен гостевым сервером через определяемый гипервизором MSR (регистр, зависящий от модели) HV_X64_MSR_VP_INDEX.A virtual processor’s ID can be retrieved by the guest through a hypervisor-defined MSR (model-specific register) HV_X64_MSR_VP_INDEX.

#define HV_X64_MSR_VP_INDEX 0x40000002

Состояние бездействия виртуального процессора в состоянии снаVirtual Processor Idle Sleep State

Виртуальные процессоры могут быть переведены в состояние "виртуальное бездействие процессора" или "состояние сна процессора".Virtual processors may be placed in a virtual idle processor power state, or processor sleep state. Это Расширенное состояние простоя виртуальной среды позволяет пробуждении виртуальному процессору, который находится в состоянии низкого энергосбережения, получать прерывание, даже если прерывание маскируется на виртуальном процессоре.This enhanced virtual idle state allows a virtual processor that is placed into a low power idle state to be woken with the arrival of an interrupt even when the interrupt is masked on the virtual processor. Иными словами, состояние простоя виртуальной машины позволяет операционной системе в гостевом разделе воспользоваться преимуществами процессорных методов энергосбережения в ОС, которые в противном случае будут недоступны при работе в гостевом разделе.In other words, the virtual idle state allows the operating system in the guest partition to take advantage of processor power saving techniques in the OS that would otherwise be unavailable when running in a guest partition.

Секция, которая владеет привилегией Акцессгуестидлемср, может активировать запись в состояние ожидания простоя виртуального процессора с помощью считывания в MSR, определяемый гипервизором HV_X64_MSR_GUEST_IDLE .A partition which possesses the AccessGuestIdleMsr privilege may trigger entry into the virtual processor idle sleep state through a read to the hypervisor-defined MSR HV_X64_MSR_GUEST_IDLE. Виртуальный процессор будет пробуждении при наступлении прерывания, независимо от того, включено ли это прерывание на виртуальном процессоре.The virtual processor will be woken when an interrupt arrives, regardless of whether the interrupt is enabled on the virtual processor or not.

Страница помощи по виртуальному процессоруVirtual Processor Assist Page

Гипервизор предоставляет страницу на виртуальный процессор, который перемещается в гостевом пространстве GPA.The hypervisor provides a page per virtual processor which is overlaid on the guest GPA space. Эту страницу можно использовать для двунаправленного обмена данными между виртуальным вице-гостем и гипервизором.This page can be used for bi-directional communication between a guest VP and the hypervisor. Гостевая ОС имеет доступ на чтение и запись к этой странице помощи по виртуальной машине.The guest OS has read/write access to this virtual VP assist page.

Гость определяет расположение страницы оверлея (в пространстве GPA), записывая в виртуальное пространство для помощи MSR (0x40000073).A guest specifies the location of the overlay page (in GPA space) by writing to the Virtual VP Assist MSR (0x40000073). Формат MSR страницы помощника по виртуальным вице-президента выглядит следующим образом:The format of the Virtual VP Assist Page MSR is as follows:

BitsBits ПолеField ОписаниеDescription
00 ВключитьEnable Включает страницу помощи по вице-президентуEnables the VP assist page
11:111:1 рсвдпRsvdP ЗарезервированоReserved
63:1263:12 Страница PFNPage PFN PFN страницы помощи по виртуальным вице-президентамVirtual VP Assist Page PFN

Регистрация времени выполнения виртуального процессораVirtual Processor Run Time Register

Планировщик низкоуровневой оболочки внутренне отслеживает, сколько времени используется каждым виртуальным процессором в исполняемом коде.The hypervisor’s scheduler internally tracks how much time each virtual processor consumes in executing code. Отслеживание времени является сочетание времени, затраченного виртуальным процессором на выполнение гостевого кода, и времени, которое связанный логический процессор тратит на выполнение кода гипервизора от имени этого гостя.The time tracked is a combination of the time the virtual processor consumes running guest code, and the time the associated logical processor spends running hypervisor code on behalf of that guest. Это совокупное время доступно через 64-разрядный HV_X64_MSR_VP_RUNTIME низкоуровневой оболочки MSR.This cumulative time is accessible through the 64-bit read-only HV_X64_MSR_VP_RUNTIME hypervisor MSR. Количество времени измеряется в единицах 100 нс.The time quantity is measured in 100ns units.

Предотвращение выполнения инструкций без привилегированных (НПИЕП)Non-Privileged Instruction Execution Prevention (NPIEP)

Непривилегированное выполнение инструкций (НПИЕП) — это функция, которая ограничивает использование определенных инструкций кодом пользовательского режима.Non-Privileged Instruction Execution (NPIEP) is a feature that limits the use of certain instructions by user-mode code. В частности, при включении эта функция может блокировать выполнение инструкций СИДТ, СГДТ, СЛДТ и STR.Specifically, when enabled, this feature can block the execution of the SIDT, SGDT, SLDT, and STR instructions. Выполнение этих инструкций приводит к ошибке #GP.Execution of these instructions results in a #GP fault.

Эта функция должна быть настроена отдельно для каждого президента с помощью HV_X64_MSR_NPIEP_CONFIG_CONTENTS.This feature must be configured on a per-VP basis using HV_X64_MSR_NPIEP_CONFIG_CONTENTS.

Гостевая спин-блокировкиGuest Spinlocks

Типичная многопроцессорная операционная система использует блокировки для реализации атомарности определенных операций.A typical multiprocessor-capable operating system uses locks for enforcing atomicity of certain operations. При запуске такой операционной системы внутри виртуальной машины, управляемой гипервизором, эти критические разделы, защищенные с помощью блокировок, могут быть расширены с помощью перехватов, созданных критическим кодом раздела.When running such an operating system inside a virtual machine controlled by the hypervisor these critical sections protected by locks can be extended by intercepts generated by the critical section code. Код критического раздела также может быть вытеснен планировщиком низкоуровневой оболочки.The critical section code may also be preempted by the hypervisor scheduler. Хотя гипервизор пытается предотвратить такие прерывания, они могут возникнуть.Although the hypervisor attempts to prevent such preemptions, they can occur. Следовательно, другие средства блокирования блокировки могут закончиться до тех пор, пока не будет снова запланировано повторное завершение блокировки и, следовательно, значительно продлит время получения спин-блокировки.Consequently, other lock contenders could end up spinning until the lock holder is re-scheduled again and therefore significantly extend the spinlock acquisition time.

Низкоуровневая оболочка показывает, сколько раз будет предпринята попытка приобретения спин-блокировки, чтобы указать на низкоуровневая оболочку чрезмерную ситуацию.The hypervisor indicates to the guest OS the number of times a spinlock acquisition should be attempted before indicating an excessive spin situation to the hypervisor. Это число возвращается в окне CPUID конечный 0x40000004.This count is returned in CPUID leaf 0x40000004.

Вызов хвкаллнотифилонгспинваит предоставляет интерфейс для поддержкой гостей, чтобы улучшить статистическое свойство равномерности блокировки для многопроцессорных виртуальных машин.The HvCallNotifyLongSpinWait hypercall provides an interface for enlightened guests to improve the statistical fairness property of a lock for multiprocessor virtual machines. Гостевая виртуальная машина должна принимать это уведомление при каждом из нескольких рекомендуемых счетчиков, возвращенных 0x40000004 конечными элементами CPUID.The guest should make this notification on every multiple of the recommended count returned by CPUID leaf 0x40000004. С помощью этого вызова гостевая ОС уведомляет гипервизор о длительном получении спин-блокировки.Through this hypercall, a guest notifies the hypervisor of a long spinlock acquisition. Это позволяет гипервизору принимать более качественные решения по планированию.This allows the hypervisor to make better scheduling decisions.