Обмен данными между секциями

Гипервизор предоставляет два простых механизма взаимодействия одной секции: сообщения и события. В обоих случаях уведомление сигнализируется с помощью SynIC (контроллера искусственных прерываний).

Сообщения SynIC

Гипервизор предоставляет простое средство обмена данными между секциями, позволяющее одной секции отправлять параметризованное сообщение в другую секцию. (Так как сообщение отправляется асинхронно, оно публикуется.) Целевая секция может быть уведомлена о поступлении этого сообщения через прерывание. Сообщения могут отправляться явным образом с помощью гиперкела HvCallPostMessage или неявно гипервизором.

Сообщения

При отправке сообщения гипервизор выбирает свободный буфер сообщений. Набор доступных буферов сообщений зависит от события, активировав отправку сообщения.

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

Затем гипервизор добавляет буфер сообщений в очередь получающих сообщений. Очередь получающих сообщений зависит от события, активировав отправку сообщения. Для всех типов сообщений SINTx является неявным (в случае перехвата сообщений), явным (в случае сообщений таймера) или указан идентификатором порта (в случае гостевых сообщений). Целевой виртуальный процессор либо явно указан, либо выбирается гипервизором при постановке сообщения в очередь. Виртуальные процессоры, чьи страницы SynIC или SIM отключены, не будут считаться потенциальными целевыми объектами. Если целевые объекты недоступны, гипервизор завершает операцию и возвращает вызывающей объекту ошибку.

Затем гипервизор определяет, является ли указанный слот сообщений SINTx на странице SIM-карты целевого виртуального процессора пустым. Если тип сообщения в слоте сообщения равен HvMessageTypeNone (то есть ноль), предполагается, что слот сообщения пуст. В этом случае гипервизор удаляет буфер сообщений и копирует его содержимое в слот сообщения на странице SIM-карты. Гипервизор может копировать только количество байтов полезных данных, связанных с сообщением. Гипервизор также пытается создать прерывание, активируемое ребрами, для указанного SINTx. Если APIC отключен или SINTx маскируется, прерывание будет потеряно. При поступлении этого прерывания гость уведомляет гостя о том, что пришло новое сообщение. Если sim-страница отключена или слот сообщения на SIM-странице не пуст, сообщение остается в очереди и не создается прерывание.

Как и при любом прерывании с фиксированным приоритетом, прерывание не подтверждается виртуальным процессором, пока PPR (регистр приоритета процесса) не будет меньше вектора, указанного в регистре SINTx, и прерывания не маскируются виртуальным процессором (rFLAGS[IF] имеет значение 1).

Несколько буферов сообщений с одинаковым SINTx можно помещать в очередь на виртуальный процессор. В этом случае гипервизор доставляет первое сообщение (т. е. записывает его на SIM-страницу) и оставляет остальные в очереди до тех пор, пока не произойдет одно из трех событий:

  • Другой буфер сообщений помещается в очередь.
  • Гость указывает "конец прерывания", записывая его в регистр EOI APIC.
  • Гость указывает "конец сообщения", записывая его в регистр EOM SynIC.

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

Страница SIM-карты

Страница SIM-карты состоит из массива из 16 элементов 256-байтовых сообщений (см. HV_MESSAGE структуру данных). Каждый элемент массива (также называемый слотом сообщения) соответствует одному источнику искусственных прерываний (SINTx). Слот сообщения считается пустым, если тип сообщения в слоте равен HvMessageTypeNone.

Адрес страницы SIM-карты указывается в регистре SIMP. Адрес страницы SIM-карты должен быть уникальным для каждого виртуального процессора. Программирование этих страниц для перекрытия других экземпляров страниц SIEF или SIM-карты или любой другой страницы наложения (например, страницы гиперклиона) приведет к неопределенному поведению.

Доступ на чтение и запись виртуальным процессором к странице SIM-карты ведет себя как доступ на чтение и запись к ОЗУ. Однако реализация SynIC гипервизора также записывает на страницы в ответ на определенные события.

После создания и сброса виртуального процессора страница SIM-карты очищается до нуля.

