Виртуальный контроллер прерываний

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

Architecture-Specific контроллеры виртуальных прерываний

На платформах x64

На платформах x64 виртуализация прерываний выполняется с помощью искусственного контроллера прерываний (SynIC), который является расширением виртуализированного локального APIC; То есть каждый виртуальный процессор имеет локальный экземпляр APIC с расширениями SynIC. Эти расширения предоставляют простой механизм обмена данными между секциями, описанный в разделе Inter-Partition коммуникации .

На платформах ARM64

На платформах ARM64 гипервизор предоставляет виртуальный универсальный контроллер прерываний ARM (GIC), соответствующий спецификации архитектуры ARM GIC. Гостевые секции должны ссылаться на спецификацию архитектуры ARM GIC для получения сведений о виртуальном интерфейсе GIC, регистрах и механизмах обработки прерываний.

Категории прерываний

Прерывания, доставленные в секцию, делятся на две категории: внешние и внутренние. Внешние прерывания происходят из других секций или устройств, а внутренние прерывания происходят из самой секции.

Внешние прерывания создаются в следующих ситуациях:

  • Физическое аппаратное устройство создает прерывание оборудования.
  • Родительская секция утверждает виртуальное прерывание (обычно в процессе эмулирования аппаратного устройства).
  • Гипервизор передает сообщение (например, из-за перехвата) в секцию.
  • Другая секция публикует сообщение.
  • Другой раздел сигнализирует о событии.

Внутренние прерывания создаются в следующих ситуациях:

  • Виртуальный процессор обращается к регистру команды прерывания APIC (ICR).
  • Срок действия искусственного таймера истекает.

Локальный APIC (только x64)

На платформах x64 SynIC является супермножеством локального APIC. Интерфейс для этого APIC предоставляется набором 32-разрядных регистров, сопоставленных с памятью. Этот локальный APIC (включая поведение сопоставленных регистров памяти) обычно совместим с локальными APIC в системах P4/Xeon, как описано в документации Intel и AMD.

Локальная виртуализация APIC гипервизора может отличаться от физической операции APIC следующими незначительными способами:

  • В физических системах IA32_APIC_BASE MSR может отличаться для каждого процессора в системе. Гипервизор может потребовать, чтобы эта MSR содержала одинаковое значение для всех виртуальных процессоров в разделе. Таким образом, этот MSR может рассматриваться как значение на уровне секций. Если виртуальный процессор изменяет этот регистр, это значение может эффективно распространяться на все виртуальные процессоры в разделе.
  • IA32_APIC_BASE MSR определяет бит глобального включения для включения или отключения APIC. Виртуализированный APIC всегда может быть включен. Если это так, этот бит всегда будет иметь значение 1.
  • Локальный API-интерфейс гипервизора может не создавать виртуальные SMIs (прерывания управления системой).
  • Если несколько виртуальных процессоров в секции назначаются идентичным идентификаторам APIC, поведение целевой доставки прерываний не определено. То есть гипервизор является бесплатным для доставки прерывания только одному виртуальному процессору, всем виртуальным процессорам с указанным идентификатором APIC или без виртуальных процессоров. Эта ситуация считается ошибкой гостевого программирования.
  • Некоторые регистры APIC, сопоставленных с памятью, могут быть доступны с помощью виртуальных MSR.
  • Гипервизор может не позволить гостевой изменять идентификаторы APIC.

Остальные части этого раздела описывают только те аспекты функций SynIC, которые являются расширениями локального APIC.

Доступ к локальным APIC MSR (только x64)

На платформах x64 гипервизор обеспечивает ускоренный доступ MSR к регистрам APIC с высоким уровнем использования. Это регистры TPR, EOI и ICR. Низкие и высокие регистры ICR объединяются в одну MSR. По соображениям производительности гостевая операционная система должна следовать рекомендациям гипервизора по использованию MSR APIC.

Эти MSR недоступны на платформах ARM64, где операции контроллера прерываний выполняются через виртуальный интерфейс GIC.

