Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Каждая секция может иметь ноль или несколько виртуальных процессоров.
Индексы виртуальных процессоров
Виртуальный процессор определяется кортежем, состоящим из идентификатора секции и его индекса процессора. Индекс процессора назначается виртуальному процессору при его создании и не изменяется в течение времени существования виртуального процессора.
Специальное значение 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)
На платформах x64
На платформах x64 идентификатор виртуального процессора может быть получен гостем через определяемый гипервизором MSR (регистр для конкретной модели) HV_X64_MSR_VP_INDEX с помощью RDMSR.
#define HV_X64_MSR_VP_INDEX 0x40000002
На платформах ARM64
На платформах ARM64 идентификатор виртуального процессора можно получить с помощью искусственного регистра HvRegisterVpIndex с помощью гиперкела HvCallGetVpRegisters. Это регистр только для чтения.
Состояние спящего режима виртуального процессора (только x64)
На платформах x64 виртуальные процессоры могут размещаться в состоянии питания виртуального бездействия процессора или состояния спящего режима процессора. Это расширенное состояние простоя виртуальной среды позволяет виртуальному процессору, помещенном в состояние простоя с низким питанием, проснуться с появлением прерывания, даже если прерывание маскируется на виртуальном процессоре. Другими словами, состояние виртуального простоя позволяет операционной системе в гостевой секции использовать методы экономии питания процессора в ОС, которые в противном случае будут недоступны при выполнении в гостевой секции.
Секция, которая обладает привилегией AccessGuestIdleMsr, может активировать вход в состояние простоя виртуального процессора через чтение в определяемую гипервизором MSR HV_X64_MSR_GUEST_IDLE. Виртуальный процессор будет проснут при поступлении прерывания независимо от того, включено ли прерывание на виртуальном процессоре.
Эта функция недоступна на платформах ARM64.
Страница поддержки виртуального процессора
Гипервизор предоставляет страницу на виртуальный процессор, который накладывается на гостевое пространство GPA. Эта страница может использоваться для двунаправленного взаимодействия между гостевой виртуальной машиной и гипервизором. Гостевая ОС имеет доступ на чтение и запись на эту страницу поддержки виртуального VP.
Структура страницы поддержки VP определяется в HV_VP_ASSIST_PAGE. Некоторые поля в этой структуре зависят от архитектуры.
На платформах x64
На платформах x64 гость указывает расположение страницы наложения (в пространстве GPA), записав в виртуальную службу поддержки MSR (0x40000073) с помощью WRMSR. Формат MSR виртуальной страницы поддержки VP выглядит следующим образом:
| Биты | Поле | Description |
|---|---|---|
| 0 | Enable | Включает страницу поддержки VP |
| 11:1 | RsvdP | Зарезервировано |
| 63:12 | Страница PFN | Виртуальная страница поддержки VP |
На платформах ARM64
На платформах ARM64 гость указывает расположение страницы наложения (в пространстве GPA), записав в искусственный регистр HvRegisterVpAssistPage с помощью гиперквалю HvCallSetVpRegisters. Формат регистра идентичен формату MSR x64.
Регистрация времени выполнения виртуального процессора
Планировщик гипервизора внутренне отслеживает, сколько времени каждый виртуальный процессор потребляет в выполнении кода. Время отслеживания — это сочетание времени, когда виртуальный процессор использует гостевой код, и время, которое связанный логический процессор тратит на выполнение кода гипервизора от имени этого гостя. Это накопительное время доступно через регистр только для чтения. Количество времени измеряется в 100 единицах.
На платформах x64
На платформах x64 среда выполнения VP осуществляется через 64-разрядную версию HV_X64_MSR_VP_RUNTIME гипервизора MSR с помощью RDMSR.
На платформах ARM64
На платформах ARM64 среда выполнения VP обращается через искусственный регистр HvRegisterVpRuntime с помощью гиперклюза HvCallGetVpRegisters. Это регистр только для чтения.
Предотвращение выполнения не привилегированных инструкций (NPIEP) (только x64)
На платформах x64 предотвращение выполнения не привилегированных инструкций (NPIEP) — это функция, которая ограничивает использование определенных инструкций по коду пользовательского режима. В частности, при включении эта функция может блокировать выполнение инструкций SIDT, JSONT, SLDT и STR. Выполнение этих инструкций приводит к ошибке #GP.
Эта функция должна быть настроена на основе каждого VP с помощью HV_X64_MSR_NPIEP_CONFIG_CONTENTS.
Эта функция недоступна на платформах ARM64.
Гостевые спинлоки
Типичная многопроцессорная операционная система использует блокировки для применения атомарности определенных операций. При запуске такой операционной системы внутри виртуальной машины, управляемой гипервизором, эти критически важные разделы, защищенные блокировками, могут быть расширены перехватами, созданными кодом критического раздела. Код критического раздела также может быть предупрежен планировщиком гипервизора. Хотя гипервизор пытается предотвратить такие прерывания, они могут произойти. Следовательно, другие претенденты на блокировку могут в конечном итоге спиннинг до тех пор, пока держатель блокировки повторно запланирован и, следовательно, значительно продлить время приобретения спинлока.
Гипервизор указывает гостевой ОС количество попыток приобретения спинлока перед указанием чрезмерной ситуации спина в гипервизоре. Это число возвращается в конечных 0x40000004 ЦПID. Значение 0 указывает, что гостевая ОС не должна уведомлять гипервизора о приобретении длинного спинблока.
Гиперколл HvCallNotifyLongSpinWait предоставляет интерфейс для просвещенных гостей, чтобы улучшить статистическое свойство справедливости блокировки для многопроцессорных виртуальных машин. Гость должен сделать это уведомление для каждого из нескольких рекомендуемых счетчиков, возвращаемых конечным 0x40000004 ЦПID. Через этот гиперкалл гость уведомляет гипервизор о приобретении длинного спинлока. Это позволяет гипервизору принимать более лучшие решения по планированию.