하이퍼바이저는 가상 프로세서에 대한 인터럽트 배달을 가상화합니다.
가상 인터럽트 컨트롤러 Architecture-Specific
x64 플랫폼
x64 플랫폼에서 인터럽트 가상화는 가상화된 로컬 APIC의 확장인 SynIC(가상 인터럽트 컨트롤러)를 사용하여 수행됩니다. 즉, 각 가상 프로세서에는 SynIC 확장이 있는 로컬 APIC 인스턴스가 있습니다. 이러한 확장은 Inter-Partition Communication 챕터에 설명된 간단한 파티션 간 통신 메커니즘을 제공합니다.
ARM64 플랫폼
ARM64 플랫폼에서 하이퍼바이저는 ARM GIC 아키텍처 사양을 준수하는 가상 ARM GIC(제네릭 인터럽트 컨트롤러)를 노출합니다. 게스트 파티션은 가상 GIC 인터페이스, 레지스터 및 인터럽트 처리 메커니즘에 대한 자세한 내용은 ARM GIC 아키텍처 사양을 참조해야 합니다.
인터럽트 범주
파티션에 전달되는 인터럽트는 외부 및 내부라는 두 가지 범주로 구분됩니다. 외부 인터럽트는 다른 파티션 또는 디바이스에서 시작되며 내부 인터럽트는 파티션 자체 내에서 발생합니다.
외부 인터럽트는 다음과 같은 상황에서 생성됩니다.
- 물리적 하드웨어 디바이스는 하드웨어 인터럽트를 생성합니다.
- 부모 파티션은 가상 인터럽트를 어설션합니다(일반적으로 하드웨어 디바이스를 에뮬레이트하는 프로세스에서).
- 하이퍼바이저는 파티션에 메시지를 전달합니다(예: 절편으로 인해).
- 다른 파티션이 메시지를 게시합니다.
- 다른 파티션은 이벤트를 신호로 표시합니다.
내부 인터럽트는 다음과 같은 상황에서 생성됩니다.
- 가상 프로세서는 API 인터럽트 명령 레지스터(ICR)에 액세스합니다.
- 가상 타이머가 만료됩니다.
로컬 APIC(x64만 해당)
x64 플랫폼에서 SynIC는 로컬 APIC의 상위 집합입니다. 이 APIC에 대한 인터페이스는 32비트 메모리 매핑 레지스터 집합에 의해 제공됩니다. 이 로컬 APIC(메모리 매핑 레지스터의 동작 포함)는 일반적으로 Intel 및 AMD 설명서에 설명된 대로 P4/Xeon 시스템의 로컬 APIC와 호환됩니다.
하이퍼바이저의 로컬 APIC 가상화는 다음과 같은 사소한 방법으로 물리적 APIC 작업에서 벗어날 수 있습니다.
- 물리적 시스템에서 IA32_APIC_BASE MSR은 시스템의 각 프로세서마다 다를 수 있습니다. 하이퍼바이저에서 이 MSR은 파티션 내의 모든 가상 프로세서에 대해 동일한 값을 포함해야 할 수 있습니다. 따라서 이 MSR은 파티션 전체 값으로 처리될 수 있습니다. 가상 프로세서가 이 레지스터를 수정하면 파티션 내의 모든 가상 프로세서에 값이 효과적으로 전파됩니다.
- IA32_APIC_BASE MSR은 APIC를 사용하거나 사용하지 않도록 설정하기 위한 "전역 사용" 비트를 정의합니다. 가상화된 APIC는 항상 사용하도록 설정될 수 있습니다. 이 경우 이 비트는 항상 1로 설정됩니다.
- 하이퍼바이저의 로컬 API가 가상 SPI(시스템 관리 인터럽트)를 생성하지 못할 수 있습니다.
- 파티션 내의 여러 가상 프로세서에 동일한 APIC ID가 할당된 경우 대상 인터럽트 배달 동작은 제한적으로 정의되지 않습니다. 즉, 하이퍼바이저는 하나의 가상 프로세서, 지정된 APIC ID가 있는 모든 가상 프로세서 또는 가상 프로세서 없이 인터럽트만 자유롭게 전달할 수 있습니다. 이 상황은 게스트 프로그래밍 오류로 간주됩니다.
- 매핑된 일부 메모리 APIC 레지스터는 가상 MSR을 통해 액세스할 수 있습니다.
- 하이퍼바이저는 게스트가 해당 APIC ID를 수정하도록 허용하지 않을 수 있습니다.
이 섹션의 나머지 부분에서는 로컬 APIC의 확장인 SynIC 기능의 측면만 설명합니다.
로컬 APIC MSR 액세스(x64만 해당)
x64 플랫폼에서 하이퍼바이저는 높은 사용량 메모리 매핑된 APIC 레지스터에 대한 가속화된 MSR 액세스를 제공합니다. TPR, EOI 및 ICR 레지스터입니다. ICR Low 및 ICR High 레지스터는 하나의 MSR로 결합됩니다. 성능상의 이유로 게스트 운영 체제는 API MSR 사용에 대한 하이퍼바이저 권장 사항을 따라야 합니다.
이러한 MSR은 가상 GIC 인터페이스를 통해 인터럽트 컨트롤러 작업이 수행되는 ARM64 플랫폼에서 사용할 수 없습니다.
| MSR 주소 | 등록 이름 | Description |
|---|---|---|
| 0x40000070 | HV_X64_MSR_EOI | APIC EOI에 액세스합니다. |
| 0x40000071 | HV_X64_MSR_ICR | APIC ICR-high 및 ICR-low에 액세스합니다. |
| 0x40000072 | HV_X64_MSR_TPR | APIC TPR에 액세스 |
HV_X64_MSR_EOI
| 비트 | Description | Attributes |
|---|---|---|
| 63:32 | RsvdZ(예약됨, 0이어야 합니다) | 작성하다 |
| 31:0 | EOI 값 | 작성하다 |
HV_X64_MSR_ICR
| 비트 | Description | Attributes |
|---|---|---|
| 63:32 | ICR 높은 값 | 읽기/쓰기 |
| 31:0 | ICR 낮은 값 | 읽기/쓰기 |
HV_X64_MSR_TPR
| 비트 | Description | Attributes |
|---|---|---|
| 63:8 | RsvdZ(예약됨, 0이어야 합니다) | 읽기/쓰기 |
| 7:0 | TPR 값 | 읽기/쓰기 |
이 MSR은 32비트 모드 게스트 파티션에서 TPR에 대한 액세스를 가속화하기 위한 것입니다. 64비트 모드 게스트 파티션은 CR8을 통해 TPR을 설정해야 합니다.
가상 클러스터 IPI
하이퍼바이저는 임의의 가상 프로세서 집합에 가상 고정 인터럽트를 보낼 수 있는 하이퍼콜을 지원합니다.
| 하이퍼콜 | Description |
|---|---|
| HvCallSendSyntheticClusterIpi | 가상 고정 인터럽트를 지정된 가상 프로세서 집합으로 보냅니다. |
| HvCallSendSyntheticClusterIpiEx | HvCallSendSyntheticClusterIpi와 마찬가지로 스파스 VP 집합을 입력으로 사용합니다. |
EOI 지원(x64만 해당)
x64 플랫폼에서 가상 프로세서 지원 페이지의 한 필드는 EOI 지원 필드입니다. EOI 지원 필드는 오버레이 페이지의 오프셋 0에 있으며 크기는 32비트입니다. EOI 지원 필드의 형식은 다음과 같습니다.
이 인식 기능은 가상 GIC 인터페이스를 통해 EOI 작업이 수행되는 ARM64 플랫폼에서는 사용할 수 없습니다.
| 비트 | Description | Attributes |
|---|---|---|
| 31:1 | RsvdZ | 읽기/쓰기 |
| 0 | EOI 필요 없음 | 읽기/쓰기 |
게스트 OS는 가상 VP 지원 페이지의 EOI 지원 필드에 원자성으로 0을 쓰고 "EOI 필요 없음" 필드가 이전에 0인지 확인하여 EOI를 수행합니다. 이 경우 OS는 HV_X64_MSR_EOI MSR에 쓰기를 통해 하이퍼바이저에 대한 인터셉트를 트리거해야 합니다. 다음 코드는 EOI를 수행하는 것이 좋습니다.
lea rcx, [VirtualApicAssistVa]
btr [rcx], 0
jc NoEoiRequired
mov ecx, HV_X64_MSR_EOI
wrmsr
NoEoiRequired:
하이퍼바이저는 다음 조건이 충족되는 경우 가상 인터럽트를 삽입할 때 "EOI 필요 없음" 비트를 설정합니다.
- 가상 인터럽트는 에지 트리거되며
- 보류 중인 낮은 우선 순위 인터럽트는 없습니다.
나중에 우선 순위가 낮은 인터럽트가 요청되면 하이퍼바이저는 후속 EOI가 절편을 발생시키는 "EOI 필요 없음"을 지웁니다.
중첩 인터럽트의 경우 우선 순위가 가장 높은 인터럽트에 대해서만 EOI 인터셉트가 방지됩니다. OS에서 수행하는 EOI 수에 대해 개수가 유지되지 않으므로 이 작업이 필요합니다. 따라서 첫 번째 EOI만 방지할 수 있으며 첫 번째 EOI는 "No EOI Required" 비트를 지우기 때문에 다음 EOI는 절편을 생성합니다. 그러나 중첩된 인터럽트는 드물기 때문에 일반적인 경우에는 문제가 되지 않습니다.
디바이스 및/또는 I/O APIC(물리적 또는 합성)는 에지 트리거 인터럽트에 대한 EOI 알림을 받을 필요가 없습니다. 하이퍼바이저는 가상 APIC 상태를 업데이트하기 위해 이러한 EOI를 가로채는 것입니다. 경우에 따라 가상 APIC 상태를 지연 업데이트할 수 있습니다. 이러한 경우 "NoEoiRequired" 비트는 게스트에게 EOI 인터셉트가 필요하지 않음을 나타내는 하이퍼바이저에 의해 설정됩니다. 나중에 하이퍼바이저는 "NoEoiRequired" 비트의 현재 값에 따라 로컬 APIC의 상태를 파생시킬 수 있습니다.
이 인식 기능을 사용하도록 설정하고 사용하지 않도록 설정하면 해당 순간의 인터럽트 활동 및 APIC 상태와 관계없이 언제든지 수행할 수 있습니다. 인식이 활성화되어 있지만 기존의 EOI는 "EOI 필요 없음" 값에 관계없이 계속 수행할 수 있지만 인식의 성능 이점을 실현하지 못합니다.