Compartilhar via


Comunicação Inter-Partition

O hipervisor fornece dois mecanismos simples para que uma partição se comunique com outra: mensagens e eventos. Em ambos os casos, a notificação é sinalizada usando o SynIC (controlador de interrupção sintético).

Mensagens SynIC

O hipervisor fornece um recurso simples de comunicação entre partições que permite que uma partição envie uma mensagem parametrizada para outra partição. (Como a mensagem é enviada de forma assíncrona, diz-se que ela é postada.) A partição de destino pode ser notificada da chegada dessa mensagem por meio de uma interrupção. As mensagens podem ser enviadas explicitamente usando a hiperchamada HvCallPostMessage ou implicitamente pelo hipervisor.

Messages

Quando uma mensagem é enviada, o hipervisor seleciona um buffer de mensagem gratuito. O conjunto de buffers de mensagens disponíveis depende do evento que disparou o envio da mensagem.

O hipervisor marca o buffer de mensagens "em uso" e preenche o cabeçalho da mensagem com o tipo de mensagem, o tamanho do conteúdo e as informações sobre o remetente. Por fim, ele preenche o conteúdo da mensagem. O conteúdo da carga depende do evento que disparou a mensagem.

Em seguida, o hipervisor acrescenta o buffer de mensagens a uma fila de mensagens de recebimento. A fila de mensagens de recebimento depende do evento que disparou o envio da mensagem. Para todos os tipos de mensagem, SINTx é implícito (no caso de mensagens de interceptação), explícito (no caso de mensagens de temporizador) ou especificado por uma ID de porta (no caso de mensagens de convidado). O processador virtual de destino é especificado explicitamente ou escolhido pelo hipervisor quando a mensagem é enfileirada. Os processadores virtuais cuja página SynIC ou SIM está desabilitada não serão considerados como destinos potenciais. Se nenhum destino estiver disponível, o hipervisor encerrará a operação e retornará um erro ao chamador.

Em seguida, o hipervisor determina se o slot de mensagem SINTx especificado na página SIM do processador virtual de destino está vazio. Se o tipo de mensagem no slot de mensagem for igual a HvMessageTypeNone (ou seja, zero), o slot de mensagem será considerado vazio. Nesse caso, o hipervisor desativa o buffer de mensagens e copia seu conteúdo para o slot de mensagem dentro da página SIM. O hipervisor pode copiar apenas o número de bytes de carga associados à mensagem. O hipervisor também tenta gerar uma interrupção disparada por borda para o SINTx especificado. Se a APIC estiver desabilitada ou o SINTx estiver mascarado, a interrupção será perdida. A chegada dessa interrupção notifica o convidado de que uma nova mensagem chegou. Se a página sim estiver desabilitada ou o slot de mensagem dentro da página SIM não estiver vazio, a mensagem permanecerá na fila e nenhuma interrupção será gerada.

Assim como ocorre com qualquer interrupção de prioridade fixa, a interrupção não é confirmada pelo processador virtual até que o PPR (registro de prioridade do processo) seja menor que o vetor especificado no registro SINTx e as interrupções não sejam mascaradas pelo processador virtual (rFLAGS[IF] está definido como 1).

Vários buffers de mensagens com o mesmo SINTx podem ser enfileirados em um processador virtual. Nesse caso, o hipervisor entregará a primeira mensagem (ou seja, a gravará na página sim) e deixará as outras enfileiradas até que ocorra um dos três eventos:

  • Outro buffer de mensagem está na fila.
  • O convidado indica o "fim da interrupção" gravando no registro EOI da APIC.
  • O convidado indica o "fim da mensagem" escrevendo no registro EOM do SynIC.

Em todos os três casos, o hipervisor examinará uma ou mais filas de buffer de mensagens e tentará fornecer mensagens adicionais. O hipervisor também tenta gerar uma interrupção disparada por borda, indicando que uma nova mensagem chegou.

Página SIM

A página sim consiste em uma matriz de 16 elementos de mensagens de 256 bytes (consulte HV_MESSAGE estrutura de dados). Cada elemento de matriz (também conhecido como slot de mensagem) corresponde a uma única fonte de interrupção sintética (SINTx). Um slot de mensagem será considerado "vazio" se o tipo de mensagem do slot for igual a HvMessageTypeNone.