Механизм доставки сообщений SynIC предназначен для эффективной доставки и получения сообщений в целевой секции. Рекомендуется, чтобы обработка сообщений isR (подпрограмма службы прерываний) в целевой секции выполняла следующие действия:

  • Изучите сообщение, которое было помещено в слот SIM-сообщения.
  • Скопируйте содержимое сообщения в другое расположение и задайте для типа сообщения в слоте сообщения значение HvMessageTypeNone.
  • Укажите конец прерывания для вектора, записав его в регистр EOI APIC.
  • Выполните все действия, подразумеваемые сообщением.

Источники сообщений

Классы событий, которые могут активировать отправку сообщения, приведены ниже.

  • Перехваты: любой перехват в виртуальном процессоре приведет к отправке сообщения в родительский раздел или более высокий срок жизни.
  • Таймеры: механизмы таймера приводят к отправке сообщений. С каждым виртуальным процессором связаны четыре выделенных буфера сообщений таймера, по одному для каждого таймера. Очередь получающих сообщений принадлежит SINTx виртуального процессора, таймер которого активировал отправку сообщения.
  • Гостевые сообщения: гипервизор поддерживает передачу сообщений в качестве механизма обмена данными между гостями между разделами. Интерфейсы, определенные в этом разделе, позволяют одному гость отправлять сообщения другому гость. Буферы сообщений, используемые для сообщений этого класса, взятые из пула сообщений получателя для каждого порта буферов гостевых сообщений.

Буферы сообщений

Буфер сообщений используется внутри низкоуровневой оболочки для хранения сообщения, пока он не будет доставлен получателю. Гипервизор поддерживает несколько наборов буферов сообщений.

Буферы гостевых сообщений

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

Очереди буфера сообщений

Для каждой секции и каждого виртуального процессора в секции гипервизор поддерживает одну очередь буферов сообщений для каждого SINTx (источника искусственных прерываний) в SynIC виртуального процессора. Все очереди сообщений виртуального процессора пусты при создании или сбросе виртуального процессора.

Надежность и виртуализация буферов гостевых сообщений

Сообщения, успешно опубликованные гостем, были поставлены в очередь для доставки гипервизором. Фактическая доставка и прием целевой секцией зависят от правильной операции. Секции могут отключить доставку сообщений на определенные виртуальные процессоры, отключив SynIC или отключив SIMP.

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

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

Флаги событий SynIC

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

Флаги событий и сообщения

Флаги событий имеют меньший вес, чем сообщения, и поэтому ниже затраты. Кроме того, флаги событий не требуют выделения буфера или очереди в гипервизоре, поэтому HvCallSignalEvent никогда не завершится ошибкой из-за нехватки ресурсов.

Доставка флагов событий

Когда секция вызывает HvCallSignalEvent, он указывает номер флага события. Гипервизор реагирует атомарным образом, задав немного на странице SIEF принимающего виртуального процессора. Виртуальные процессоры, чьи страницы SynIC или SIEF отключены, не будут считаться потенциальными целевыми объектами. Если целевые объекты недоступны, гипервизор завершает операцию и возвращает вызывающей объекту ошибку.

Если флаг события был ранее снят, гипервизор пытается уведомить принимающую секцию о том, что флаг теперь задан путем создания прерывания, активируемого ребром. Целевой виртуальный процессор вместе с целевым SINTx указывается как часть создания порта. Если sinTx маскируется, HvSignalEvent возвращает HV_STATUS_INVALID_SYNIC_STATE.

Как и при любом внешнем прерывании с фиксированным приоритетом, прерывание не подтверждается виртуальным процессором, пока регистр приоритета процесса (PPR) меньше вектора, указанного в регистре SINTx, и прерывания не маскируются виртуальным процессором (rFLAGS[IF] имеет значение 1).

Страница SIEF

Страница SIEF состоит из 16-элементного массива флагов событий размером 256 байт (см. HV_SYNIC_EVENT_FLAGS). Каждый элемент массива соответствует одному искусственному источнику прерываний (SINTx).

Адрес страницы SIEF указывается в регистре SIEF. Адрес страницы SIEF должен быть уникальным для каждого виртуального процессора. Программирование этих страниц для перекрытия других экземпляров страниц SIEF или SIM-карты или любой другой страницы наложения (например, страница гиперклиона) приведет к неопределенному поведению.

