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

Гипервизор прерывает доставку прерываний виртуальным процессорам.The hypervisor virtualizes interrupt delivery to virtual processors. Это делается с помощью искусственного контроллера прерываний (Синик), который является расширением виртуализованного локального APIC; то есть каждый виртуальный процессор имеет локальный экземпляр APIC с расширениями Синик.This is done through the use of a synthetic interrupt controller (SynIC) which is an extension of a virtualized local APIC; that is, each virtual processor has a local APIC instance with the SynIC extensions. Эти расширения предоставляют простой механизм связи между разделами, который описан в следующей главе.These extensions provide a simple inter-partition communication mechanism which is described in the following chapter. Прерывания, доставленные в секцию, делятся на две категории: внешние и внутренние.Interrupts delivered to a partition fall into two categories: external and internal. Внешние прерывания исходят от других разделов или устройств, а внутренние прерывания происходят в самой секции.External interrupts originate from other partitions or devices, and internal interrupts originate from within the partition itself.

Внешние прерывания создаются в следующих ситуациях.External interrupts are generated in the following situations:

  • Физическое аппаратное устройство создает аппаратное прерывание.A physical hardware device generates a hardware interrupt.
  • Родительский раздел утверждает виртуальный прерывание (обычно в процессе эмуляции аппаратного устройства).A parent partition asserts a virtual interrupt (typically in the process of emulating a hardware device).
  • Гипервизор доставляет сообщение (например, из-за перехвата) в секцию.The hypervisor delivers a message (for example, due to an intercept) to a partition.
  • Другой раздел отправляет сообщение.Another partition posts a message.
  • Другой раздел сигнализирует о событии.Another partition signals an event.

Внутренние прерывания создаются в следующих ситуациях.Internal interrupts are generated in the following situations:

  • Виртуальный процессор обращается к реестру команд прерываний APIC (интеллектуального).A virtual processor accesses the APIC interrupt command register (ICR).
  • Срок действия искусственного таймера истекает.A synthetic timer expires.

Локальный APICLocal APIC

Синик — это надмножество локального контроллера APIC.The SynIC is a superset of a local APIC. Интерфейс для этого APIC предоставляется набором сопоставленных регистров 32-битной памяти.The interface to this APIC is given by a set of 32-bit memory mapped registers. Этот локальный контроллер APIC (включая поведение сопоставленных с памятью регистров) обычно совместим с локальным APIC в системах P4/Xeon, как описано в документации Intel и AMD.This local APIC (including the behavior of the memory mapped registers) is generally compatible with the local APIC on P4/Xeon systems as described in Intel’s and AMD's documentation.

Локальная виртуализация APIC в гипервизоре может отклоняться от физической операции APIC с помощью следующих незначительных способов:The hypervisor’s local APIC virtualization may deviate from physical APIC operation in the following minor ways:

  • В физических системах IA32_APIC_BASE MSR может отличаться для каждого процессора в системе.On physical systems, the IA32_APIC_BASE MSR can be different for each processor in the system. Гипервизор может потребовать, чтобы этот MSR содержал одинаковое значение для всех виртуальных процессоров в пределах секции.The hypervisor may require that this MSR contains the same value for all virtual processors within a partition. Таким образом, MSR может рассматриваться как значение на уровне раздела.As such, this MSR may be treated as a partition-wide value. Если виртуальный процессор изменяет этот регистр, значение может эффективно распространяться на все виртуальные процессоры в пределах секции.If a virtual processor modifies this register, the value may effectively propagate to all virtual processors within the partition.
  • IA32_APIC_BASE MSR определяет бит глобального включения для включения или отключения APIC.The IA32_APIC_BASE MSR defines a “global enable” bit for enabling or disabling the APIC. Виртуализованный APIC всегда может быть включен.The virtualized APIC may always be enabled. Если да, то этот бит всегда будет иметь значение 1.If so, this bit will always be set to 1.
  • Локальный APIC гипервизора не сможет создать виртуальные SMIs (прерывания управления системой).The hypervisor’s local APIC may not be able to generate virtual SMIs (system management interrupts).
  • Если нескольким виртуальным процессорам в Секции назначаются одинаковые идентификаторы APIC, поведение целевой доставки прерываний будет привязано к неопределенному.If multiple virtual processors within a partition are assigned identical APIC IDs, behavior of targeted interrupt delivery is boundedly undefined. То есть гипервизор может свободно доставлять прерывание только одному виртуальному процессору, всем виртуальным процессорам с указанным ИДЕНТИФИКАТОРом APIC или без виртуальных процессоров.That is, the hypervisor is free to deliver the interrupt to just one virtual processor, all virtual processors with the specified APIC ID, or no virtual processors. Такая ситуация рассматривается как ошибка при программировании на гостевую систему.This situation is considered a guest programming error.
  • Доступ к некоторым реестрам APIC, сопоставленным с памятью, может осуществляться с помощью Virtual MSRs.Some of the memory mapped APIC registers may be accessed by way of virtual MSRs.
  • Гипервизор может не допускать изменения идентификаторов APIC гостя.The hypervisor may not allow a guest to modify its APIC IDs.

