Compartir a través de


comunicación de Inter-Partition

El hipervisor proporciona dos mecanismos sencillos para que una partición se comunique con otra: mensajes y eventos. En ambos casos, la notificación se indica mediante SynIC (controlador de interrupción sintética).

Mensajes de SynIC

El hipervisor proporciona una sencilla instalación de comunicación entre particiones que permite que una partición envíe un mensaje con parámetros a otra partición. (Dado que el mensaje se envía de forma asincrónica, se dice que se publica). La partición de destino puede recibir una notificación de la llegada de este mensaje a través de una interrupción. Los mensajes se pueden enviar explícitamente mediante la hiperllamada HvCallPostMessage o implícitamente por el hipervisor.

Messages

Cuando se envía un mensaje, el hipervisor selecciona un búfer de mensajes libre. El conjunto de búferes de mensajes disponibles depende del evento que desencadenó el envío del mensaje.

El hipervisor marca el búfer de mensajes "en uso" y rellena el encabezado del mensaje con el tipo de mensaje, el tamaño de carga e información sobre el remitente. Por último, rellena la carga del mensaje. El contenido de la carga depende del evento que desencadenó el mensaje.

A continuación, el hipervisor anexa el búfer de mensajes a una cola de mensajes receptora. La cola de mensajes receptora depende del evento que desencadenó el envío del mensaje. Para todos los tipos de mensajes, SINTx es implícito (en el caso de mensajes de interceptación), explícito (en el caso de mensajes del temporizador) o especificado por un identificador de puerto (en el caso de los mensajes invitados). El hipervisor especifica o elige explícitamente el procesador virtual de destino cuando el mensaje está en cola. Los procesadores virtuales cuya página SynIC o SIM está deshabilitada no se considerarán destinos potenciales. Si no hay destinos disponibles, el hipervisor finaliza la operación y devuelve un error al autor de la llamada.

A continuación, el hipervisor determina si la ranura de mensaje SINTx especificada dentro de la página SIM del procesador virtual de destino está vacía. Si el tipo de mensaje de la ranura de mensaje es igual a HvMessageTypeNone (es decir, cero), se supone que la ranura del mensaje está vacía. En este caso, el hipervisor quita el búfer de mensajes y copia su contenido en la ranura de mensajes dentro de la página SIM. El hipervisor solo puede copiar el número de bytes de carga asociados al mensaje. El hipervisor también intenta generar una interrupción desencadenada por el borde para el SINTx especificado. Si el APIC está deshabilitado o el SINTx está enmascarado, se pierde la interrupción. La llegada de esta interrupción notifica al invitado que ha llegado un nuevo mensaje. Si la página SIM está deshabilitada o la ranura de mensaje dentro de la página SIM no está vacía, el mensaje permanece en cola y no se genera ninguna interrupción.

Al igual que con cualquier interrupción de prioridad fija, el procesador virtual no reconoce la interrupción hasta que el PPR (registro de prioridad de proceso) es menor que el vector especificado en el registro SINTx y las interrupciones no están enmascaradas por el procesador virtual (rFLAGS[IF] está establecido en 1).

Se pueden poner en cola varios búferes de mensajes con el mismo SINTx en un procesador virtual. En este caso, el hipervisor entregará el primer mensaje (es decir, lo escribirá en la página SIM) y dejará los demás en cola hasta que se produzca uno de los tres eventos:

  • Otro búfer de mensajes está en cola.
  • El invitado indica el "fin de la interrupción" escribiendo en el registro EOI de APIC.
  • El invitado indica el "final del mensaje" escribiendo en el registro EOM de SynIC.

En los tres casos, el hipervisor examinará una o varias colas de búfer de mensajes e intentará entregar mensajes adicionales. El hipervisor también intenta generar una interrupción desencadenada por el borde, lo que indica que ha llegado un nuevo mensaje.

Página SIM

La página SIM consta de una matriz de 16 elementos de mensajes de 256 bytes (consulte HV_MESSAGE estructura de datos). Cada elemento de matriz (también conocido como ranura de mensaje) corresponde a un único origen de interrupción sintética (SINTx). Se dice que una ranura de mensaje está "vacía" si el tipo de mensaje del mensaje en la ranura es igual a HvMessageTypeNone.

