Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
El hipervisor proporciona servicios de control de tiempo sencillos. Se basan en un origen de tiempo de referencia de frecuencia constante (normalmente el temporizador ACPI en sistemas x64).
Se proporcionan los siguientes servicios de temporizador:
- Contador de tiempo de referencia por partición.
- Cuatro temporizadores sintéticos por procesador virtual. Cada temporizador sintético es un temporizador único o periódico que entrega un mensaje o afirma una interrupción cuando expira.
- Un temporizador APIC virtual por procesador virtual.
- Una iluminación del tiempo de referencia de partición, en función de la compatibilidad de la plataforma host con un contador de marca de tiempo invariable (iTSC).
Contador de referencia
El hipervisor mantiene un contador de tiempo de referencia por partición. Tiene la característica de que los accesos sucesivos a él devuelven valores estrictamente crecientes (tiempo) de forma estrictamente monotonica, tal como lo ven todos y todos los procesadores virtuales de una partición. Además, el contador de referencia es constante de velocidad y no se ve afectado por transiciones de velocidad de procesador o bus o estados de ahorro de energía de procesador profundo. El contador de tiempo de referencia de una partición se inicializa en cero cuando se crea la partición. El contador de referencia para todas las particiones cuenta a la misma velocidad, pero en cualquier momento, sus valores absolutos suelen diferir porque las particiones tendrán tiempos de creación diferentes.
El contador de referencia sigue contando siempre que al menos un procesador virtual no se suspenda explícitamente.
Registro del contador de referencia de particiones
En plataformas x64
En las plataformas x64, se puede acceder al contador de referencia de una partición a través de msR de toda la partición.
| Dirección MSR | Nombre del registro | Description |
|---|---|---|
| 0x40000020 | HV_X64_MSR_TIME_REF_COUNT | Recuento de referencias de tiempo (en toda la partición) |
En plataformas ARM64
En las plataformas ARM64, se accede al contador de referencia de una partición a través del registro sintético HvRegisterTimeRefCount mediante las hiperllamadas HvCallGetVpRegisters y HvCallSetVpRegisters.
| Nombre del registro | Description |
|---|---|
| HvRegisterTimeRefCount | Recuento de referencias de tiempo (en toda la partición) |
Registrar comportamiento
Cuando se crea una partición, el valor del registro del contador de referencia se establece en 0x0000000000000000. Un procesador virtual no puede modificar este valor. En las plataformas x64, cualquier intento de escritura en MSR produce un error de #GP. En las plataformas ARM64, los intentos de escritura a través de HvCallSetVpRegisters devuelven HV_STATUS_INVALID_PARAMETER.
Iluminación del tiempo de referencia de partición
La iluminación del tiempo de referencia de partición presenta un origen de tiempo de referencia a una partición que no requiere una interceptación en el hipervisor. Esta iluminación solo está disponible cuando la plataforma subyacente proporciona compatibilidad con un contador de marca de tiempo de procesador invariable (TSC) o iTSC. En estas plataformas, la frecuencia de TSC del procesador permanece constante independientemente de los cambios en la frecuencia del reloj del procesador debido al uso de estados de administración de energía, como estados de rendimiento del procesador ACPI, estados de suspensión inactiva del procesador (estados C ACPI), etc.
La iluminación del tiempo de referencia de partición usa un valor de TSC virtual, un desplazamiento y un multiplicador para permitir que una partición de invitado calcule el tiempo de referencia normalizado desde la creación de la partición, en 100nS unidades. El mecanismo también permite que una partición de invitado calcule atómicamente el tiempo de referencia cuando la partición de invitado se migre a una plataforma con una tasa de TSC diferente y proporciona un mecanismo de reserva para admitir la migración a plataformas sin la característica de TSC de velocidad constante.
Esta instalación no está pensada para usarse como origen de la hora del reloj, ya que el tiempo de referencia calculado mediante esta instalación parecerá detenerse durante el tiempo en que se guarda una partición de invitado hasta la restauración posterior.
Página Contador de marca de tiempo de referencia de partición
El hipervisor proporciona una página de TSC de referencia virtual de toda la partición que se superpone en el espacio GPA de la partición. Se accede a la página del contador de marca de tiempo de referencia de una partición a través de MSR de referencia de TSC.
La página de TSC de referencia se define mediante la siguiente estructura:
typedef struct
{
volatile UINT32 TscSequence;
UINT32 Reserved1;
volatile UINT64 TscScale;
volatile INT64 TscOffset;
UINT64 Reserved2[509];
} HV_REFERENCE_TSC_PAGE;
Registro de página contador de marca de tiempo de referencia (TSC)
Un invitado que desee acceder a su página de referencia de TSC debe usar un registro sintético. Una partición que posee el privilegio AccessPartitionReferenceTsc puede acceder al registro.
En plataformas x64
En plataformas x64, se accede a la página de referencia de TSC a través de msr.
| Dirección MSR | Nombre del registro | Description |
|---|---|---|
| 0x40000021 | HV_X64_MSR_REFERENCE_TSC | Página de TSC de referencia |
En plataformas ARM64
En las plataformas ARM64, se accede a la página de TSC de referencia a través del registro sintético HvRegisterReferenceTsc mediante las hiperllamadas HvCallGetVpRegisters y HvCallSetVpRegisters.
| Nombre del registro | Description |
|---|---|
| HvRegisterReferenceTsc | Página de TSC de referencia |
Registrar diseño
| bits | Description | Attributes |
|---|---|---|
| 63:12 | Número de página de GPA | Lectura y escritura |
| 11:1 | RsvdP (el valor debe conservarse) | Lectura y escritura |
| 0 | Enable | Lectura y escritura |
En el momento de creación de la partición de invitado, el valor de la referencia de MSR de TSC es 0x0000000000000000. Por lo tanto, la página de TSC de referencia está deshabilitada de forma predeterminada. El invitado debe habilitar la página de TSC de referencia estableciendo el bit 0. Si la dirección base especificada está más allá del final del espacio GPA de la partición, la página de referencia de TSC no será accesible para el invitado. Al modificar el registro, los invitados deben conservar el valor de los bits reservados (de 1 a 11) para una compatibilidad futura.
Mecanismo de TSC de referencia de partición
La fórmula siguiente calcula el tiempo de referencia de partición:
ReferenceTime = ((VirtualTsc * TscScale) >> 64) + TscOffset
La multiplicación es una multiplicación de 64 bits, lo que da como resultado un número de 128 bits que luego se desplaza 64 veces a la derecha para obtener los 64 bits altos.
El valor de TscScale se usa para ajustar el valor de TSC virtual entre eventos de migración para mitigar los cambios de frecuencia de TSC de una plataforma a otra.
El valor de TscSequence se usa para sincronizar el acceso a la hora de referencia habilitada si la escala o los campos de desplazamiento se cambian durante la migración en vivo o guardar o restaurar. Este campo actúa como un número de secuencia que se incrementa cada vez que se modifica la escala o los campos de desplazamiento. Se usa un valor especial de 0x0 para indicar que esta instalación ya no es un origen confiable de tiempo de referencia y la máquina virtual debe revertir a un origen diferente.
A continuación se muestra el código recomendado para calcular el tiempo de referencia de partición mediante esta ilustración:
do
{
StartSequence = ReferenceTscPage->TscSequence;
if (StartSequence == 0)
{
// 0 means that the Reference TSC enlightenment is not available at
// the moment, and the Reference Time can only be obtained from
// reading the Reference Counter MSR.
ReferenceTime = rdmsr(HV_X64_MSR_TIME_REF_COUNT);
return ReferenceTime;
}
Tsc = rdtsc();
// Assigning Scale and Offset should neither happen before
// setting StartSequence, nor after setting EndSequence.
Scale = ReferenceTscPage->TscScale;
Offset = ReferenceTscPage->TscOffset;
EndSequence = ReferenceTscPage->TscSequence;
} while (EndSequence != StartSequence);
// The result of the multiplication is treated as a 128-bit value.
ReferenceTime = ((Tsc * Scale) >> 64) + Offset;
return ReferenceTime;
Temporizadores sintéticos
Los temporizadores sintéticos proporcionan un mecanismo para generar una interrupción después de algún tiempo especificado en el futuro. Se admiten temporizadores únicos y periódicos. Un temporizador sintético envía un mensaje a un sintx synIC especificado (origen de interrupción sintética) tras la expiración, o afirma una interrupción, en función de cómo se configure.
El hipervisor garantiza que una señal de expiración del temporizador nunca se entregará antes de la hora de expiración. La señal puede llegar en cualquier momento después de la hora de expiración.
Temporizadores periódicos
El hipervisor intenta indicar temporizadores periódicos de forma periódica. Sin embargo, si el procesador virtual usado para indicar la expiración no está disponible, algunas de las expiraciones del temporizador pueden retrasarse. Un procesador virtual puede no estar disponible porque está suspendido (por ejemplo, durante el control de interceptación) o porque el programador del hipervisor decidió que el procesador virtual no debe estar programado en un procesador lógico (por ejemplo, porque otro procesador virtual usa el procesador lógico o el procesador virtual ha superado su cuota).
Si un procesador virtual no está disponible durante un período de tiempo lo suficientemente largo, se puede perder un período de temporizador completo. En este caso, el hipervisor usa una de estas dos técnicas.
La primera técnica implica la modulación del período del temporizador, en efecto acortando el período hasta que el temporizador "se ponga al día". Si se ha perdido un número significativo de señales de temporizador, es posible que el hipervisor no pueda compensar mediante la modulación del período. En este caso, se pueden omitir completamente algunas señales de expiración del temporizador.
En el caso de los temporizadores marcados como diferidos, el hipervisor usa una segunda técnica para tratar la situación en la que un procesador virtual no está disponible durante un largo período de tiempo. En este caso, la señal del temporizador se aplaza hasta que este procesador virtual esté disponible. Si no está disponible hasta poco antes de que expire el próximo temporizador, se omite por completo.
Ordenación de las expiraciones del temporizador
Los temporizadores sintéticos y virtualizados generan interrupciones en o cerca de su hora de expiración designada. Debido al hardware y otras interacciones de programación, las interrupciones podrían retrasarse. No se puede asumir ninguna ordenación entre cualquier conjunto de temporizadores.
Temporizadores sintéticos directos
Los temporizadores sintéticos "directos" declaran una interrupción tras la expiración del temporizador en lugar de enviar un mensaje a un origen de interrupción sintética synIc. Un temporizador sintético se establece en modo "directo" estableciendo el campo "DirectMode" de las MSR de configuración del temporizador sintético. El campo "ApicVector" controla el vector de interrupción que se afirma tras la expiración del temporizador.
Registros de temporizador sintéticos
Los temporizadores sintéticos se configuran mediante registros sintéticos asociados a cada procesador virtual. Cada uno de los cuatro temporizadores sintéticos tiene un par de registros asociados (configuración y recuento).
En plataformas x64
En las plataformas x64, se accede a los temporizadores sintéticos a través de MSR mediante las instrucciones de RDMSR y WRMSR.
| Dirección MSR | Nombre del registro | Description |
|---|---|---|
| 0x400000B0 | HV_X64_MSR_STIMER0_CONFIG | Registro de configuración para el temporizador sintético 0. |
| 0x400000B1 | HV_X64_MSR_STIMER0_COUNT | Tiempo de expiración o período para el temporizador sintético 0. |
| 0x400000B2 | HV_X64_MSR_STIMER1_CONFIG | Registro de configuración para el temporizador sintético 1. |
| 0x400000B3 | HV_X64_MSR_STIMER1_COUNT | Tiempo de expiración o período para el temporizador sintético 1. |
| 0x400000B4 | HV_X64_MSR_STIMER2_CONFIG | Registro de configuración para el temporizador sintético 2. |
| 0x400000B5 | HV_X64_MSR_STIMER2_COUNT | Tiempo de expiración o período para el temporizador sintético 2. |
| 0x400000B6 | HV_X64_MSR_STIMER3_CONFIG | Registro de configuración para el temporizador sintético 3. |
| 0x400000B7 | HV_X64_MSR_STIMER3_COUNT | Tiempo de expiración o período para el temporizador sintético 3. |
En plataformas ARM64
En las plataformas ARM64, se accede a los temporizadores sintéticos a través de registros sintéticos mediante los hiperllamadas HvCallGetVpRegisters y HvCallSetVpRegisters.
| Nombre del registro | Description |
|---|---|
| HvRegisterStimer0Config | Registro de configuración para el temporizador sintético 0. |
| HvRegisterStimer0Count | Tiempo de expiración o período para el temporizador sintético 0. |
| HvRegisterStimer1Config | Registro de configuración para el temporizador sintético 1. |
| HvRegisterStimer1Count | Tiempo de expiración o período para el temporizador sintético 1. |
| HvRegisterStimer2Config | Registro de configuración para el temporizador sintético 2. |
| HvRegisterStimer2Count | Tiempo de expiración o período para el temporizador sintético 2. |
| HvRegisterStimer3Config | Registro de configuración para el temporizador sintético 3. |
| HvRegisterStimer3Count | Tiempo de expiración o período para el temporizador sintético 3. |
Nota: En ARM64, los temporizadores sintéticos son opcionales porque el temporizador genérico de ARM (GIT) se puede usar directamente sin incurrir en sobrecarga de virtualización. Los sistemas operativos invitados deben preferir el uso del temporizador genérico arquitectónico para mejorar el rendimiento.
Registrar diseño
Registro de configuración del temporizador sintético
| bits | Description | Attributes |
|---|---|---|
| 63:20 | RsvdZ (el valor debe establecerse en cero) | Lectura y escritura |
| 19:16 | SINTx: origen de interrupción sintética | Lectura y escritura |
| 15:13 | RsvdZ (el valor debe establecerse en cero) | Lectura y escritura |
| 12 | Modo directo: aserción e interrupción tras la expiración del temporizador. | Lectura y escritura |
| 11:4 | ApicVector: controla el vector de interrupción aserción en modo directo | Lectura y escritura |
| 3 | AutoEnable: se establece si la escritura del contador correspondiente provoca implícitamente que se habilite el temporizador. | Lectura y escritura |
| 2 | Diferido: se establece si el temporizador es diferido. | Lectura y escritura |
| 1 | Periódico: se establece si el temporizador es periódico. | Lectura y escritura |
| 0 | Habilitado: se establece si el temporizador está habilitado. | Lectura y escritura |
Cuando se crea y restablece un procesador virtual, el valor de todos los registros de configuración del temporizador sintético (HV_X64_MSR_STIMER0_CONFIG a través de HV_X64_MSR_STIMER3_CONFIG) se establece en 0x0000000000000000. Por lo tanto, todos los temporizadores sintéticos están deshabilitados de forma predeterminada.
Si se establece AutoEnable, escribir un valor distinto de cero en el registro de recuento correspondiente hará que Enable se establezca y active el contador. De lo contrario, Habilitar debe establecerse después de escribir el registro de recuento correspondiente para activar el contador. Para obtener información sobre el registro count, consulte la sección siguiente.
Cuando expira un temporizador de un solo disparo, se marca automáticamente como deshabilitado. Los temporizadores periódicos permanecen habilitados hasta que se deshabilitan explícitamente.
Si se habilita un solo disparo y el recuento especificado está en el pasado, expirará inmediatamente.
No se permite establecer el campo SINTx en cero para un temporizador habilitado (que no está en modo directo). Si se intenta, el temporizador se marcará deshabilitado (es decir, bit 0 borrado) inmediatamente.
Escribir el registro de configuración de un temporizador que ya está habilitado puede dar lugar a un comportamiento indefinido. Por ejemplo, simplemente cambiar un temporizador de una toma a periódica puede no producir lo que se pretende. Los temporizadores siempre deben deshabilitarse antes de cambiar cualquier otra propiedad.
Registro de recuento de temporizadores sintéticos
| bits | Description | Attributes |
|---|---|---|
| 63:0 | Recuento: tiempo de expiración para temporizadores de un solo disparo, duración de temporizadores periódicos | Lectura y escritura |
El valor programado en el registro Count es un valor de tiempo medido en 100 unidades nanosegundas. Al escribir el valor cero en el registro Count, se detendrá el contador, lo que deshabilitará el temporizador, independientemente de la configuración de AutoEnable en el registro de configuración.
Tenga en cuenta que el registro Count puede encapsularse. El ajuste no tendrá ningún efecto en el comportamiento del temporizador, independientemente de cualquier propiedad del temporizador.
En el caso de los temporizadores de un solo disparo, representa la hora de expiración absoluta del temporizador. El temporizador expira cuando el contador de referencia de la partición es igual o mayor que el valor de recuento especificado.
Para temporizadores periódicos, el recuento representa el período del temporizador. El primer período comienza cuando se habilita el temporizador sintético.
Mensaje de expiración del temporizador sintético
Los mensajes de expiración del temporizador se envían cuando se desencadena un evento de temporizador. Consulte el HV_TIMER_MESSAGE_PAYLOAD para obtener la definición de la carga del mensaje.
Registros de temporizadores de Time-Unhalted sintéticos
Los registros de temporizador de Time-Unhalted sintéticos están disponibles en plataformas x64 si una partición tiene el privilegio AccessSyntheticTimerRegs. La disponibilidad se indica mediante EDX bit 23 en la hoja CPUID de identificación de características de Hipervisor 0x40000003. Esta característica no está disponible en plataformas ARM64.
El software invitado puede programar el temporizador sintético sin inhalar para generar una interrupción periódica después de ejecutarse durante una cantidad de tiempo especificada en 100ns unidades. Cuando se activa la interrupción, el campo SyntheticTimeUnhaltedTimerExpired en la página vp Assist se establecerá en TRUE. El software invitado puede restablecer este campo a FALSE. A diferencia de los contadores de rendimiento arquitectónicos, el hipervisor nunca restablece el temporizador sintético y se ejecuta continuamente entre interrupciones. Si el campo Vector se establece en 2 (el vector NMI x64), el temporizador entrega una interrupción no enmascarable; de lo contrario, entrega una interrupción fija mediante el vector especificado.
A diferencia de los temporizadores sintéticos normales que acumulan tiempo cuando el invitado se ha detenido (es decir, se ha quedado inactivo), el temporizador de Time-Unhalted sintético acumula el tiempo solo mientras el invitado no se detiene.
En plataformas x64
En las plataformas x64, se accede al temporizador sintético sin inhalar a través de MSR mediante las instrucciones RDMSR y WRMSR.
| Dirección MSR | Nombre del registro | Description |
|---|---|---|
| 0x40000114 | HV_X64_MSR_STIME_UNHALTED_TIMER_CONFIG | Configuración del temporizador de Time-Unhalted sintética |
| 0x40000115 | HV_X64_MSR_STIME_UNHALTED_TIMER_COUNT | Recuento de temporizadores de Time-Unhalted sintéticos |
Registrar diseño
Registro de configuración de temporizador de Time-Unhalted sintético
| bits | Description | Attributes |
|---|---|---|
| 63:9 | RsvdZ (el valor debe establecerse en cero) | Lectura y escritura |
| 8 | Enabled | Lectura y escritura |
| 7:0 | Vector | Lectura y escritura |
El campo Vector debe ser 2 (para entregar un NMI) o un valor ≥ 16 (para entregar una interrupción fija). Otros valores no son válidos.
Registro de recuento de temporizadores de Time-Unhalted sintético
| bits | Description | Attributes |
|---|---|---|
| 63:0 | Frecuencia periódica de interrupciones en 100 ns unidades | Lectura y escritura |