В остальных частях этого раздела описываются только те аспекты функций Синик, которые являются расширениями локального контроллера APIC.The remaining parts of this section describe only those aspects of SynIC functionality that are extensions of the local APIC.

Доступ к локальным MSR контроллера APICLocal APIC MSR Accesses

Гипервизор обеспечивает ускоренный доступ к MSR для сопоставленных с памятью регистров APIC с высоким уровнем использования.The hypervisor provides accelerated MSR access to high usage memory mapped APIC registers. Это ТПР, ЕОИ и интеллектуального registers.These are the TPR, EOI, and the ICR registers. Старшие регистры интеллектуального Low и интеллектуального объединены в один MSR.The ICR low and ICR high registers are combined into one MSR. По соображениям производительности гостевая операционная система должна следовать рекомендациям гипервизора для использования APIC MSRs.For performance reasons, the guest operating system should follow the hypervisor recommendation for the usage of the APIC MSRs.

Адрес MSRMSR address Имя регистраRegister Name ОписаниеDescription
0x400000700x40000070 HV_X64_MSR_EOIHV_X64_MSR_EOI Обращается к APIC ЕОИAccesses the APIC EOI
0x400000710x40000071 HV_X64_MSR_ICRHV_X64_MSR_ICR Обращается к APIC интеллектуального-High и интеллектуального-LowAccesses the APIC ICR-high and ICR-low
0x400000720x40000072 HV_X64_MSR_TPRHV_X64_MSR_TPR Доступ к APIC ТПРAccess the APIC TPR

HV_X64_MSR_EOIHV_X64_MSR_EOI

BitsBits ОписаниеDescription АтрибутыAttributes
63:3263:32 Рсвдз (зарезервированный, должно равняться нулю)RsvdZ (reserved, should be zero) записьWrite
31:031:0 Значение ЕОИEOI value записьWrite

HV_X64_MSR_ICRHV_X64_MSR_ICR

BitsBits ОписаниеDescription АтрибутыAttributes
63:3263:32 ИНТЕЛЛЕКТУАЛЬНОГО, высокое значениеICR high value Чтение и записьRead / Write
31:031:0 ИНТЕЛЛЕКТУАЛЬНОГО низкое значениеICR low value Чтение и записьRead / Write

HV_X64_MSR_TPRHV_X64_MSR_TPR

BitsBits ОписаниеDescription АтрибутыAttributes
63:863:8 Рсвдз (зарезервированный, должно равняться нулю)RsvdZ (reserved, should be zero) Чтение и записьRead / Write
7:07:0 Значение ТПРTPR value Чтение и записьRead / Write

Этот MSR предназначен для ускорения доступа к ТПР в гостевых секциях 32-разрядного режима.This MSR is intended to accelerate access to the TPR in 32-bit mode guest partitions. в 64-разрядном режиме гостевые секции должны устанавливать ТПР с помощью CR8.64-bit mode guest partitions should set the TPR by way of CR8.

Искусственный кластер IPISynthetic Cluster IPI

Гипервизор поддерживает вызовы, которые позволяют отправить виртуальные фиксированные прерывания в произвольный набор виртуальных процессоров.A hypervisor supports hypercalls which allow to send virtual fixed interrupts to an arbitrary set of virtual processors.

ГипервызоваHypercall ОписаниеDescription
хвкаллсендсинсетикклустерипиHvCallSendSyntheticClusterIpi Отправляет виртуальное фиксированное прерывание указанному виртуальному набору процессоров.Sends a virtual fixed interrupt to the specified virtual processor set.
хвкаллсендсинсетикклустерипиексHvCallSendSyntheticClusterIpiEx Как и в случае с Хвкаллсендсинсетикклустерипи, в качестве входных данных принимается разреженный вице-президент.Similar to HvCallSendSyntheticClusterIpi, takes a sparse VP set as input.

Помощь ЕОИEOI Assist

