Compartilhar via


MMU virtual

A interface da máquina virtual exposta por cada partição inclui uma MMU (unidade de gerenciamento de memória). A MMU virtual exposta por partições de hipervisor geralmente é compatível com MMUs existentes.

Visão geral da MMU virtual

Os processadores virtuais expõem a memória virtual e um TLB virtual (buffer look-aside de tradução), que armazena em cache traduções de endereços virtuais para endereços físicos (convidados). Assim como acontece com o TLB em um processador lógico, o TLB virtual é um cache não coerente e essa não coerência é visível para os convidados. O hipervisor expõe operações para liberar o TLB. Os convidados podem usar essas operações para remover entradas potencialmente inconsistentes e tornar as traduções de endereço virtual previsíveis.

Compatibilidade

A MMU virtual exposta pelo hipervisor geralmente é compatível com a MMU física encontrada em um processador x64. Existem as seguintes diferenças observáveis pelo convidado:

  • O CR3. PWT e CR3. Os bits PCD podem não ter suporte em algumas implementações de hipervisor. Nessas implementações, qualquer tentativa do convidado de definir esses sinalizadores por meio de uma instrução MOV para CR3 ou um comutador de porta de tarefa será ignorada. As tentativas de definir esses bits programaticamente por meio de HvSetVpRegisters ou HvSwitchVirtualAddressSpace podem resultar em um erro.
  • Os bits PWT e PCD em uma entrada de tabela de página folha (por exemplo, um PTE para páginas de 4 K e um PDE para páginas grandes) especificam a capacidade de cache da página que está sendo mapeada. Os bits PAT, PWT e PCD dentro de entradas de tabela de página não folha indicam a capacidade de cache da tabela da próxima página na hierarquia. Algumas implementações de hipervisor podem não dar suporte a esses sinalizadores. Nessas implementações, todos os acessos de tabela de página executados pelo hipervisor são feitos usando atributos de cache de write-back. Isso afeta, em particular, os bits acessados e sujos gravados nas entradas da tabela de páginas. Se o convidado definir os bits PAT, PWT ou PCD dentro de entradas de tabela de página não folha, uma mensagem de "recurso sem suporte" poderá ser gerada quando um processador virtual acessar uma página mapeada por essa tabela de páginas.
  • O bit CR0.CD (desabilitar cache) pode não ter suporte em algumas implementações de hipervisor. Nessas implementações, o bit CR0.CD deve ser definido como 0. Qualquer tentativa do convidado de definir esse sinalizador por meio de uma instrução MOV para CR0 será ignorada. As tentativas de definir esse bit programaticamente por meio de HvSetVpRegisters resultarão em um erro.
  • O MSR pat (tipo de endereço de página) é um registro por VP. No entanto, quando todos os processadores virtuais em uma partição definem o MSR pat com o mesmo valor, o novo efeito se torna um efeito em toda a partição.
  • Por motivos de segurança e isolamento, a instrução INVD será virtualizada para agir como uma instrução WBINVD, com algumas diferenças. Para fins de segurança, CLFLUSH deve ser usado.

Operações de gerenciamento de TLB herdadas

A arquitetura x64 fornece várias maneiras de gerenciar os TLBs do processador. Os seguintes mecanismos são virtualizados pelo hipervisor:

  • A instrução INVLPG invalida a tradução para uma única página do TLB do processador. Se o endereço virtual especificado foi originalmente mapeado como uma página de 4 K, a tradução para esta página será removida do TLB. Se o endereço virtual especificado foi originalmente mapeado como uma "página grande" (2 MB ou 4 MB, dependendo do modo MMU), a tradução para toda a página grande será removida do TLB. A instrução INVLPG libera traduções globais e não globais. As traduções globais são definidas como aquelas que têm o bit "global" definido na entrada da tabela de páginas.
  • A instrução MOV para CR3 e as opções de tarefa que modificam as traduções de invalidação cr3 para todas as páginas não globais dentro do TLB do processador.
  • Uma instrução MOV para CR4 que modifica o CR4. Bit PGE (habilitação de página global), o CR4. Bit PSE (extensões de tamanho de página) ou CR4. O bit PAE (extensões de endereço de página) invalida todas as traduções (globais e não globais) no TLB do processador.