La dirección de la página SIM se especifica en el registro SIMP. La dirección de la página SIM debe ser única para cada procesador virtual. Programar estas páginas para superponer otras instancias de las páginas SIEF o SIM o cualquier otra página de superposición (por ejemplo, la página de hiperllamada) dará como resultado un comportamiento indefinido.

Los accesos de lectura y escritura por parte de un procesador virtual a la página SIM se comportan como accesos de lectura y escritura a la RAM. Sin embargo, la implementación de SynIC del hipervisor también escribe en las páginas en respuesta a determinados eventos.

Tras la creación y el restablecimiento del procesador virtual, la página SIM se borra en cero.

El mecanismo de entrega de mensajes SynIC está diseñado para dar cabida a la entrega eficaz y la recepción de mensajes dentro de una partición de destino. Se recomienda que el ISR de control de mensajes (rutina de servicio de interrupción) dentro de la partición de destino realice los pasos siguientes:

  • Examine el mensaje que se depositó en la ranura de mensajes SIM.
  • Copie el contenido del mensaje en otra ubicación y establezca el tipo de mensaje dentro de la ranura de mensajes en HvMessageTypeNone.
  • Indique el final de la interrupción del vector escribiendo en el registro EOI de APIC.
  • Realice cualquier acción implícita por el mensaje.

Orígenes de mensajes

Las clases de eventos que pueden desencadenar el envío de un mensaje son las siguientes:

  • Interceptaciones: cualquier interceptación de un procesador virtual hará que se envíe un mensaje a la partición primaria o a un VTL superior.
  • Temporizadores: los mecanismos del temporizador harán que se envíen mensajes. Los asociados a cada procesador virtual son cuatro búferes de mensajes de temporizador dedicados, uno para cada temporizador. La cola de mensajes receptora pertenece a SINTx del procesador virtual cuyo temporizador desencadenó el envío del mensaje.
  • Mensajes invitados: el hipervisor admite el paso de mensajes como un mecanismo de comunicación entre particiones entre invitados. Las interfaces definidas en esta sección permiten que un invitado envíe mensajes a otro invitado. Los búferes de mensajes usados para los mensajes de esta clase se toman del grupo de mensajes por puerto del receptor de búferes de mensajes invitados.

Búferes de mensajes

Un búfer de mensajes se usa internamente en el hipervisor para almacenar un mensaje hasta que se entrega al destinatario. El hipervisor mantiene varios conjuntos de búferes de mensajes.

Búferes de mensajes invitados

El hipervisor mantiene un conjunto de búferes de mensajes invitados para cada puerto. Estos búferes se usan para los mensajes enviados explícitamente desde una partición a otra por un invitado. Cuando se crea un puerto, el hipervisor asignará dieciséis (16) búferes de mensajes del grupo de memoria del propietario del puerto. Estos búferes de mensajes se devuelven al grupo de memoria cuando se elimina el puerto.

Colas de búfer de mensajes

Para cada partición y cada procesador virtual de la partición, el hipervisor mantiene una cola de búferes de mensajes para cada SINTx (origen de interrupción sintética) en synIC del procesador virtual. Todas las colas de mensajes de un procesador virtual están vacías tras la creación o el restablecimiento del procesador virtual.

Confiabilidad y secuenciación de búferes de mensajes invitados

El hipervisor ha puesto en cola los mensajes publicados correctamente por un invitado para su entrega. La entrega y recepción reales por parte de la partición de destino depende de su operación correcta. Las particiones pueden deshabilitar la entrega de mensajes a determinados procesadores virtuales deshabilitando su SynIC o deshabilitando el SIMP.

La interrupción de una conexión no afectará a los mensajes no entregados (en cola). La eliminación del puerto de destino siempre liberará todos los búferes de mensajes del puerto, tanto si están disponibles como si contienen mensajes no entregados (en cola).

Los mensajes llegan en el orden en el que se han publicado correctamente. Si el puerto receptor está asociado a un procesador virtual específico, los mensajes llegarán en el mismo orden en el que se publicaron. Si el puerto receptor está asociado a HV_ANY_VP, no se garantiza que los mensajes lleguen en un orden determinado.

Marcas de eventos de SynIC