Одним полем на странице "помощь виртуального процессора " является поле еои Assist (помощь).One field in the Virtual Processor Assist Page is the EOI Assist field. Поле ЕОИ Assist находится по смещению 0 страницы наложения и имеет размер 32 бит.The EOI Assist field resides at offset 0 of the overlay page and is 32-bits in size. Формат поля ЕОИ Assist выглядит следующим образом:The format of the EOI assist field is as follows:

BitsBits ОписаниеDescription АтрибутыAttributes
31:131:1 рсвдзRsvdZ Чтение и записьRead / Write
00 ЕОИ не требуетсяNo EOI Required Чтение и записьRead / Write

Гостевая ОС выполняет ЕОИ, атомарно записывая нулевое значение в поле ЕОИ Assist на странице помощника по виртуальному вице-президенту и проверяя, было ли значение поля "нет ЕОИ обязательно" ранее.The guest OS performs an EOI by atomically writing zero to the EOI Assist field of the virtual VP assist page and checking whether the “No EOI required” field was previously zero. Если это так, ОС должна выполнить запись в HV_X64_APIC_EOI MSR, тем самым запуская перехват в гипервизор.If it was, the OS must write to the HV_X64_APIC_EOI MSR thereby triggering an intercept into the hypervisor. Следующий код рекомендуется для выполнения ЕОИ:The following code is recommended to perform an EOI:

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

mov ecx, HV_X64_APIC_EOI
wrmsr

NoEoiRequired:

Гипервизор устанавливает бит "нет необходимости в ЕОИ", когда он вставляет виртуальный прерывание при соблюдении следующих условий.The hypervisor sets the “No EOI required” bit when it injects a virtual interrupt if the following conditions are satisfied:

  • Виртуальное прерывание инициируется с помощью пограничных триггеров иThe virtual interrupt is edge-triggered, and
  • Нет ожидающих прерываний с низким приоритетомThere are no lower priority interrupts pending

Если позже запрашивается прерывание с более низким приоритетом, низкоуровневая оболочка снимает «ЕОИ Required» таким, что последующий ЕОИ вызывает перехват.If, at a later time, a lower priority interrupt is requested, the hypervisor clears the “No EOI required” such that a subsequent EOI causes an intercept.

В случае вложенных прерываний перехват ЕОИ исключается только для прерываний с наивысшим приоритетом.In case of nested interrupts, the EOI intercept is avoided only for the highest priority interrupt. Это необходимо, так как количество ЕОИС, выполненных операционной системой, не поддерживается.This is necessary since no count is maintained for the number of EOIs performed by the OS. Таким образом, можно избежать появления только первых ЕОИ, поскольку первый ЕОИ очищает бит "нет ЕОИ обязательно", а следующий ЕОИ создает перехват.Therefore only the first EOI can be avoided and since the first EOI clears the “No EOI Required” bit, the next EOI generates an intercept. Однако вложенные прерывания редки, поэтому это не является проблемой в общем случае.However nested interrupts are rare, so this is not a problem in the common case.

Обратите внимание, что устройства и (или) APIC ввода-вывода (физический или искусственный) не должны получать уведомления о ЕОИ для прерывания, активируемого с помощью пограничной оболочки. гипервизор перехватывает такие ЕОИС только для обновления виртуального состояния APIC.Note that devices and/or the I/O APIC (physical or synthetic) need not be notified of an EOI for an edge-triggered interrupt – the hypervisor intercepts such EOIs only to update the virtual APIC state. В некоторых случаях виртуальное состояние APIC может быть отложенным обновлением — в таких случаях бит "Ноеоирекуиред" задается гипервизором, указывающим на гостя, что не требуется перехватывать ЕОИ.In some cases, the virtual APIC state can be lazily updated – in such cases, the “NoEoiRequired” bit is set by the hypervisor indicating to the guest that an EOI intercept is not necessary. В дальнейшем гипервизор может наследовать состояние локального APIC в зависимости от текущего значения бита "Ноеоирекуиред".At a later instant, the hypervisor can derive the state of the local APIC depending on the current value of the “NoEoiRequired” bit.

Включение и отключение этого просвещение можно выполнять в любое время независимо от активности прерываний и состояния APIC.Enabling and disabling this enlightenment can be done at any time independently of the interrupt activity and the APIC state at that moment. Несмотря на то, что просвещение включен, стандартные ЕОИС можно выполнять независимо от значения "нет ЕОИ Required", но они не приводят к повышению производительности просвещение.While the enlightenment is enabled, conventional EOIs can still be performed irrespective of the “No EOI required” value but they will not realize the performance benefit of the enlightenment.