Compartir a través de


Procesadores virtuales

Cada partición puede tener cero o más procesadores virtuales.

Índices de procesador virtual

Un procesador virtual se identifica mediante una tupla compuesta por su identificador de partición y su índice de procesador. El índice del procesador se asigna al procesador virtual cuando se crea y no se modifica durante la vigencia del procesador virtual.

Se puede usar un valor especial HV_ANY_VP en determinadas situaciones para especificar "cualquier procesador virtual". Se puede usar un valor de HV_VP_INDEX_SELF para especificar el propio índice VP de uno.

typedef UINT32 HV_VP_INDEX;

#define HV_ANY_VP ((HV_VP_INDEX)-1)

#define HV_VP_INDEX_SELF ((HV_VP_INDEX)-2)

En plataformas x64

En las plataformas x64, el invitado puede recuperar el identificador de un procesador virtual a través de un msR definido por hipervisor (registro específico del modelo) HV_X64_MSR_VP_INDEX mediante RDMSR.

#define HV_X64_MSR_VP_INDEX 0x40000002

En plataformas ARM64

En las plataformas ARM64, el identificador de un procesador virtual se puede recuperar a través del registro sintético HvRegisterVpIndex mediante la hiperllamada HvCallGetVpRegisters. Se trata de un registro de solo lectura.

Estado de suspensión inactiva del procesador virtual (solo x64)

En plataformas x64, los procesadores virtuales se pueden colocar en un estado de energía de procesador inactivo virtual o en estado de suspensión del procesador. Este estado de inactividad virtual mejorado permite que un procesador virtual que se coloque en un estado de inactividad de baja potencia se active con la llegada de una interrupción incluso cuando la interrupción se enmascara en el procesador virtual. En otras palabras, el estado de inactividad virtual permite al sistema operativo de la partición de invitado aprovechar las técnicas de ahorro de energía del procesador en el sistema operativo que, de lo contrario, no estarían disponibles al ejecutarse en una partición de invitado.

Una partición que posee el privilegio AccessGuestIdleMsr puede desencadenar la entrada en el estado de suspensión de inactividad del procesador virtual a través de una lectura de MSR HV_X64_MSR_GUEST_IDLEdefinido por el hipervisor . El procesador virtual se reactivará cuando llegue una interrupción, independientemente de si la interrupción está habilitada en el procesador virtual o no.

Esta característica no está disponible en plataformas ARM64.

Página Virtual Processor Assist

El hipervisor proporciona una página por procesador virtual que se superpone en el espacio de GPA invitado. Esta página se puede usar para la comunicación bidireccional entre un VP invitado y el hipervisor. El sistema operativo invitado tiene acceso de lectura y escritura a esta página de asistencia de VP virtual.

La estructura de la página de asistencia vp se define en HV_VP_ASSIST_PAGE. Algunos campos de esta estructura son específicos de la arquitectura.

En plataformas x64

En las plataformas x64, un invitado especifica la ubicación de la página de superposición (en el espacio GPA) escribiendo en el MSR virtual VP Assist (0x40000073) mediante WRMSR. El formato de la página Virtual VP Assist MSR es el siguiente:

Bits Campo Description
0 Enable Habilita la página de asistencia de VP
11:1 RsvdP Reservado
63:12 PFN de página PFN de la página Virtual VP Assist

En plataformas ARM64

En las plataformas ARM64, un invitado especifica la ubicación de la página de superposición (en el espacio GPA) escribiendo en el registro sintético HvRegisterVpAssistPage mediante la hiperllamada HvCallSetVpRegisters. El formato de registro es idéntico al formato msR x64.

Registro de tiempo de ejecución del procesador virtual

El programador del hipervisor realiza un seguimiento interno del tiempo que consume cada procesador virtual en la ejecución de código. El tiempo de seguimiento es una combinación del tiempo que el procesador virtual consume código invitado en ejecución y el tiempo que dedica el procesador lógico asociado a ejecutar código de hipervisor en nombre de ese invitado. Este tiempo acumulado es accesible a través de un registro de solo lectura. La cantidad de tiempo se mide en 100ns unidades.

En plataformas x64

En las plataformas x64, se accede al entorno de ejecución de VP a través del HV_X64_MSR_VP_RUNTIME MSR de hipervisor de 64 bits mediante RDMSR.

En plataformas ARM64

En las plataformas ARM64, se accede al tiempo de ejecución de VP a través del registro sintético HvRegisterVpRuntime mediante la hiperllamada HvCallGetVpRegisters. Se trata de un registro de solo lectura.

Prevención de ejecución de instrucciones sin privilegios (NPIEP) (solo x64)

En plataformas x64, la prevención de ejecución de instrucciones sin privilegios (NPIEP) es una característica que limita el uso de determinadas instrucciones por código en modo de usuario. En concreto, cuando está habilitada, esta característica puede bloquear la ejecución de las instrucciones SIDT, SGDT, SLDT y STR. La ejecución de estas instrucciones produce un error de #GP.

Esta característica debe configurarse por VP mediante HV_X64_MSR_NPIEP_CONFIG_CONTENTS.

Esta característica no está disponible en plataformas ARM64.

Interbloqueos de invitado

Un sistema operativo compatible con varios procesadores típico usa bloqueos para aplicar la atomicidad de determinadas operaciones. Al ejecutar este tipo de sistema operativo dentro de una máquina virtual controlada por el hipervisor, estas secciones críticas protegidas por bloqueos se pueden ampliar mediante interceptaciones generadas por el código de sección crítica. El programador del hipervisor también puede adelantando el código de sección crítico. Aunque el hipervisor intenta evitar tales adelantamientos, pueden producirse. Por lo tanto, otros contendientes de bloqueo podrían terminar girando hasta que el titular del bloqueo se vuelva a programar y, por lo tanto, ampliar significativamente el tiempo de adquisición del bloqueo por subproceso.

El hipervisor indica al sistema operativo invitado el número de veces que se debe intentar una adquisición de bloqueo por subproceso antes de indicar una situación excesiva de giro al hipervisor. Este recuento se devuelve en el 0x40000004 hoja CPUID. Un valor de 0 indica que el sistema operativo invitado no debe notificar al hipervisor sobre la adquisición de bloqueos por subproceso largo.

El hipercall HvCallNotifyLongSpinWait proporciona una interfaz para que los invitados optimizados mejoren la propiedad estadística de equidad de un bloqueo para máquinas virtuales multiprocesador. El invitado debe realizar esta notificación en cada número recomendado devuelto por el 0x40000004 hoja CPUID. A través de esta hiperllamada, un invitado notifica al hipervisor de una adquisición de bloqueo por subproceso largo. Esto permite al hipervisor tomar mejores decisiones de programación.