O endereço da página SIM é especificado no registro SIMP. O endereço da página SIM deve ser exclusivo para cada processador virtual. Programar essas páginas para sobrepor outras instâncias das páginas SIEF ou SIM ou qualquer outra página de sobreposição (por exemplo, a página de hiperchamada) resultará em um comportamento indefinido.

Os acessos de leitura e gravação por um processador virtual na página sim se comportam como acessos de leitura e gravação à RAM. No entanto, a implementação SynIC do hipervisor também grava nas páginas em resposta a determinados eventos.

Após a criação e a redefinição do processador virtual, a página sim é desmarcada como zero.

O mecanismo de entrega de mensagens SynIC foi projetado para acomodar a entrega eficiente e o recebimento de mensagens em uma partição de destino. É recomendável que o ISR de tratamento de mensagens (rotina de serviço de interrupção) dentro da partição de destino execute as seguintes etapas:

  • Examine a mensagem que foi depositada no slot de mensagem SIM.
  • Copie o conteúdo da mensagem para outro local e defina o tipo de mensagem dentro do slot de mensagem para HvMessageTypeNone.
  • Indique o fim da interrupção do vetor gravando no registro de EOI da APIC.
  • Execute todas as ações implícitas pela mensagem.

Fontes de mensagem

As classes de eventos que podem disparar o envio de uma mensagem são as seguintes:

  • Interceptações: qualquer interceptação em um processador virtual fará com que uma mensagem seja enviada para a partição pai ou para uma VTL mais alta.
  • Temporizadores: os mecanismos de temporizador farão com que as mensagens sejam enviadas. Associados a cada processador virtual estão quatro buffers de mensagens de temporizador dedicados, um para cada temporizador. A fila de mensagens de recebimento pertence ao SINTx do processador virtual cujo temporizador disparou o envio da mensagem.
  • Mensagens de convidado: o hipervisor dá suporte à passagem de mensagens como um mecanismo de comunicação entre partições entre convidados. As interfaces definidas nesta seção permitem que um convidado envie mensagens para outro convidado. Os buffers de mensagem usados para mensagens dessa classe são retirados do pool por porta do receptor de buffers de mensagens de convidado.

Buffers de mensagens

Um buffer de mensagem é usado internamente no hipervisor para armazenar uma mensagem até que ela seja entregue ao destinatário. O hipervisor mantém vários conjuntos de buffers de mensagens.

Buffers de Mensagens de Convidado

O hipervisor mantém um conjunto de buffers de mensagens de convidado para cada porta. Esses buffers são usados para mensagens enviadas explicitamente de uma partição para outra por um convidado. Quando uma porta é criada, o hipervisor alocará dezesseis (16) buffers de mensagem do pool de memória do proprietário da porta. Esses buffers de mensagem são retornados para o pool de memória quando a porta é excluída.

Filas de Buffer de Mensagens

Para cada partição e cada processador virtual na partição, o hipervisor mantém uma fila de buffers de mensagem para cada SINTx (fonte de interrupção sintética) no SynIC do processador virtual. Todas as filas de mensagens de um processador virtual estão vazias após a criação ou redefinição do processador virtual.

Confiabilidade e sequenciamento de buffers de mensagens de convidado

Mensagens postadas com êxito por um convidado foram enfileiradas para entrega pelo hipervisor. A entrega e a recepção reais pela partição de destino dependem de sua operação correta. As partições podem desabilitar a entrega de mensagens em processadores virtuais específicos desabilitando seu SynIC ou desabilitando o SIMP.

Interromper uma conexão não afetará mensagens não entregues (enfileiradas). A exclusão da porta de destino sempre liberará todos os buffers de mensagem da porta, estejam eles disponíveis ou contêm mensagens não entregues (enfileiradas).

As mensagens chegam na ordem em que foram postadas com êxito. Se a porta de recebimento estiver associada a um processador virtual específico, as mensagens chegarão na mesma ordem em que foram postadas. Se a porta receptora estiver associada a HV_ANY_VP, não será garantido que as mensagens cheguem em nenhuma ordem específica.

Sinalizadores de evento SynIC