Además de los mensajes, SynIC admite un segundo tipo de mecanismo de notificación entre particiones denominado marcas de eventos. Las marcas de evento se pueden establecer explícitamente mediante la hiperllamada HvCallSignalEvent o implícitamente por el hipervisor.

Marcas de eventos frente a mensajes

Las marcas de evento son más ligeras que los mensajes y, por lo tanto, tienen una sobrecarga menor. Además, las marcas de evento no requieren ninguna asignación o puesta en cola de búfer en el hipervisor, por lo que HvCallSignalEvent nunca producirá un error debido a recursos insuficientes.

Entrega de marcas de evento

Cuando una partición llama a HvCallSignalEvent, especifica un número de marca de evento. El hipervisor responde estableciendo un poco de forma atómica dentro de la página SIEF del procesador virtual receptor. Los procesadores virtuales cuya página SynIC o SIEF está deshabilitada no se considerarán destinos potenciales. Si no hay destinos disponibles, el hipervisor finaliza la operación y devuelve un error al autor de la llamada.

Si la marca de evento se ha borrado anteriormente, el hipervisor intenta notificar a la partición receptora que la marca ahora está establecida mediante la generación de una interrupción desencadenada por el borde. El procesador virtual de destino, junto con el SINTx de destino, se especifica como parte de la creación de un puerto. Si el SINTx está enmascarado, HvSignalEvent devuelve HV_STATUS_INVALID_SYNIC_STATE.

Al igual que con cualquier interrupción externa de prioridad fija, el procesador virtual no reconoce la interrupción hasta que el registro de prioridad del proceso (PPR) sea menor que el vector especificado en el registro SINTx y las interrupciones no se enmascaran mediante el procesador virtual (rFLAGS[IF] está establecido en 1).

Página SIEF

La página SIEF consta de una matriz de 16 elementos de marcas de eventos de 256 bytes (consulte HV_SYNIC_EVENT_FLAGS). Cada elemento de matriz corresponde a un único origen de interrupción sintética (SINTx).

La dirección de la página SIEF se especifica en el registro SIEF. La dirección de la página SIEF debe ser única para cada procesador virtual. Programar estas páginas para superponer otras instancias de las páginas SIEF o SIM o cualquier otra página de superposición (por ejemplo, la página de hiperllamada) dará como resultado un comportamiento indefinido.

Los accesos de lectura y escritura por parte de un procesador virtual a la página SIEF se comportan como accesos de lectura y escritura a la RAM. Sin embargo, la implementación de SynIC del hipervisor también escribe en las páginas en respuesta a determinados eventos.

Tras la creación y el restablecimiento del procesador virtual, la página SIEF se borra en cero.

Se recomienda que la rutina del servicio de interrupción de marca de eventos (ISR) dentro de la partición de destino realice los pasos siguientes:

  • Examine las marcas de evento y determine cuáles, si las hay, se establecen.
  • Borre una o varias marcas de eventos mediante una operación bloqueada (atómica), como LOCK AND o LOCK CMPXCHG.
  • Indique el final de la interrupción del vector escribiendo en el registro EOI de APIC.
  • Realice las acciones implícitas por las marcas de evento que se establecieron.

Puertos y conexiones

Un mensaje o evento enviado desde un invitado a otro debe enviarse a través de una conexión asignada previamente. Una conexión, a su vez, debe estar asociada a un puerto de destino.

Se asigna un puerto desde el grupo de memoria del receptor y especifica qué procesador virtual y SINTx de destino. Los puertos de evento tienen un "número de marca base" y "recuento de marcas" que permiten al autor de la llamada especificar un intervalo de marcas de eventos válidas para ese puerto.

Las conexiones se asignan desde el grupo de memoria del remitente. Cuando se crea una conexión, debe asociarse a un puerto válido. Este enlace crea un canal de comunicación simple y unidireccional. Si posteriormente se elimina un puerto, su conexión, mientras permanece, se vuelve inútil.

Registros de SynIC

Cada procesador virtual tiene su propia copia de estos registros, por lo que se pueden programar de forma independiente.

En las plataformas x64, se accede a estos registros como registros específicos del modelo (MSR) mediante las instrucciones de RDMSR y WRMSR:

