Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
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.
Tratamento recomendado de mensagens
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.
Tratamento recomendado do sinalizador de evento
É 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 |