Além das mensagens, o SynIC dá suporte a um segundo tipo de mecanismo de notificação entre partições chamado sinalizadores de evento. Os sinalizadores de evento podem ser definidos explicitamente usando a hiperchamada HvCallSignalEvent ou implicitamente pelo hipervisor.

Sinalizadores de evento versus mensagens

Os sinalizadores de eventos são mais leves do que as mensagens e, portanto, são menos sobrecarga. Além disso, os sinalizadores de eventos não exigem nenhuma alocação de buffer ou enfileiramento dentro do hipervisor, portanto, HvCallSignalEvent nunca falhará devido a recursos insuficientes.

Entrega do Sinalizador de Evento

Quando uma partição chama HvCallSignalEvent, ela especifica um número de sinalizador de evento. O hipervisor responde definindo atomicamente um pouco dentro da página SIEF do processador virtual receptor. Os processadores virtuais cuja página SynIC ou SIEF está desabilitada não serão considerados como destinos potenciais. Se nenhum destino estiver disponível, o hipervisor encerrará a operação e retornará um erro ao chamador.

Se o sinalizador de evento tiver sido apagado anteriormente, o hipervisor tentará notificar a partição de recebimento de que o sinalizador agora está definido gerando uma interrupção disparada por borda. O processador virtual de destino, juntamente com o SINTx de destino, é especificado como parte da criação de uma porta. Se o SINTx estiver mascarado, HvSignalEvent retornará HV_STATUS_INVALID_SYNIC_STATE.

Assim como ocorre com qualquer interrupção externa de prioridade fixa, a interrupção não é confirmada pelo processador virtual até que o PPR (registro de prioridade de processo) seja menor que o vetor especificado no registro SINTx e as interrupções não sejam mascaradas pelo processador virtual (rFLAGS[IF] está definido como 1).

Página SIEF

A página SIEF consiste em uma matriz de 16 elementos de sinalizadores de evento de 256 bytes (consulte HV_SYNIC_EVENT_FLAGS). Cada elemento de matriz corresponde a uma única fonte de interrupção sintética (SINTx).

O endereço da página SIEF é especificado no registro SIEF. O endereço da página SIEF deve ser exclusivo para cada processador virtual. Programar essas páginas para sobrepor outras instâncias das páginas SIEF ou SIM ou qualquer outra página de sobreposição (por exemplo, a página de hiperchamada) resultará em um comportamento indefinido.

Os acessos de leitura e gravação por um processador virtual na página SIEF se comportam como acessos de leitura e gravação à RAM. No entanto, a implementação SynIC do hipervisor também grava nas páginas em resposta a determinados eventos.

Após a criação e a redefinição do processador virtual, a página SIEF será desmarcada como zero.

É recomendável que a ISR (rotina de serviço de interrupção de sinalizador de eventos) dentro da partição de destino execute as seguintes etapas:

  • Examine os sinalizadores de evento e determine quais, se houver, estão definidos.
  • Desmarque um ou mais sinalizadores de evento usando uma operação bloqueada (atômica), como LOCK AND ou LOCK CMPXCHG.
  • Indique o fim da interrupção do vetor gravando no registro de EOI da APIC.
  • Execute todas as ações implícitas pelos sinalizadores de evento que foram definidos.

Portas e conexões

Uma mensagem ou evento enviado de um convidado para outro deve ser enviado por meio de uma conexão pré-alocada. Uma conexão, por sua vez, deve ser associada a uma porta de destino.

Uma porta é alocada do pool de memória do receptor e especifica qual processador virtual e SINTx serão direcionados. As portas de evento têm um "número de sinalizador base" e "contagem de sinalizadores" que permitem ao chamador especificar um intervalo de sinalizadores de evento válidos para essa porta.

As conexões são alocadas do pool de memória do remetente. Quando uma conexão é criada, ela deve ser associada a uma porta válida. Essa associação cria um canal de comunicação unidirecional simples. Se uma porta for posteriormente excluída, sua conexão, enquanto permanecer, se tornará inútil.

Registros SynIC

Cada processador virtual tem sua própria cópia desses registros, para que possam ser programados de forma independente.

Em plataformas x64, esses registros são acessados como MSRs (registros específicos do modelo) usando instruções RDMSR e WRMSR:

Endereço MSR Nome do Registro Função
0x40000080 SCONTROL Controle SynIC
0x40000081 SVERSION Versão do SynIC
0x40000082 SIEFP Página Sinalizadores de Eventos de Interrupção
0x40000083 SIMP Página Interromper Mensagem
0x40000084 MOE Fim da mensagem
0x40000090 SINT0 Origem de interrupção 0 (hipervisor)
0x40000091 SINT1 Origem de interrupção 1
0x40000092 SINT2 Origem de interrupção 2
0x40000093 SINT3 Origem de interrupção 3
0x40000094 SINT4 Origem de interrupção 4
0x40000095 SINT5 Origem de interrupção 5
0x40000096 SINT6 Origem de interrupção 6
0x40000097 SINT7 Origem de interrupção 7
0x40000098 SINT8 Origem de interrupção 8
0x40000099 SINT9 Origem da interrupção 9
0x4000009A SINT10 Origem de interrupção 10
0x4000009B SINT11 Origem da interrupção 11
0x4000009C SINT12 Origem da interrupção 12
0x4000009D SINT13 Origem de interrupção 13
0x4000009E SINT14 Origem de interrupção 14
0x4000009F SINT15 Origem de interrupção 15

Nas plataformas ARM64, esses registros são acessados usando as hiperchamadas HvCallGetVpRegisters e HvCallSetVpRegisters com os seguintes nomes de registro:

Nome do HvRegister Função
HvRegisterScontrol Controle SynIC
HvRegisterSversion Versão do SynIC
HvRegisterSifp Página Sinalizadores de Eventos de Interrupção
HvRegisterSipp Página Interromper Mensagem
HvRegisterEom Fim da mensagem
HvRegisterSirbp Página de buffer de resposta de interrupção
HvRegisterSint0 Origem de interrupção 0 (hipervisor)
HvRegisterSint1 Origem de interrupção 1
HvRegisterSint2 Origem de interrupção 2
HvRegisterSint3 Origem de interrupção 3
HvRegisterSint4 Origem de interrupção 4
HvRegisterSint5 Origem de interrupção 5
HvRegisterSint6 Origem de interrupção 6
HvRegisterSint7 Origem de interrupção 7
HvRegisterSint8 Origem de interrupção 8
HvRegisterSint9 Origem da interrupção 9
HvRegisterSint10 Origem de interrupção 10
HvRegisterSint11 Origem da interrupção 11
HvRegisterSint12 Origem da interrupção 12
HvRegisterSint13 Origem de interrupção 13
HvRegisterSint14 Origem de interrupção 14
HvRegisterSint15 Origem de interrupção 15

Registro SCONTROL

Esse registro é usado para controlar o comportamento SynIC do processador virtual.

No momento da criação do processador virtual e na redefinição do processador, o valor desse SCONTROL (registro de controle SynIC) é 0x0000000000000000. Assim, as notificações de sinalizador de eventos e enfileiramento de mensagens serão desabilitadas.

Bits Campo Description Attributes
63:1 RsvdP O valor deve ser preservado Leitura/gravação
0 Enable Quando definido, esse processador virtual permitirá que as notificações de sinalizador de eventos e enfileiramento de mensagens sejam postadas em seu SynIC. Quando claro, as notificações de sinalizador de eventos e enfileiramento de mensagens não podem ser direcionadas para esse processador virtual. Leitura/gravação

Registro SVERSION

Este é um registro somente leitura e retorna o número de versão do SynIC. As tentativas de gravar nesse registro resultam em uma falha de #GP.

Bits Campo Description Attributes
63:32 RsvdP Leitura
31:0 Versão do SynIC Número de versão do SynIc Leitura

Registro SIEFP

No momento da criação do processador virtual e na redefinição do processador, o valor desse registro SIEFP (página de sinalizadores de eventos de interrupção sintética) é 0x0000000000000000. Assim, o SIEFP é desabilitado por padrão. O convidado deve habilitá-lo definindo o bit 0. Se o endereço base especificado estiver além do final do espaço GPA da partição, a página SIEFP não estará acessível ao convidado. Ao modificar o registro, os convidados devem preservar o valor dos bits reservados (1 a 11) para compatibilidade futura.

