ハイパーバイザーは、仮想プロセッサへの割り込み配信を仮想化します。
仮想割り込みコントローラーの Architecture-Specific
x64 プラットフォームの場合
x64 プラットフォームでは、割り込み仮想化は、仮想化されたローカル APIC の拡張機能である合成割り込みコントローラー (SynIC) を使用して行われます。つまり、各仮想プロセッサには、SynIC 拡張機能を持つローカル APIC インスタンスがあります。 これらの拡張機能は、 Inter-Partition 通信 の章で説明されている単純なパーティション間通信メカニズムを提供します。
ARM64 プラットフォームの場合
ARM64 プラットフォームでは、ハイパーバイザーは ARM GIC アーキテクチャ仕様に準拠する仮想 ARM 汎用割り込みコントローラー (GIC) を公開します。 ゲスト パーティションは、仮想 GIC インターフェイス、レジスタ、および割り込み処理メカニズムの詳細については、ARM GIC アーキテクチャ仕様を参照する必要があります。
割り込みカテゴリ
パーティションに配信される割り込みは、外部と内部の 2 つのカテゴリに分類されます。 外部割り込みは他のパーティションまたはデバイスから発生し、内部割り込みはパーティション自体から発生します。
外部割り込みは、次の状況で生成されます。
- 物理ハードウェア デバイスによってハードウェア割り込みが生成されます。
- 親パーティションは、仮想割り込みをアサートします (通常、ハードウェア デバイスをエミュレートするプロセスで)。
- ハイパーバイザーは、メッセージ (インターセプトなど) をパーティションに配信します。
- 別のパーティションがメッセージを投稿します。
- 別のパーティションがイベントを通知します。
内部割り込みは、次の状況で生成されます。
- 仮想プロセッサは、APIC 割り込みコマンド レジスタ (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 に設定されます。
- ハイパーバイザーのローカル APIC が仮想 SMI (システム管理割り込み) を生成できない場合があります。
- パーティション内の複数の仮想プロセッサに同一の APIC ID が割り当てられている場合、ターゲット割り込み配信の動作は未定義になります。 つまり、ハイパーバイザーは、1 つの仮想プロセッサ、指定された APIC ID を持つすべての仮想プロセッサ、または仮想プロセッサに割り込みを無料で配信できます。 この状況は、ゲスト プログラミング エラーと見なされます。
- メモリ マップされた APIC レジスタの一部は、仮想 MSR を使用してアクセスできます。
- ハイパーバイザーでは、ゲストが APIC ID を変更できない場合があります。
このセクションの残りの部分では、ローカル APIC の拡張機能である SynIC 機能の側面のみを説明します。
ローカル APIC MSR アクセス (x64 のみ)
x64 プラットフォームでは、ハイパーバイザーは、使用率の高いメモリ マップされた APIC レジスタへの高速 MSR アクセスを提供します。 これらは TPR、EOI、および ICR レジスタです。 ICR 低レジスタと ICR ハイ レジスタは、1 つの MSR に結合されます。 パフォーマンス上の理由から、ゲスト オペレーティング システムは、APIC 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 (予約済み、ゼロにする必要があります) | Write |
| 31:0 | EOI 値 | Write |
HV_X64_MSR_ICR
| ビット | Description | Attributes |
|---|---|---|
| 63:32 | ICR の高い値 | 読み取り/書き込み |
| 31:0 | ICR の低い値 | 読み取り/書き込み |
HV_X64_MSR_TPR
| ビット | Description | Attributes |
|---|---|---|
| 63:8 | RsvdZ (予約済み、ゼロにする必要があります) | 読み取り/書き込み |
| 7:0 | TPR 値 | 読み取り/書き込み |
この MSR は、32 ビット モードのゲスト パーティションで TPR へのアクセスを高速化することを目的としています。 64 ビット モードのゲスト パーティションでは、CR8 を使用して TPR を設定する必要があります。
合成クラスター IPI
ハイパーバイザーでは、任意の仮想プロセッサ セットに仮想固定割り込みを送信できるハイパーコールがサポートされています。
| Hypercall | Description |
|---|---|
| HvCallSendSyntheticClusterIpi | 指定された仮想プロセッサ セットに仮想固定割り込みを送信します。 |
| HvCallSendSyntheticClusterIpiEx | HvCallSendSyntheticClusterIpi と同様に、入力としてスパース VP セットを受け取ります。 |
EOI アシスト (x64 のみ)
x64 プラットフォームでは、[ 仮想プロセッサ アシスト] ページ の 1 つのフィールドが [EOI アシスト] フィールドです。 EOI Assist フィールドはオーバーレイ ページのオフセット 0 にあり、サイズは 32 ビットです。 EOI アシスト フィールドの形式は次のとおりです。
この対応は、仮想 GIC インターフェイスを介して EOI 操作が実行される ARM64 プラットフォームでは使用できません。
| ビット | Description | Attributes |
|---|---|---|
| 31:1 | RsvdZ | 読み取り/書き込み |
| 0 | EOI は必要ありません | 読み取り/書き込み |
ゲスト OS は、仮想 VP アシスト ページの EOI Assist フィールドにアトミックにゼロを書き込み、"No EOI required" フィールドが以前に 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:
ハイパーバイザーは、次の条件が満たされた場合に仮想割り込みを挿入するときに、"No EOI required" ビットを設定します。
- 仮想割り込みはエッジ によってトリガーされ、
- 保留中の優先順位の低い割り込みはありません
後で優先順位の低い割り込みが要求された場合、ハイパーバイザーは、後続の EOI がインターセプトを引き起こすような "No EOI required" をクリアします。
入れ子になった割り込みの場合、EOI インターセプトは優先度が最も高い割り込みの場合にのみ回避されます。 これは、OS によって実行される EOI の数に対してカウントが維持されないので必要です。 したがって、最初の EOI のみを回避でき、最初の EOI が "No EOI Required" ビットをクリアするため、次の EOI はインターセプトを生成します。 ただし、入れ子になった割り込みはまれであるため、これは一般的なケースでは問題ありません。
デバイスや I/O APIC (物理または合成) には、エッジによってトリガーされる割り込みに対して EOI の通知を受け取る必要はありません。ハイパーバイザーは、仮想 APIC 状態を更新するためにのみ、このような EOI をインターセプトします。 場合によっては、仮想 APIC 状態を遅延更新できます。このような場合、"NoEoiRequired" ビットは、EOI インターセプトが不要であることをゲストに示すハイパーバイザーによって設定されます。 後で、ハイパーバイザーは、"NoEoiRequired" ビットの現在の値に応じて、ローカル APIC の状態を派生させることができます。
この対応化の有効化と無効化は、割り込みアクティビティとその時点の APIC 状態とは関係なく、いつでも実行できます。 対応が有効になっている間、従来の EOI は "No EOI required" 値に関係なく引き続き実行できますが、対応のパフォーマンス上の利点は実現されません。