Compartilhar via


Processadores virtuais

Cada partição pode ter zero ou mais processadores virtuais.

Índices de processador virtual

Um processador virtual é identificado por uma tupla composta por sua ID de partição e seu índice de processador. O índice do processador é atribuído ao processador virtual quando ele é criado e permanece inalterado durante o tempo de vida do processador virtual.

Um valor especial HV_ANY_VP pode ser usado em determinadas situações para especificar "qualquer processador virtual". Um valor de HV_VP_INDEX_SELF pode ser usado para especificar o próprio índice de VP.

typedef UINT32 HV_VP_INDEX;

#define HV_ANY_VP ((HV_VP_INDEX)-1)

#define HV_VP_INDEX_SELF ((HV_VP_INDEX)-2)

Em plataformas x64

Em plataformas x64, a ID de um processador virtual pode ser recuperada pelo convidado por meio de um MSR definido por hipervisor (registro específico do modelo) HV_X64_MSR_VP_INDEX usando RDMSR.

#define HV_X64_MSR_VP_INDEX 0x40000002

Em plataformas ARM64

Em plataformas ARM64, a ID de um processador virtual pode ser recuperada por meio do registro sintético HvRegisterVpIndex usando a hiperchamada HvCallGetVpRegisters. Este é um registro somente leitura.

Estado de suspensão ocioso do processador virtual (somente x64)

Em plataformas x64, os processadores virtuais podem ser colocados em um estado de energia do processador ocioso virtual ou no estado de suspensão do processador. Esse estado de ociosidade virtual aprimorado permite que um processador virtual colocado em um estado ocioso de baixa potência seja acordado com a chegada de uma interrupção mesmo quando a interrupção é mascarada no processador virtual. Em outras palavras, o estado ocioso virtual permite que o sistema operacional na partição de convidado aproveite as técnicas de economia de energia do processador no sistema operacional que, de outra forma, estariam indisponíveis durante a execução em uma partição de convidado.

Uma partição que possui o privilégio AccessGuestIdleMsr pode disparar a entrada no estado de suspensão ocioso do processador virtual por meio de uma leitura para o MSR HV_X64_MSR_GUEST_IDLEdefinido pelo hipervisor. O processador virtual será acordado quando uma interrupção chegar, independentemente de a interrupção estar habilitada no processador virtual ou não.

Esse recurso não está disponível em plataformas ARM64.

Página auxiliar do processador virtual

O hipervisor fornece uma página por processador virtual que é sobreposta no espaço gpa convidado. Esta página pode ser usada para comunicação bidirecional entre um VP convidado e o hipervisor. O sistema operacional convidado tem acesso de leitura/gravação a esta página de assistência de VP virtual.

A estrutura da página de assistência de VP é definida em HV_VP_ASSIST_PAGE. Alguns campos nessa estrutura são específicos da arquitetura.

Em plataformas x64

Em plataformas x64, um convidado especifica o local da página de sobreposição (no espaço GPA) gravando no VP Virtual Assist MSR (0x40000073) usando WRMSR. O formato do MSR da Página de Assistência de VP Virtual é o seguinte:

Bits Campo Description
0 Enable Habilita a página de assistência de VP
11:1 RsvdP Reservado
63:12 PFN da página PFN da Página de Assistência do VP Virtual

Em plataformas ARM64

Nas plataformas ARM64, um convidado especifica o local da página de sobreposição (no espaço GPA) gravando no registro sintético HvRegisterVpAssistPage usando a hiperchamada HvCallSetVpRegisters. O formato de registro é idêntico ao formato msr x64.

Registro de tempo de execução do processador virtual

O agendador do hipervisor controla internamente quanto tempo cada processador virtual consome na execução do código. O tempo rastreado é uma combinação do tempo em que o processador virtual consome a execução do código convidado e o tempo em que o processador lógico associado passa executando o código do hipervisor em nome desse convidado. Esse tempo cumulativo é acessível por meio de um registro somente leitura. A quantidade de tempo é medida em 100ns unidades.

Em plataformas x64

Em plataformas x64, o runtime de VP é acessado por meio do MSR de hipervisor de HV_X64_MSR_VP_RUNTIME somente leitura de 64 bits usando RDMSR.

Em plataformas ARM64

Nas plataformas ARM64, o runtime de VP é acessado por meio do registro sintético HvRegisterVpRuntime usando a hiperchamada HvCallGetVpRegisters. Este é um registro somente leitura.

Prevenção de execução de instrução não privilegiada (NPIEP) (somente x64)

Em plataformas x64, a Prevenção de Execução de Instrução Não Privilegiada (NPIEP) é um recurso que limita o uso de determinadas instruções por código de modo de usuário. Especificamente, quando habilitado, esse recurso pode bloquear a execução das instruções SIDT, SGDT, SLDT e STR. A execução dessas instruções resulta em uma falha #GP.

Esse recurso deve ser configurado por VP usando HV_X64_MSR_NPIEP_CONFIG_CONTENTS.

Esse recurso não está disponível em plataformas ARM64.

Spinlocks de convidado

Um sistema operacional típico com vários processadores usa bloqueios para impor a atomicidade de determinadas operações. Ao executar esse sistema operacional dentro de uma máquina virtual controlada pelo hipervisor, essas seções críticas protegidas por bloqueios podem ser estendidas por interceptações geradas pelo código de seção crítico. O código de seção crítico também pode ser preempido pelo agendador do hipervisor. Embora o hipervisor tente impedir essas preempçãos, elas podem ocorrer. Consequentemente, outros competidores de bloqueio podem acabar girando até que o detentor do bloqueio seja agendado novamente e, portanto, estender significativamente o tempo de aquisição do spinlock.

O hipervisor indica ao sistema operacional convidado o número de vezes que uma aquisição de spinlock deve ser tentada antes de indicar uma situação de rotação excessiva para o hipervisor. Essa contagem é retornada no 0x40000004 folha CPUID. Um valor 0 indica que o sistema operacional convidado não deve notificar o hipervisor sobre a aquisição de spinlock longo.

A hiperchamada HvCallNotifyLongSpinWait fornece uma interface para convidados habilitados melhorarem a propriedade de imparcialidade estatística de um bloqueio para máquinas virtuais multiprocessador. O convidado deve fazer essa notificação em cada múltiplo da contagem recomendada retornada pela folha CPUID 0x40000004. Por meio dessa hiperchamada, um convidado notifica o hipervisor de uma aquisição de spinlock longa. Isso permite que o hipervisor tome melhores decisões de agendamento.