Observe que todas essas operações de invalidação afetam apenas um processador. Para invalidar traduções em outros processadores, o software deve usar um mecanismo "TLB shoot-down" baseado em software (normalmente implementado usando interrupções entre processos).

Aprimoramentos de TLB Virtual

Além de dar suporte aos mecanismos de gerenciamento TLB herdados descritos anteriormente, o hipervisor também dá suporte a um conjunto de aprimoramentos que permitem que um convidado gerencie o TLB virtual com mais eficiência. Essas operações aprimoradas podem ser usadas de forma intercambiável com operações de gerenciamento TLB herdadas.

O hipervisor dá suporte às seguintes hiperchamadas para invalidar TLBs:

Hiperchamada Descrição
HvCallFlushVirtualAddressSpace Invalida todas as entradas TLB virtuais que pertencem a um espaço de endereço especificado.
HvCallFlushVirtualAddressSpaceEx Semelhante a HvCallFlushVirtualAddressSpace, usa um conjunto de VP esparso como entrada.
HvCallFlushVirtualAddressList Invalida uma parte do espaço de endereço especificado.
HvCallFlushVirtualAddressListEx Semelhante a HvCallFlushVirtualAddressList, usa um conjunto de VP esparso como entrada.

Em alguns sistemas (aqueles com suporte suficiente para virtualização em hardware), as instruções de gerenciamento TLB herdadas podem ser mais rápidas para invalidação de TLB local ou remota (entre processadores). Os convidados interessados no desempenho ideal devem usar a folha CPUID 0x40000004 para determinar quais comportamentos implementar usando hiperchamas:

  • UseHypercallForAddressSpaceSwitch: se esse sinalizador estiver definido, o chamador deverá assumir que é mais rápido usar HvCallSwitchAddressSpace para alternar entre espaços de endereço. Se esse sinalizador estiver claro, uma instrução MOV para CR3 será recomendada.
  • UseHypercallForLocalFlush: se esse sinalizador estiver definido, o chamador deverá assumir que é mais rápido usar hiperchamas (em vez de INVLPG ou MOV para CR3) para liberar uma ou mais páginas do TLB virtual.
  • UseHypercallForRemoteFlushAndLocalFlushEntire: se esse sinalizador estiver definido, o chamador deverá assumir que é mais rápido usar hiperchamamentos (em vez de usar interrupções entre processadores geradas por convidado) para liberar uma ou mais páginas do TLB virtual.

Visão geral do controle de cache de memória

O hipervisor dá suporte a configurações de cache definidas pelo convidado para páginas mapeadas dentro do espaço GVA do convidado. Para obter uma descrição detalhada das configurações de capacidade de cache disponíveis e seus significados, consulte a documentação intel ou AMD.

Quando um processador virtual acessa uma página por meio de seu espaço de GVA, o hipervisor respeita os bits de atributo de cache (PAT, PWT e PCD) dentro da entrada da tabela de páginas convidadas usada para mapear a página. Esses três bits são usados como um índice no registro PAT (tipo de endereço de página) da partição para pesquisar a configuração final de capacidade de cache da página.

As páginas acessadas diretamente por meio do espaço gpa (por exemplo, quando a paginação é desabilitada porque CR0.PG está desmarcada) usam uma capacidade de cache definida pelas MTRRs. Se a implementação do hipervisor não der suporte a MTRRs virtuais, a capacidade de cache do WB será assumida.

Combinando tipos de cache entre uma partição e o hipervisor

Os convidados devem estar cientes de que algumas páginas em seu espaço gpa podem ser acessadas pelo hipervisor. A lista a seguir, embora não exaustiva, fornece vários exemplos:

  • página que contém parâmetros de entrada ou saída para uma hiperchamada
  • Todas as páginas de sobreposição, incluindo a página de hiperchamada, páginas SynIC SIEF e SIM e páginas de estatísticas

O hipervisor sempre executa acessos a parâmetros de hiperchamada e páginas de sobreposição usando a configuração de cache do WB.