다음을 통해 공유


가상 프로세서

각 파티션에는 0개 이상의 가상 프로세서가 있을 수 있습니다.

가상 프로세서 인덱스

가상 프로세서는 파티션 ID 및 해당 프로세서 인덱스로 구성된 튜플로 식별됩니다. 프로세서 인덱스는 생성될 때 가상 프로세서에 할당되며 가상 프로세서의 수명 동안 변경되지 않습니다.

특정 상황에서는 특수 값 HV_ANY_VP 사용하여 "모든 가상 프로세서"를 지정할 수 있습니다. HV_VP_INDEX_SELF 값을 사용하여 자신의 VP 인덱스만 지정할 수 있습니다.

typedef UINT32 HV_VP_INDEX;

#define HV_ANY_VP ((HV_VP_INDEX)-1)

#define HV_VP_INDEX_SELF ((HV_VP_INDEX)-2)

x64 플랫폼

x64 플랫폼에서 RDMSR을 사용하는 하이퍼바이저 정의 MSR(모델별 레지스터) HV_X64_MSR_VP_INDEX 통해 게스트가 가상 프로세서의 ID를 검색할 수 있습니다.

#define HV_X64_MSR_VP_INDEX 0x40000002

ARM64 플랫폼

ARM64 플랫폼에서 HvCallGetVpRegisters 하이퍼콜을 사용하여 HvRegisterVpIndex 가상 레지스터를 통해 가상 프로세서의 ID를 검색할 수 있습니다. 읽기 전용 레지스터입니다.

가상 프로세서 유휴 절전 상태(x64만 해당)

x64 플랫폼에서 가상 프로세서는 가상 유휴 프로세서 전원 상태 또는 프로세서 절전 상태에 배치될 수 있습니다. 이 향상된 가상 유휴 상태를 사용하면 가상 프로세서에서 인터럽트를 마스킹하는 경우에도 인터럽트 도착 시 저전력 유휴 상태로 배치된 가상 프로세서를 해제할 수 있습니다. 즉, 가상 유휴 상태를 사용하면 게스트 파티션의 운영 체제에서 게스트 파티션에서 실행할 때 사용할 수 없는 OS의 프로세서 절전 기술을 활용할 수 있습니다.

AccessGuestIdleMsr 권한이 있는 파티션은 하이퍼바이저 정의 MSR HV_X64_MSR_GUEST_IDLE에 대한 읽기를 통해 가상 프로세서 유휴 상태의 진입을 트리거할 수 있습니다. 가상 프로세서에서 인터럽트를 사용하도록 설정했는지 여부에 관계없이 인터럽트 도착 시 가상 프로세서가 해제됩니다.

이 기능은 ARM64 플랫폼에서 사용할 수 없습니다.

가상 프로세서 지원 페이지

하이퍼바이저는 게스트 GPA 공간에 오버레이되는 가상 프로세서당 페이지를 제공합니다. 이 페이지는 게스트 VP와 하이퍼바이저 간의 양방향 통신에 사용할 수 있습니다. 게스트 OS는 이 가상 VP 지원 페이지에 대한 읽기/쓰기 권한이 있습니다.

VP 지원 페이지의 구조는 HV_VP_ASSIST_PAGE 정의됩니다. 이 구조 내의 일부 필드는 아키텍처에 따라 다릅니다.

x64 플랫폼

x64 플랫폼에서 게스트는 WRMSR을 사용하여 가상 VP 지원 MSR(0x40000073)에 작성하여 오버레이 페이지(GPA 공간)의 위치를 지정합니다. 가상 VP 지원 페이지 MSR의 형식은 다음과 같습니다.

비트 분야 Description
0 Enable VP 지원 페이지 사용
11:1 RsvdP 예약됨
63:12 페이지 PFN 가상 VP 지원 페이지 PFN

ARM64 플랫폼

