Compartilhar via


Virtual MMU

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

A implementação de MMU virtual é específica da arquitetura. Este documento aborda as plataformas x64 e ARM64, com seções específicas da plataforma claramente marcadas.

Visão geral do MMU virtual

Os processadores virtuais expõem 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 as 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

O MMU virtual exposto pelo hipervisor geralmente é compatível com o MMU físico encontrado na arquitetura do processador subjacente.

Em plataformas x64

O MMU virtual em plataformas x64 geralmente é compatível com o MMU físico encontrado em um processador x64. As seguintes diferenças observáveis por convidado existem:

  • O CR3. PWT e CR3. Talvez não haja suporte para bits PCD 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. Tentativas de definir esses bits programaticamente por meio de HvSetVpRegisters ou HvCallSwitchVirtualAddressSpace 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 PAT MSR 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 em vez disso.

Operações de gerenciamento de TLB herdadas

Cada arquitetura fornece mecanismos nativos para gerenciar os TLBs do processador. Esses mecanismos são virtualizados pelo hipervisor e afetam apenas o processador virtual local. Para invalidar traduções em outros processadores virtuais, o software deve usar interrupções entre processadores específicas da arquitetura ou as hiperchamadas de gerenciamento de TLB aprimoradas descritas na próxima seção.

Em plataformas x64

A arquitetura x64 fornece os seguintes mecanismos de gerenciamento de TLB:

  • A instrução INVLPG invalida a tradução para uma única página do TLB do processador. Se o endereço virtual especificado foi mapeado originalmente 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 dentro da entrada da tabela de páginas.
  • A instrução MOV para CR3 e as opções de tarefa que modificam a CR3 invalidam traduções para todas as páginas não globais no TLB do processador.
  • Uma instrução MOV para CR4 que modifica o CR4. Bit PGE (habilitação de página global), o CR4. 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).

Em plataformas ARM64

A arquitetura ARM64 fornece mecanismos de gerenciamento de TLB por meio das instruções TLBI (TLB Invalidate). Consulte o manual de arquitetura do ARM para obter mais detalhes.

Nota: As instruções de manutenção de cache set/way (como DC ISW, DC CSW, DC CISW) não têm suporte em ambientes virtualizados e são tratadas como não operações.

Aprimoramentos do TLB Virtual

Além de dar suporte aos mecanismos de gerenciamento TLB herdados descritos anteriormente, em plataformas x64 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 Description
HvCallFlushVirtualAddressSpace Invalida todas as entradas TLB virtuais que pertencem a um espaço de endereço especificado.
HvCallFlushVirtualAddressSpaceEx Semelhante a HvCallFlushVirtualAddressSpace, usa um VP esparso definido como entrada.
HvCallFlushVirtualAddressList Invalida uma parte do espaço de endereço especificado.
HvCallFlushVirtualAddressListEx Semelhante a HvCallFlushVirtualAddressList, usa um VP esparso definido 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 em um 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 HvCallSwitchVirtualAddressSpace 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 hiperchamadas (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 hiperchamadas (em vez de usar interrupções entre processadores geradas por convidado) para liberar uma ou mais páginas do TLB virtual.

Em plataformas ARM64, os convidados geralmente devem usar mecanismos de arquitetura para gerenciamento de TLB.

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

O hipervisor dá suporte a configurações de cache definidas por convidado para páginas mapeadas dentro do espaço GVA do convidado. Para obter uma descrição detalhada das configurações 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ágina convidada 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 de cache final 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 pelos 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 seja exaustiva, fornece vários exemplos:

  • Páginas que contêm parâmetros de entrada ou saída para hiperchamas
  • 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
  • Páginas de assistência de VP e outras páginas de interface do hipervisor

O hipervisor sempre executa acessos a parâmetros de hiperchamada e páginas de sobreposição usando Write-Back atributos em cache:

  • Em plataformas x64: tipo de cache WB (Write-Back) via PAT
  • Em plataformas ARM64: memória normal com write-back interno e externo, alocação de leitura Write-Allocate atributos

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