Dirección MSR Nombre del registro Función
0x40000080 SCONTROL SynIC Control
0x40000081 SVERSION Versión de SynIC
0x40000082 SIEFP Página De marcas de eventos de interrupción
0x40000083 SIMP Página Interrumpir mensaje
0x40000084 MOE Fin del mensaje
0x40000090 SINT0 Origen de interrupción 0 (hipervisor)
0x40000091 SINT1 Origen de interrupción 1
0x40000092 SINT2 Origen de interrupción 2
0x40000093 SINT3 Origen de interrupción 3
0x40000094 SINT4 Origen de interrupción 4
0x40000095 SINT5 Origen de interrupción 5
0x40000096 SINT6 Origen de interrupción 6
0x40000097 SINT7 Origen de interrupción 7
0x40000098 SINT8 Origen de interrupción 8
0x40000099 SINT9 Origen de interrupción 9
0x4000009A SINT10 Origen de interrupción 10
0x4000009B SINT11 Origen de interrupción 11
0x4000009C SINT12 Origen de interrupción 12
0x4000009D SINT13 Origen de interrupción 13
0x4000009E SINT14 Origen de interrupción 14
0x4000009F SINT15 Origen de interrupción 15

En las plataformas ARM64, se accede a estos registros mediante HvCallGetVpRegisters y HvCallSetVpRegisters hiperllamadas con los siguientes nombres de registro:

HvRegister Name Función
HvRegisterScontrol SynIC Control
HvRegisterSversion Versión de SynIC
HvRegisterSifp Página De marcas de eventos de interrupción
HvRegisterSipp Página Interrumpir mensaje
HvRegisterEom Fin del mensaje
HvRegisterSirbp Página Búfer de respuesta de interrupción
HvRegisterSint0 Origen de interrupción 0 (hipervisor)
HvRegisterSint1 Origen de interrupción 1
HvRegisterSint2 Origen de interrupción 2
HvRegisterSint3 Origen de interrupción 3
HvRegisterSint4 Origen de interrupción 4
HvRegisterSint5 Origen de interrupción 5
HvRegisterSint6 Origen de interrupción 6
HvRegisterSint7 Origen de interrupción 7
HvRegisterSint8 Origen de interrupción 8
HvRegisterSint9 Origen de interrupción 9
HvRegisterSint10 Origen de interrupción 10
HvRegisterSint11 Origen de interrupción 11
HvRegisterSint12 Origen de interrupción 12
HvRegisterSint13 Origen de interrupción 13
HvRegisterSint14 Origen de interrupción 14
HvRegisterSint15 Origen de interrupción 15

Registro de SCONTROL

Este registro se usa para controlar el comportamiento de SynIC del procesador virtual.

En tiempo de creación del procesador virtual y tras el restablecimiento del procesador, el valor de este registro de control SCONTROL (registro de control SynIC) es 0x0000000000000000. Por lo tanto, se deshabilitarán las notificaciones de puesta en cola de mensajes y marcas de eventos.

Bits Campo Description Attributes
63:1 RsvdP Se debe conservar el valor Lectura y escritura
0 Enable Cuando se establece, este procesador virtual permitirá que las notificaciones de cola de mensajes y marcas de eventos se publiquen en su SynIC. Cuando se borra, las notificaciones de cola de mensajes y marcas de eventos no se pueden dirigir a este procesador virtual. Lectura y escritura

Registro de SVERSION

Se trata de un registro de solo lectura y devuelve el número de versión de SynIC. Los intentos de escritura en este registro producen un error de #GP.

Bits Campo Description Attributes
63:32 RsvdP Read
31:0 Versión de SynIC Número de versión de SynIc Read

Registro de SIEFP

En el momento de la creación del procesador virtual y tras el restablecimiento del procesador, el valor de esta página de marcas de eventos de interrupción sintética (SIEFP) se 0x0000000000000000. Por lo tanto, el SIEFP está deshabilitado de forma predeterminada. El invitado debe habilitarlo estableciendo el bit 0. Si la dirección base especificada está más allá del final del espacio GPA de la partición, la página SIEFP no será accesible para el invitado. Al modificar el registro, los invitados deben conservar el valor de los bits reservados (de 1 a 11) para una compatibilidad futura.

