Compartilhar via


Controlador de Interrupção Virtual

O hipervisor virtualiza a entrega de interrupção para processadores virtuais.

controladores de interrupção virtual Architecture-Specific

Em plataformas x64

Em plataformas x64, a virtualização de interrupção é feita por meio do uso de um controlador de interrupção sintético (SynIC), que é uma extensão de uma APIC local virtualizada; ou seja, cada processador virtual tem uma instância APIC local com as extensões SynIC. Essas extensões fornecem um mecanismo simples de comunicação entre partições descrito no capítulo Inter-Partition Comunicação .

Em plataformas ARM64

Nas plataformas ARM64, o hipervisor expõe um controlador de interrupção genérico arm virtual (GIC) que está em conformidade com a especificação de arquitetura do ARM GIC. As partições de convidado devem se referir à Especificação de Arquitetura do ARM GIC para obter detalhes sobre a interface GIC virtual, registros e mecanismos de tratamento de interrupção.

Categorias de interrupção

As interrupções entregues a uma partição se enquadram em duas categorias: externa e interna. As interrupções externas se originam de outras partições ou dispositivos, e as interrupções internas se originam de dentro da própria partição.

Interrupções externas são geradas nas seguintes situações:

  • Um dispositivo de hardware físico gera uma interrupção de hardware.
  • Uma partição pai declara uma interrupção virtual (normalmente no processo de emulação de um dispositivo de hardware).
  • O hipervisor entrega uma mensagem (por exemplo, devido a uma interceptação) a uma partição.
  • Outra partição posta uma mensagem.
  • Outra partição sinaliza um evento.

Interrupções internas são geradas nas seguintes situações:

  • Um processador virtual acessa o ICR (registro de comando de interrupção da APIC).
  • Um temporizador sintético expira.

APIC local (somente x64)

Em plataformas x64, o SynIC é um superconjunto de uma APIC local. A interface para essa APIC é fornecida por um conjunto de registros mapeados de memória de 32 bits. Essa APIC local (incluindo o comportamento dos registros mapeados de memória) geralmente é compatível com a APIC local em sistemas P4/Xeon, conforme descrito na documentação da Intel e da AMD.

A virtualização APIC local do hipervisor pode se desviar da operação APIC física das seguintes maneiras secundárias:

  • Em sistemas físicos, o IA32_APIC_BASE MSR pode ser diferente para cada processador no sistema. O hipervisor pode exigir que esse MSR contenha o mesmo valor para todos os processadores virtuais dentro de uma partição. Dessa forma, essa MSR pode ser tratada como um valor em toda a partição. Se um processador virtual modificar esse registro, o valor poderá efetivamente se propagar para todos os processadores virtuais dentro da partição.
  • O IA32_APIC_BASE MSR define um bit de "habilitação global" para habilitar ou desabilitar a APIC. A APIC virtualizada sempre pode estar habilitada. Nesse caso, esse bit sempre será definido como 1.
  • A APIC local do hipervisor pode não ser capaz de gerar SMIs virtuais (interrupções de gerenciamento do sistema).
  • Se vários processadores virtuais em uma partição receberem IDs APIC idênticas, o comportamento da entrega de interrupção direcionada será limitadomente indefinido. Ou seja, o hipervisor é gratuito para entregar a interrupção para apenas um processador virtual, todos os processadores virtuais com a ID APIC especificada ou nenhum processador virtual. Essa situação é considerada um erro de programação de convidado.
  • Alguns dos registros APIC mapeados de memória podem ser acessados por meio de MSRs virtuais.
  • O hipervisor pode não permitir que um convidado modifique suas IDs APIC.

As partes restantes desta seção descrevem apenas os aspectos da funcionalidade SynIC que são extensões da APIC local.

Acessos APIC MSR locais (somente x64)

Em plataformas x64, o hipervisor fornece acesso acelerado de MSR a registros APIC mapeados de memória de alto uso. Estes são os registros TPR, EOI e ICR. Os registros ICR baixos e ICR altos são combinados em uma MSR. Por motivos de desempenho, o sistema operacional convidado deve seguir a recomendação do hipervisor para o uso das MSRs APIC.

Essas MSRs não estão disponíveis em plataformas ARM64, em que as operações do controlador de interrupção são executadas por meio da interface GIC virtual.

