Compartilhar via


Comunicação entre partições

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ética).

Mensagens SynIC

O hipervisor fornece uma facilidade 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.

Mensagens

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 mensagem "em uso" e preenche o cabeçalho da mensagem com o tipo de mensagem, o tamanho da carga 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, o SINTx é implícito (no caso de mensagens interceptadas), 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. 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 é reconhecida 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 mensagem 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 um dos três eventos ocorra:

  • Outro buffer de mensagem está enfileirado.
  • 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.

Nos 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 da mensagem no 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 à 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 dentro de 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 como HvMessageTypeNone.
  • Indique o fim da interrupção do vetor gravando no registro 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 há quatro buffers de mensagem 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 ao pool de memória quando a porta é excluída.

Filas do 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

As 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, sejam eles disponíveis ou que contenham 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 de recebimento estiver associada a HV_ANY_VP, as mensagens não serão garantidas para chegar 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 de partição cruzada 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 evento são mais leves do que as mensagens e, portanto, são mais baixos. Além disso, os sinalizadores de evento 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 que recebe. 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 é reconhecida pelo processador virtual até que o PPR (registro de prioridade de processo) seja menor do 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 para a 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 é desmarcada como zero.

É recomendável que a ISR (rotina de serviço de interrupção do 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 EOI da APIC.
  • Execute todas as ações implícitas pelos sinalizadores de eventos 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 eventos 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 excluída posteriormente, sua conexão, enquanto ela permanecer, se tornará inútil.

SynIC MSRs

Além dos registros mapeados na memória definidos para uma APIC local, os MSRs (registros específicos do modelo) a seguir são definidos no SynIC. Cada processador virtual tem sua própria cópia desses registros, para que eles possam ser programados de forma independente.

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 da interrupção 0 (hipervisor)
0x40000090 SINT1 Origem de interrupção 1
0x40000090 SINT2 Origem de interrupção 2
0x40000090 SINT3 Origem de interrupção 3
0x40000090 SINT4 Origem de interrupção 4
0x40000090 SINT5 Origem de interrupção 5
0x40000090 SINT6 Origem de interrupção 6
0x40000090 SINT7 Origem de interrupção 7
0x40000090 SINT8 Origem de interrupção 8
0x40000090 SINT9 Origem de interrupção 9
0x40000090 SINT10 Origem de interrupção 10
0x40000090 SINT11 Origem de interrupção 11
0x40000090 SINT12 Origem de interrupção 12
0x40000090 SINT13 Origem de interrupção 13
0x40000090 SINT14 Origem de interrupção 14
0x40000090 SINT15 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 após a 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 Descrição Atributos
63:1 RsvdP O valor deve ser preservado Leitura/gravação
0 Habilitar Quando definido, esse processador virtual permitirá que notificações de sinalizador de eventos e enfileiramento de mensagens sejam postadas em seu SynIC. Quando claro, as notificações de sinalizador de evento e enfileiramento de mensagens não podem ser direcionadas para esse processador virtual. Leitura/gravação

Registro SVERSION

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

Bits Campo Descrição Atributos
63:32 RsvdP Ler
31:0 Versão do SynIC Número da versão do SynIc Ler

Registro SIEFP

No momento da criação do processador virtual e após a redefinição do processador, o valor desse registro SIEFP (página de sinalizadores de evento de interrupção sintética) é 0x0000000000000000. Portanto, 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 Descrição Atributos
63:12 Endereço básico 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 Habilitar Habilitar SIEFP Leitura/gravação

Registro SIMP

No momento da criação do processador virtual e após a redefinição do processador, o valor desse registro SIMP (página de mensagem de interrupção sintética) é 0x0000000000000000. Portanto, 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 Descrição Atributos
63:12 Endereço básico Endereço base (no espaço GPA) de SIMP (12 bits baixos considerados desabilitados) Leitura/gravação
11:1 RsvdP Reservado, o valor deve ser preservado Leitura/gravação
0 Habilitar Habilitar 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. Portanto, todas as fontes de interrupção sintética são mascaradas por padrão. O convidado deve desmascará-los programando um vetor apropriado e limpando 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 "REGISTRO em serviço" (ISR) da APIC virtual. Se o convidado habilitar esse comportamento, ele não deverá executar um 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, depois que o SINT for 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 em voo se apliquem

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

Bits Campo Descrição Atributos
63:19 RsvdP Reservado, o valor deve ser preservado Leitura/gravação
18 Sondagem 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 Vetor Interromper vetor Leitura/gravação

Registro EOM

Um registro de gravação no final da 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 mensagem contiver um buffer de mensagem enfileirada, 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 interna correspondente será desqueuado 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 drenar 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á não operada.

As leituras do registro EOM sempre retornam zeros.

Bits Campo Descrição Atributos
63:0 RsvdZ Gatilho somente gravação Gravar