Bits Campo Description Attributes
63:12 Endereço Base Endereço base (no espaço GPA) de SIEFP (12 bits baixos considerados desabilitados) Leitura/gravação
11:1 RsvdP Reservado, o valor deve ser preservado Leitura/gravação
0 Enable Habilitar SIEFP Leitura/gravação

Registro SIMP

No momento da criação do processador virtual e na redefinição do processador, o valor desse registro simp (página de mensagem de interrupção sintética) é 0x0000000000000000. Assim, o SIMP é desabilitado por padrão. O convidado deve habilitá-lo definindo o bit 0. Se o endereço base especificado estiver além do final do espaço GPA da partição, a página SIMP não estará acessível ao convidado. Ao modificar o registro, os convidados devem preservar o valor dos bits reservados (1 a 11) para compatibilidade futura.

Bits Campo Description Attributes
63:12 Endereço Base Endereço base (no espaço GPA) do SIMP (12 bits baixos considerados desabilitados) Leitura/gravação
11:1 RsvdP Reservado, o valor deve ser preservado Leitura/gravação
0 Enable Habilitação do SIMP Leitura/gravação

Registros SINTx

No momento da criação do processador virtual, o valor padrão de todos os registros SINTx (fonte de interrupção sintética) é 0x0000000000010000. Assim, todas as fontes de interrupção sintéticas são mascaradas por padrão. O convidado deve desmascará-los programando um vetor apropriado e desmarcando o bit 16.

Definir o bit de sondagem terá o efeito de desmascarar uma fonte de interrupção, exceto que uma interrupção real não é gerada.

O sinalizador AutoEOI indica que uma EOI implícita deve ser executada pelo hipervisor quando uma interrupção é entregue ao processador virtual. Além disso, o hipervisor limpará automaticamente o sinalizador correspondente no "ISR" (registro em serviço) da APIC virtual. Se o convidado habilitar esse comportamento, ele não deverá executar uma EOI em sua rotina de serviço de interrupção. O sinalizador AutoEOI pode ser ativado a qualquer momento, embora o convidado precise executar um EOI explícito em uma interrupção de voo A consideração de tempo dificulta saber se uma interrupção específica precisa de EOI ou não, portanto, é recomendável que, uma vez que o SINT seja desmascarado, suas configurações não sejam alteradas. Da mesma forma, o sinalizador AutoEOI pode ser desativado a qualquer momento, embora as mesmas preocupações com interrupções no voo se apliquem

Os valores válidos para o vetor são 16-255 inclusivos. Especificar um número de vetor inválido resulta em #GP.

Bits Campo Description Attributes
63:19 RsvdP Reservado, o valor deve ser preservado Leitura/gravação
18 Votação Habilita o modo de sondagem Leitura/gravação
17 AutoEOI Definir se um EOI implícito deve ser executado após a entrega de interrupção Leitura/gravação
16 Mascarado Definir se o SINT está mascarado Leitura/gravação
15:8 RsvdP Reservado, o valor deve ser preservado Leitura/gravação
7:0 Vector Vetor de interrupção Leitura/gravação

Registro EOM

Uma gravação no final do registro de mensagem (EOM) pelo convidado faz com que o hipervisor examine as filas internas do buffer de mensagens associadas ao processador virtual. Se uma fila de buffer de mensagens contiver um buffer de mensagens na fila, o hipervisor tentará entregar a mensagem. A entrega de mensagens terá êxito se a página SIM estiver habilitada e o slot de mensagem correspondente ao SINTx estiver vazio (ou seja, o tipo de mensagem no cabeçalho será definido como HvMessageTypeNone). Se uma mensagem for entregue com êxito, seu buffer de mensagem interno correspondente será desaqueado e marcado como gratuito. Se o SINTx correspondente não estiver mascarado, uma interrupção disparada por borda será entregue (ou seja, o bit correspondente no IRR será definido).

Esse registro pode ser usado por convidados para "sondar" mensagens. Ele também pode ser usado como uma maneira de esvaziar a fila de mensagens para um SINTx que foi desabilitado (ou seja, mascarado).

Se as filas de mensagens estiverem todas vazias, uma gravação no registro do EOM será um no-op.

As leituras do registro EOM sempre retornam zeros.

Bits Campo Description Attributes
63:0 RsvdZ Gatilho somente gravação Escrever