ARM64 플랫폼에서 게스트는 HvCallSetVpRegisters 하이퍼콜을 사용하여 HvRegisterVpAssistPage 가상 레지스터에 작성하여 오버레이 페이지(GPA 공간)의 위치를 지정합니다. 레지스터 형식은 x64 MSR 형식과 동일합니다.

가상 프로세서 런타임 레지스터

하이퍼바이저의 스케줄러는 내부적으로 각 가상 프로세서가 코드 실행에 소비하는 시간을 추적합니다. 추적되는 시간은 가상 프로세서에서 실행 중인 게스트 코드를 사용하는 시간과 연결된 논리 프로세서가 해당 게스트를 대신하여 하이퍼바이저 코드를 실행하는 데 소요되는 시간의 조합입니다. 이 누적 시간은 읽기 전용 레지스터를 통해 액세스할 수 있습니다. 시간 수량은 100ns 단위로 측정됩니다.

x64 플랫폼

x64 플랫폼에서는 RDMSR을 사용하여 64비트 읽기 전용 HV_X64_MSR_VP_RUNTIME 하이퍼바이저 MSR을 통해 VP 런타임에 액세스합니다.

ARM64 플랫폼

ARM64 플랫폼에서는 HvCallGetVpRegisters 하이퍼콜을 사용하여 HvRegisterVpRuntime 가상 레지스터를 통해 VP 런타임에 액세스합니다. 읽기 전용 레지스터입니다.

NPIEP(권한 없는 명령 실행 방지)(x64만 해당)

x64 플랫폼에서 NPIEP(권한 없는 명령 실행 방지)는 사용자 모드 코드에서 특정 명령의 사용을 제한하는 기능입니다. 특히 이 기능을 사용하도록 설정하면 SIDT, SGDT, SLDT 및 STR 명령의 실행을 차단할 수 있습니다. 이러한 명령을 실행하면 #GP 오류가 발생합니다.

이 기능은 HV_X64_MSR_NPIEP_CONFIG_CONTENTS 사용하여 VP별로 구성해야 합니다.

이 기능은 ARM64 플랫폼에서 사용할 수 없습니다.

게스트 스핀 잠금

일반적인 다중 프로세서 지원 운영 체제는 잠금을 사용하여 특정 작업의 원자성을 적용합니다. 하이퍼바이저에서 제어하는 가상 머신 내에서 이러한 운영 체제를 실행하는 경우 잠금으로 보호되는 이러한 중요한 섹션은 중요한 섹션 코드에 의해 생성된 절편으로 확장될 수 있습니다. 하이퍼바이저 스케줄러에서 중요한 섹션 코드를 선점할 수도 있습니다. 하이퍼바이저가 이러한 선점 방지를 시도하지만 발생할 수 있습니다. 따라서 다른 잠금 경쟁자는 잠금 홀더가 다시 예약될 때까지 회전할 수 있으므로 스핀 잠금 획득 시간을 크게 연장할 수 있습니다.

하이퍼바이저는 하이퍼바이저에 과도한 스핀 상황을 나타내기 전에 스핀 잠금 획득을 시도해야 하는 횟수를 게스트 OS에 나타냅니다. 이 개수는 CPUID 리프 0x40000004 반환됩니다. 값이 0이면 게스트 OS가 긴 스핀 잠금 획득에 대해 하이퍼바이저에 알리지 않아야 합니다.

HvCallNotifyLongSpinWait 하이퍼콜은 다중 프로세서 가상 머신에 대한 잠금의 통계적 공정성 속성을 개선하기 위해 인식된 게스트를 위한 인터페이스를 제공합니다. 게스트는 CPUID 리프 0x40000004 반환된 권장 횟수의 모든 배수에 대해 이 알림을 해야 합니다. 이 하이퍼콜을 통해 게스트는 하이퍼바이저에 긴 스핀 잠금 획득을 알립니다. 이렇게 하면 하이퍼바이저가 더 나은 일정 결정을 내릴 수 있습니다.