Bits Campo Description Attributes
63:12 Dirección base Dirección base (en el espacio GPA) de SIEFP (se supone que hay 12 bits bajos deshabilitados) Lectura y escritura
11:1 RsvdP Reservado, se debe conservar el valor Lectura y escritura
0 Enable Habilitación de SIEFP Lectura y escritura

Registro DE SIMP

En tiempo de creación del procesador virtual y tras el restablecimiento del procesador, el valor de este registro siMP (página de mensajes de interrupción sintética) se 0x0000000000000000. Por lo tanto, el SIMP está deshabilitado de forma predeterminada. El invitado debe habilitarlo estableciendo el bit 0. Si la dirección base especificada está más allá del final del espacio GPA de la partición, la página SIMP no será accesible para el invitado. Al modificar el registro, los invitados deben conservar el valor de los bits reservados (de 1 a 11) para una compatibilidad futura.

Bits Campo Description Attributes
63:12 Dirección base Dirección base (en el espacio GPA) de SIMP (se supone que hay 12 bits bajos deshabilitados) Lectura y escritura
11:1 RsvdP Reservado, se debe conservar el valor Lectura y escritura
0 Enable Habilitación de SIMP Lectura y escritura

Registros SINTx

En el momento de la creación del procesador virtual, el valor predeterminado de todos los registros SINTx (origen de interrupción sintética) es 0x0000000000010000. Por lo tanto, todos los orígenes de interrupción sintéticos se enmascaran de forma predeterminada. El invitado debe desenmascararlos mediante la programación de un vector adecuado y borrar el bit 16.

Establecer el bit de sondeo tendrá el efecto de desenmascarar un origen de interrupción, excepto que no se genera una interrupción real.

La marca AutoEOI indica que el hipervisor debe realizar una EOI implícita cuando se entrega una interrupción al procesador virtual. Además, el hipervisor borrará automáticamente la marca correspondiente en el "registro en servicio" (ISR) del APIC virtual. Si el invitado habilita este comportamiento, no debe realizar una EOI en su rutina de servicio de interrupción. La marca AutoEOI se puede activar en cualquier momento, aunque el invitado debe realizar un EOI explícito en una interrupción en el vuelo La consideración de tiempo dificulta saber si una interrupción determinada necesita EOI o no, por lo que se recomienda que una vez que SINT esté sin máscara, no se cambie su configuración. Del mismo modo, la marca AutoEOI se puede desactivar en cualquier momento, aunque se aplican las mismas preocupaciones sobre las interrupciones en curso.

Los valores válidos para el vector son de 16 a 255 inclusive. Especificar un número de vector no válido da como resultado #GP.

Bits Campo Description Attributes
63:19 RsvdP Reservado, se debe conservar el valor Lectura y escritura
18 Encuesta Habilita el modo de sondeo Lectura y escritura
17 AutoEOI Establecer si se debe realizar una EOI implícita tras la entrega de interrupciones Lectura y escritura
16 Enmascarado Establecer si el SINT está enmascarado Lectura y escritura
15:8 RsvdP Reservado, se debe conservar el valor Lectura y escritura
7:0 Vector Vector de interrupción Lectura y escritura

Registro EOM

Una escritura al final del registro del mensaje (EOM) por el invitado hace que el hipervisor examine las colas internas del búfer de mensajes asociadas al procesador virtual. Si una cola de búfer de mensajes contiene un búfer de mensajes en cola, el hipervisor intenta entregar el mensaje. La entrega de mensajes se realiza correctamente si la página SIM está habilitada y la ranura de mensaje correspondiente a SINTx está vacía (es decir, el tipo de mensaje del encabezado se establece en HvMessageTypeNone). Si un mensaje se entrega correctamente, su búfer de mensajes interno correspondiente se quita y se marca como libre. Si el SINTx correspondiente no está enmascarado, se entrega una interrupción desencadenada por el borde (es decir, se establece el bit correspondiente en irR).

Los invitados pueden usar este registro para "sondear" los mensajes. También se puede usar como una manera de purgar la cola de mensajes de un SINTx que se ha deshabilitado (es decir, enmascarado).

Si las colas de mensajes están vacías, una escritura en el registro EOM es un no-op.

Las lecturas del registro EOM siempre devuelven ceros.

Bits Campo Description Attributes
63:0 RsvdZ Desencadenador de solo escritura Escribir