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

Каждая секция может иметь ноль или несколько виртуальных процессоров.

Индексы виртуальных процессоров

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

В определенных ситуациях можно использовать специальное значение HV_ANY_VP для указания "любой виртуальный процессор". Значение HV_VP_INDEX_SELF можно использовать для указания собственного индекса VP.

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.

#define HV_X64_MSR_VP_INDEX 0x40000002

Состояние бездействия виртуального процессора в спящем режиме

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

Секция, обладающая привилегией AccessGuestIdleMsr, может активировать вход в состояние бездействия виртуального процессора через чтение в определяемую гипервизором MSR HV_X64_MSR_GUEST_IDLE. Виртуальный процессор будет разбудиться при поступлении прерывания, независимо от того, включено ли прерывание на виртуальном процессоре.

Страница поддержки виртуального процессора

Гипервизор предоставляет страницу для каждого виртуального процессора, которая наложена на гостевое пространство GPA. Эту страницу можно использовать для двунаправленного обмена данными между гостевым VP и гипервизором. Гостевая ОС имеет доступ на чтение и запись к этой странице поддержки виртуального VP.

Гость указывает расположение страницы наложения (в пространстве GPA), записывая в MSR (0x40000073) Виртуального VP Assist. Формат MSR страницы помощника виртуального VP выглядит следующим образом:

Bits Поле Описание
0 Включить Включает страницу поддержки VP
11:1 RsvdP Зарезервировано
63:12 PFN страницы PFN страницы помощника виртуального VP

Реестр времени выполнения виртуального процессора

Планировщик низкоуровневой оболочки внутренне отслеживает, сколько времени каждый виртуальный процессор занимает при выполнении кода. Отслеживаемое время — это сочетание времени, которое виртуальный процессор использует для выполнения гостевого кода, и времени, которое связанный логический процессор тратит на выполнение кода низкоуровневой оболочки от имени этого гостя. Это совокупное время доступно через 64-разрядную HV_X64_MSR_VP_RUNTIME низкоуровневой оболочки MSR, доступную только для чтения. Количество времени измеряется в единицах 100ns.

Предотвращение выполнения не привилегированных инструкций (NPIEP)

Выполнение не привилегированных инструкций (NPIEP) — это функция, которая ограничивает использование определенных инструкций в коде пользовательского режима. В частности, если эта функция включена, она может блокировать выполнение инструкций SIDT, SGDT, SLDT и STR. Выполнение этих инструкций приводит к сбою #GP.

Эта функция должна быть настроена для каждого VP с помощью HV_X64_MSR_NPIEP_CONFIG_CONTENTS.

Гостевые спин-блокировки

Типичная многопроцессорная операционная система использует блокировки для обеспечения атомарности определенных операций. При запуске такой операционной системы на виртуальной машине, управляемой гипервизором, эти критические разделы, защищенные блокировками, могут быть расширены перехватами, созданными кодом критического раздела. Код критического раздела также может быть вытеснен планировщиком низкоуровневой оболочки. Хотя гипервизор пытается предотвратить такие вытеснения, они могут произойти. Следовательно, другие претенденты на блокировку могут в конечном итоге спиннинг до тех пор, пока держатель блокировки повторно запланирован снова и, следовательно, значительно продлить время спин-блокировки приобретения.

Гипервизор указывает гостевой ОС, кратное количество попыток получения спин-блокировок, прежде чем указывать на чрезмерную ситуацию вращения низкоуровневой оболочки. Это число возвращается в конечной 0x40000004 CPUID. Значение 0 указывает, что гостевая ОС не должна уведомлять гипервизор о получении длительной спин-блокировки.

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