Partilhar 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)

A ID de um processador virtual pode ser recuperada pelo convidado por meio de um MSR definido pelo hipervisor (registro específico do modelo) HV_X64_MSR_VP_INDEX.

#define HV_X64_MSR_VP_INDEX 0x40000002

Estado de suspensão ociosa do processador virtual

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 ocioso 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 convidada aproveite as técnicas de economia de energia do processador no sistema operacional que, de outra forma, não estariam disponíveis durante a execução em uma partição convidada.

Uma partição que possui o privilégio AccessGuestIdleMsr pode disparar a entrada no estado de suspensão ociosa 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.

Página assistência 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.

Um convidado especifica o local da página de sobreposição (no espaço GPA) gravando no MSR (Assistente de VP Virtual) (0x40000073). O formato do MSR da Página de Assistência de VP Virtual é o seguinte:

Bits Campo Descrição
0 Habilitar Habilita a página de assistência de VP
11:1 RsvdP Reservado
63:12 PFN de página PFN da Página de Assistência de VP Virtual

Registro de tempo de execução do processador virtual

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

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

A execução de instrução não privilegiada (NPIEP) é um recurso que limita o uso de determinadas instruções pelo código do 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 de #GP.

Esse recurso deve ser configurado por VP usando HV_X64_MSR_NPIEP_CONFIG_CONTENTS.

Spinlocks convidados

Um sistema operacional típico com capacidade para 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ítica. O código de seção crítica também pode ser preempto pelo agendador do hipervisor. Embora o hipervisor tente evitar essas preempçãos, elas podem ocorrer. Consequentemente, outros competidores de bloqueio podem acabar girando até que o detentor do bloqueio seja re-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 longo. Isso permite que o hipervisor tome melhores decisões de agendamento.