Endereço MSR Nome do Registro Description
0x40000070 HV_X64_MSR_EOI Acessa a EOI da APIC
0x40000071 HV_X64_MSR_ICR Acessa o APIC ICR-high e o ICR-low
0x40000072 HV_X64_MSR_TPR Acessar o TPR da APIC

HV_X64_MSR_EOI

Bits Description Attributes
63:32 RsvdZ (reservado, deve ser zero) Escrever
31:0 Valor de EOI Escrever

HV_X64_MSR_ICR

Bits Description Attributes
63:32 Valor alto do ICR Leitura/gravação
31:0 Valor baixo do ICR Leitura/gravação

HV_X64_MSR_TPR

Bits Description Attributes
63:8 RsvdZ (reservado, deve ser zero) Leitura/gravação
7:0 Valor de TPR Leitura/gravação

Essa MSR destina-se a acelerar o acesso ao TPR em partições de convidado no modo de 32 bits. As partições de convidado do modo de 64 bits devem definir o TPR por meio de CR8.

IPI de cluster sintético

O hipervisor dá suporte a hipervisores que permitem o envio de interrupções fixas virtuais para um conjunto arbitrário de processadores virtuais.

Hiperchamada Description
HvCallSendSyntheticClusterIpi Envia uma interrupção fixa virtual para o conjunto de processadores virtuais especificado.
HvCallSendSyntheticClusterIpiEx Semelhante a HvCallSendSyntheticClusterIpi, usa um VP esparso definido como entrada.

Assistência de EOI (somente x64)

Em plataformas x64, um campo na Página de Assistência ao Processador Virtual é o campo Auxiliar de EOI. O campo EOI Assist reside no deslocamento 0 da página de sobreposição e tem 32 bits de tamanho. O formato do campo de assistência de EOI é o seguinte:

Essa iluminação não está disponível em plataformas ARM64, em que as operações de EOI são executadas por meio da interface GIC virtual.

Bits Description Attributes
31:1 RsvdZ Leitura/gravação
0 Não é necessário EOI Leitura/gravação

O sistema operacional convidado executa uma EOI gravando atomicamente zero no campo Assistência de EOI da página de assistência de VP virtual e verificando se o campo "Nenhum EOI necessário" era anteriormente zero. Se fosse, o sistema operacional deverá gravar no HV_X64_MSR_EOI MSR, disparando assim uma interceptação no hipervisor. O código a seguir é recomendado para executar uma EOI:

lea rcx, [VirtualApicAssistVa]
btr [rcx], 0
jc NoEoiRequired

mov ecx, HV_X64_MSR_EOI
wrmsr

NoEoiRequired:

O hipervisor define o bit "Nenhuma EOI necessária" quando injeta uma interrupção virtual se as seguintes condições forem atendidas:

  • A interrupção virtual é disparada por borda e
  • Não há interrupções de prioridade mais baixas pendentes

Se, posteriormente, uma interrupção de prioridade mais baixa for solicitada, o hipervisor limpará "Nenhuma EOI necessária" de modo que um EOI subsequente cause uma interceptação.

No caso de interrupções aninhadas, a interceptação de EOI é evitada apenas para a interrupção de prioridade mais alta. Isso é necessário, pois nenhuma contagem é mantida para o número de EOIs executados pelo sistema operacional. Portanto, somente a primeira EOI pode ser evitada e, como o primeiro EOI limpa o bit "Sem EOI Obrigatório", o próximo EOI gera uma interceptação. No entanto, interrupções aninhadas são raras, portanto, isso não é um problema no caso comum.

Observe que os dispositivos e/ou a APIC de E/S (física ou sintética) não precisam ser notificados de um EOI para uma interrupção disparada por borda – o hipervisor intercepta esses EOIs apenas para atualizar o estado APIC virtual. Em alguns casos, o estado APIC virtual pode ser atualizado lentamente – nesses casos, o bit "NoEoiRequired" é definido pelo hipervisor indicando ao convidado que uma interceptação EOI não é necessária. Em um instante posterior, o hipervisor pode derivar o estado da APIC local, dependendo do valor atual do bit "NoEoiRequired".

Habilitar e desabilitar essa iluminação pode ser feito a qualquer momento independentemente da atividade de interrupção e do estado APIC nesse momento. Embora a iluminação esteja habilitada, os EOIs convencionais ainda podem ser executados independentemente do valor "Nenhuma EOI necessária", mas não perceberão o benefício de desempenho da iluminação.