Доступы на чтение и запись с помощью виртуального процессора на страницу SIEF ведут себя как доступ на чтение и запись к ОЗУ. Однако реализация SynIC гипервизора также записывает на страницы в ответ на определенные события.

После создания и сброса виртуального процессора страница SIEF очищается до нуля.

Рекомендуется, чтобы подпрограмма службы прерывания флага событий (ISR) в целевой секции выполняла следующие действия.

  • Изучите флаги событий и определите, какие из них заданы( если таковые имеются).
  • Снимите один или несколько флагов событий с помощью заблокированной (атомарной) операции, например LOCK AND или LOCK CMPXCHG.
  • Укажите конец прерывания для вектора, записав его в регистр EOI APIC.
  • Выполните все действия, подразумеваемые установленными флагами событий.

Порты и подключения

Сообщение или событие, отправляемое от одного гостя к другому, должно быть отправлено через предварительно выделенное подключение. Подключение, в свою очередь, должно быть связано с портом назначения.

Порт выделяется из пула памяти получателя и указывает, какой виртуальный процессор и SINTx следует использовать для целевого объекта. Порты событий имеют "базовый номер флага" и "число флагов", которые позволяют вызывающему объекту указать диапазон допустимых флагов событий для этого порта.

Подключения выделяются из пула памяти отправителя. При создании соединения он должен быть связан с допустимым портом. Эта привязка создает простой односторонний канал связи. Если порт впоследствии удаляется, его подключение, пока оно остается, становится бесполезным.

SynIC MSR

Помимо регистров, сопоставленных с памятью, определенных для локального APIC, в SynIC определены следующие регистры, относящиеся к модели( MSR). Каждый виртуальный процессор имеет собственную копию этих регистров, поэтому их можно запрограммировать независимо.

Адрес MSR Имя регистрации Функция
0x40000080 SCONTROL Элемент управления SynIC
0x40000081 SVERSION Версия SynIC
0x40000082 SIEFP Страница флагов событий прерывания
0x40000083 SIMP Страница сообщения о прерывании
0x40000084 МНВ Конец сообщения
0x40000090 SINT0 Источник прерывания 0 (гипервизор)
0x40000090 SINT1 Источник прерывания 1
0x40000090 SINT2 Источник прерывания 2
0x40000090 SINT3 Источник прерывания 3
0x40000090 SINT4 Источник прерывания 4
0x40000090 SINT5 Источник прерывания 5
0x40000090 SINT6 Источник прерывания 6
0x40000090 SINT7 Источник прерывания 7
0x40000090 SINT8 Источник прерывания 8
0x40000090 SINT9 Источник прерывания 9
0x40000090 SINT10 Источник прерывания 10
0x40000090 SINT11 Источник прерывания 11
0x40000090 SINT12 Источник прерывания 12
0x40000090 SINT13 Источник прерывания 13
0x40000090 SINT14 Источник прерывания 14
0x40000090 SINT15 Источник прерывания 15

Регистрация SCONTROL

Этот регистр используется для управления поведением SynIC виртуального процессора.

Во время создания виртуального процессора и при сбросе процессора значение этого SCONTROL (регистра элемента управления SynIC) 0x0000000000000000. Таким образом, уведомления о очереди сообщений и флагах событий будут отключены.

Bits Поле Описание Атрибуты
63:1 RsvdP Значение должно быть сохранено Чтение и запись
0 Включить При установке этот виртуальный процессор позволит отправлять уведомления о очереди сообщений и уведомления о флагах событий в SynIC. Если флажок снят, уведомления о очереди сообщений и флагах событий не могут быть направлены на этот виртуальный процессор. Чтение и запись

Регистрация SVERSION

Это регистр только для чтения, и он возвращает номер версии SynIC. Попытки записи в этот регистр приводят к ошибке #GP.

Bits Поле Описание Атрибуты
63:32 RsvdP Чтение
31:0 Версия SynIC Номер версии SynIc Чтение

Регистрация SIEFP

Во время создания виртуального процессора и при сбросе процессора значение этого регистра SIEFP (страницы флагов событий искусственных прерываний) 0x0000000000000000. Таким образом, SIEFP по умолчанию отключен. Гость должен включить его, задав бит 0. Если указанный базовый адрес выходит за пределы пространства GPA секции, страница SIEFP не будет доступна для гостя. При изменении регистра гости должны сохранить значение зарезервированных битов (от 1 до 11) для обеспечения будущей совместимости.