АДРЕС MSR Имя регистрации Description
0x40000070 HV_X64_MSR_EOI Обращается к APIC EOI
0x40000071 HV_X64_MSR_ICR Обращается к APIC ICR-high и ICR-low
0x40000072 HV_X64_MSR_TPR Доступ к APIC TPR

HV_X64_MSR_EOI

Биты Description Attributes
63:32 RsvdZ (зарезервировано, должно быть равно нулю) Напишите
31:0 Значение EOI Напишите

HV_X64_MSR_ICR

Биты Description Attributes
63:32 Высокое значение ICR Чтение и запись
31:0 Низкое значение ICR Чтение и запись

HV_X64_MSR_TPR

Биты Description Attributes
63:8 RsvdZ (зарезервировано, должно быть равно нулю) Чтение и запись
7:0 Значение TPR Чтение и запись

Эта MSR предназначена для ускорения доступа к TPR в 32-разрядных гостевых секциях режима. Гостевые секции в 64-разрядном режиме должны задавать TPR путем CR8.

IPI искусственного кластера

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

Гиперколл Description
HvCallSendSendSyntheticClusterIpi Отправляет виртуальное фиксированное прерывание в указанный набор виртуальных процессоров.
HvCallSendSendSyntheticClusterIpiEx Аналогично HvCallSendSendSyntheticClusterIpi, принимает разреженный набор VP в качестве входных данных.

EOI Assist (только x64)

На платформах x64 одно поле на странице поддержки виртуального процессора — это поле EOI Assist. Поле EOI Assist находится в смещение 0 страницы наложения и имеет размер 32 бита. Формат поля поддержки EOI выглядит следующим образом:

Это просвещение недоступно на платформах ARM64, где операции EOI выполняются через виртуальный интерфейс GIC.

Биты Description Attributes
31:1 RsvdZ Чтение и запись
0 Не требуется EOI Чтение и запись

Гостевая ОС выполняет EOI, атомарно записывая ноль в поле EOI Assist на странице поддержки виртуального виртуального VP и проверяя, не требуется ли ранее поле "Не требуется EOI". Если это так, ОС должна записываться в HV_X64_MSR_EOI MSR, тем самым активируя перехват в гипервизор. Для выполнения EOI рекомендуется выполнить следующий код:

lea rcx, [VirtualApicAssistVa]
btr [rcx], 0
jc NoEoiRequired

mov ecx, HV_X64_MSR_EOI
wrmsr

NoEoiRequired:

Гипервизор задает бит "No EOI required" при внедрении виртуального прерывания, если выполнены следующие условия:

  • Виртуальная прерывания активируется по краям и
  • Ожидающие прерывания с более низким приоритетом отсутствуют

Если в дальнейшем запрашивается прерывание с более низким приоритетом, гипервизор очищает значение "Нет необходимого EOI", что последующий EOI вызывает перехват.

В случае вложенных прерываний перехват EOI избегается только для прерывания с наивысшим приоритетом. Это необходимо, так как количество не поддерживается для количества EOIs, выполняемых ОС. Поэтому можно избежать только первого EOI, и так как первый EOI очищает бит "No EOI Required", следующий EOI создает перехват. Однако вложенные прерывания редки, поэтому это не проблема в обычном случае.

Обратите внимание, что устройства и (или) API ввода-вывода (физические или синтетические) не должны получать уведомления об EOI для прерывания, активируемого на границе, — гипервизор перехватывает такие EOIs только для обновления состояния виртуального APIC. В некоторых случаях состояние виртуального APIC может быть лениво обновлено. В таких случаях бит NoEoiRequired задается гипервизором, указывающим на гостя, что перехват EOI не требуется. В дальнейшем гипервизор может наследовать состояние локального APIC в зависимости от текущего значения бита NoEoiRequired.

Включение и отключение этого просвещения можно сделать в любое время независимо от действия прерывания и состояния APIC в данный момент. Хотя просвещение включено, обычные EOIs по-прежнему могут выполняться независимо от значения "Нет необходимого EOI", но они не будут реализовывать преимущества производительности просвещения.