Partilhar via


Processadores Virtuais

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

Índices de Processador Virtual

Um processador virtual é identificado por uma tuplo composta pelo seu ID de partição e pelo seu índice de processador. O índice do processador é atribuído ao processador virtual quando este é criado, mantendo-se inalterado durante toda a vida útil do processador virtual.

Um valor especial HV_ANY_VP pode ser usado em certas situações para especificar "qualquer processador virtual". Um valor de HV_VP_INDEX_SELF pode ser usado para especificar o seu 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, o ID de um processador virtual pode ser recuperado pelo convidado através de um HV_X64_MSR_VP_INDEX MSR (registo específico do modelo) definido pelo hipervisor usando RDMSR.

#define HV_X64_MSR_VP_INDEX 0x40000002

Nas plataformas ARM64

Nas plataformas ARM64, o ID de um processador virtual pode ser recuperado através do registo sintético HvRegisterVpIndex usando a hiperchamada HvCallGetVpRegisters. Este é um registo de apenas leitura.

Estado de Sono Ocioso do Processador Virtual (apenas x64)

Em plataformas x64, os processadores virtuais podem ser colocados num estado virtual de energia do processador ocioso, ou estado de suspensão do processador. Este estado virtual de inatividade melhorado permite que um processador virtual colocado num estado de inatividade de baixo consumo seja despertado com a chegada de uma interrupção mesmo quando a interrupção está mascarada no processador virtual. Por outras palavras, o estado virtual de inatividade permite que o sistema operativo na partição convidada tire partido das técnicas de poupança de energia do processador no sistema operativo que, de outra forma, estariam indisponíveis quando executadas numa partição convidada.

Uma partição que possui o privilégio AccessGuestIdleMsr pode desencadear a entrada no estado de inatividade do processador virtual através de uma leitura do MSR HV_X64_MSR_GUEST_IDLEdefinido pelo hipervisor. O processador virtual será despertado quando uma interrupção chegar, independentemente de a interrupção estar ativada no processador virtual ou não.

Esta funcionalidade não está disponível nas plataformas ARM64.

Página de Assistência ao Processador Virtual

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

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

Em plataformas x64

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

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

Nas plataformas ARM64

Nas plataformas ARM64, um convidado especifica a localização da página sobreposta (no espaço GPA) escrevendo no registo sintético HvRegisterVpAssistPage usando a hiperchamada HvCallSetVpRegisters. O formato dos registos é idêntico ao formato x64 MSR.

Registo de Tempo de Execução do Processador Virtual

O escalonador do hipervisor acompanha internamente quanto tempo cada processador virtual consome na execução do código. O tempo acompanhado é uma combinação do tempo que o processador virtual consome a executar código convidado e do tempo que o processador lógico associado passa a executar código de hipervisor em nome desse convidado. Este tempo acumulado é acessível através de um registo de apenas leitura. A quantidade de tempo é medida em unidades de 100ns.

Em plataformas x64

Em plataformas x64, o runtime do VP é acedido através do hipervisor MSR HV_X64_MSR_VP_RUNTIME apenas leitura de 64 bits, usando RDMSR.

Nas plataformas ARM64

Nas plataformas ARM64, o runtime do VP é acedido através do registo sintético HvRegisterVpRuntime usando a hiperchamada HvCallGetVpRegisters. Este é um registo de apenas leitura.

Prevenção de Execução de Instruções Não Privilegiadas (NPIEP) (apenas x64)

Em plataformas x64, a Prevenção de Execução de Instruções Não Privilegiadas (NPIEP) é uma funcionalidade que limita o uso de certas instruções por código em modo utilizador. Especificamente, quando ativada, esta funcionalidade pode bloquear a execução das instruções SIDT, SGDT, SLDT e STR. A execução destas instruções resulta numa falha #GP.

Esta funcionalidade deve ser configurada por VP usando HV_X64_MSR_NPIEP_CONFIG_CONTENTS.

Esta funcionalidade não está disponível nas plataformas ARM64.

Spinlocks Convidados

Um sistema operativo típico com capacidade multiprocessador usa bloqueios para impor a atomicidade de certas operações. Ao executar tal sistema operativo dentro de uma máquina virtual controlada pelo hipervisor, estas secções críticas protegidas por bloqueios podem ser estendidas por interceções geradas pelo código da secção crítica. O código da secção crítica também pode ser preemptado pelo escalonador do hipervisor. Embora o hipervisor tente evitar tais preempções, elas podem ocorrer. Consequentemente, outros concorrentes de fechadura podem acabar por girar até que o detentor da fechadura seja novamente reagendado e, assim, prolongar significativamente o tempo de aquisição do bloqueio de spin.

O hipervisor indica ao sistema operativo convidado quantas vezes deve ser tentada uma aquisição de spinlock antes de indicar uma situação de spin excessivo ao hipervisor. Esta contagem é devolvida em folha CPUID 0x40000004. Um valor de 0 indica que o sistema operativo convidado não deve notificar o hipervisor sobre aquisição de spinlock longo.

A hiperchamada HvCallNotifyLongSpinWait fornece uma interface para convidados esclarecidos melhorarem a propriedade de justiça estatística de um bloqueio para máquinas virtuais multiprocessador. O convidado deve fazer esta notificação a cada múltiplo da contagem recomendada devolvida pelo 0x40000004 CPUID leaf. Através desta chamada hiper, um convidado notifica o hipervisor de uma aquisição de spinlock longo. Isto permite ao hipervisor tomar melhores decisões de agendamento.