Bits Поле Описание Атрибуты
63:12 Базовый адрес Базовый адрес (в пространстве GPA) SIEFP (предполагается, что низкие 12 битов отключены) Чтение и запись
11:1 RsvdP Зарезервировано, значение должно быть сохранено Чтение и запись
0 Включить Включение SIEFP Чтение и запись

Регистрация SIMP

Во время создания виртуального процессора и при сбросе процессора значение этого регистра SIMP (синтетическая страница сообщений о прерываниях) 0x0000000000000000. Таким образом, SIMP отключен по умолчанию. Гость должен включить его, задав бит 0. Если указанный базовый адрес выходит за пределы пространства GPA секции, страница SIMP не будет доступна для гостя. При изменении регистра гости должны сохранить значение зарезервированных битов (от 1 до 11) для обеспечения будущей совместимости.

Bits Поле Описание Атрибуты
63:12 Базовый адрес Базовый адрес (в пространстве GPA) SIMP (предполагается, что низкие 12 битов отключены) Чтение и запись
11:1 RsvdP Зарезервировано, значение должно быть сохранено Чтение и запись
0 Включить Включение SIMP Чтение и запись

Регистры SINTx

Во время создания виртуального процессора значение по умолчанию всех регистров SINTx (искусственный источник прерываний) 0x0000000000010000. Таким образом, все источники искусственных прерываний маскируются по умолчанию. Гость должен распакуть их путем программирования соответствующего вектора и очистки бита 16.

Задание бита опроса приведет к отмене запроса источника прерывания, за исключением того, что фактический прерываний не создается.

Флаг AutoEOI указывает, что неявное EOI должно выполняться гипервизором при доставке прерывания виртуальному процессору. Кроме того, гипервизор автоматически очищает соответствующий флаг в "регистре в службе" (ISR) виртуального APIC. Если гость включает это поведение, то он не должен выполнять EOI в своей процедуре обслуживания прерываний. Флаг AutoEOI может быть включен в любое время, хотя гость должен выполнить явное EOI для прерывания во время полета, что затрудняет определение того, требуется ли определенное прерывание EOI или нет, поэтому рекомендуется после отмены SINT, его параметры не изменяются. Аналогичным образом флаг AutoEOI можно отключить в любое время, хотя те же проблемы, связанные с прерываниями в полете, применяются

Допустимые значения для вектора : 16–255 включительно. Указание недопустимого векторного числа приводит к #GP.

Bits Поле Описание Атрибуты
63:19 RsvdP Зарезервировано, значение должно быть сохранено Чтение и запись
18 Опросы Включает режим опроса Чтение и запись
17 AutoEOI Установка, если неявное EOI должно быть выполнено при прерывании доставки Чтение и запись
16 Масках Установка, если SINT маскируется Чтение и запись
15:8 RsvdP Зарезервировано, значение должно быть сохранено Чтение и запись
7:0 Вектор Вектор прерываний Чтение и запись

Регистрация EOM

Запись в конец регистрации сообщения (EOM) гостем приводит к тому, что гипервизор сканирует очереди внутреннего буфера сообщений, связанные с виртуальным процессором. Если очередь буфера сообщений содержит буфер сообщений в очереди, гипервизор пытается доставить сообщение. Доставка сообщений завершается успешно, если страница SIM включена, и слот сообщения, соответствующий SINTx, пуст (то есть тип сообщения в заголовке имеет значение HvMessageTypeNone). Если сообщение успешно доставлено, его соответствующий внутренний буфер сообщений выводится из очереди и помечается как свободное. Если соответствующий SINTx не маскируется, то доставляется прерывание, инициируемое ребрами (то есть соответствующий бит в IRR).

Этот регистр может использоваться гостями для опроса сообщений. Его также можно использовать в качестве способа очистки очереди сообщений для отключенного SINTx (т. е. маскированного).

Если очереди сообщений пусты, запись в регистр EOM не является операцией.

Операции чтения из регистра EOM всегда возвращают нули.

Bits Поле Описание Атрибуты
63:0 RsvdZ Триггер только для записи запись