次の方法で共有


Inter-Partition 通信

ハイパーバイザーには、1 つのパーティションが別のパーティションと通信するための 2 つの簡単なメカニズム (メッセージとイベント) が用意されています。 どちらの場合も、SynIC (合成割り込みコントローラー) を使用して通知が通知されます。

SynIC メッセージ

ハイパーバイザーは、1 つのパーティションがパラメーター化されたメッセージを別のパーティションに送信できるようにする単純なパーティション間通信機能を提供します。 (メッセージは非同期的に送信されるため、投稿されると言われます)。宛先パーティションには、割り込みを介してこのメッセージの到着が通知される場合があります。 メッセージは 、HvCallPostMessage ハイパーコールを使用して明示的に送信することも、ハイパーバイザーによって暗黙的に送信することもできます。

Messages

メッセージが送信されると、ハイパーバイザーは空きメッセージ バッファーを選択します。 使用可能なメッセージ バッファーのセットは、メッセージの送信をトリガーしたイベントによって異なります。

ハイパーバイザーはメッセージ バッファーを "使用中" とマークし、メッセージ ヘッダーにメッセージの種類、ペイロード サイズ、送信者に関する情報を入力します。 最後に、メッセージ ペイロードが入力されます。 ペイロードの内容は、メッセージをトリガーしたイベントによって異なります。

ハイパーバイザーは、メッセージ バッファーを受信メッセージ キューに追加します。 受信メッセージ キューは、メッセージの送信をトリガーしたイベントによって異なります。 すべてのメッセージの種類について、SINTx は暗黙的 (インターセプト メッセージの場合)、明示的 (タイマー メッセージの場合)、またはポート ID (ゲスト メッセージの場合) で指定されます。 ターゲット仮想プロセッサは、メッセージがエンキューされるときに、ハイパーバイザーによって明示的に指定されるか、選択されます。 SynIC または SIM ページが無効になっている仮想プロセッサは、潜在的なターゲットとは見なされません。 使用可能なターゲットがない場合、ハイパーバイザーは操作を終了し、呼び出し元にエラーを返します。

ハイパーバイザーは、ターゲット仮想プロセッサの SIM ページ 内で指定された SINTx メッセージ スロットが空かどうかを判断します。 メッセージ スロット内のメッセージの種類が HvMessageTypeNone (つまり、ゼロ) と等しい場合、メッセージ スロットは空であると見なされます。 この場合、ハイパーバイザーはメッセージ バッファーをデキューし、その内容を SIM ページ内のメッセージ スロットにコピーします。 ハイパーバイザーは、メッセージに関連付けられているペイロード バイト数のみをコピーできます。 ハイパーバイザーは、指定された SINTx に対してエッジによってトリガーされる割り込みの生成も試みます。 APIC がソフトウェアを無効にしているか、SINTx がマスクされている場合、割り込みは失われます。 この割り込みが到着すると、新しいメッセージが到着したことがゲストに通知されます。 SIM ページが無効になっている場合、または SIM ページ内のメッセージ スロットが空でない場合、メッセージはキューに残り、割り込みは生成されません。

固定優先度割り込みと同様に、PPR (プロセス優先度レジスタ) が SINTx レジスタで指定されたベクトルより小さく、割り込みが仮想プロセッサによってマスクされない (rFLAGS[IF] が 1 に設定されるまで、割り込みは仮想プロセッサによって確認されません)。

同じ SINTx を持つ複数のメッセージ バッファーを仮想プロセッサにキューに格納できます。 この場合、ハイパーバイザーは最初のメッセージ (つまり、SIM ページに書き込む) を配信し、3 つのイベントのいずれかが発生するまで他のメッセージはキューに残します。

  • 別のメッセージ バッファーがキューに入れられます。
  • ゲストは、APIC の EOI レジスタに書き込むことで、"割り込みの終了" を示します。
  • ゲストは、SynIC の EOM レジスタに書き込むことで、"メッセージの終了" を示します。

3 つのケースすべてにおいて、ハイパーバイザーは 1 つ以上のメッセージ バッファー キューをスキャンし、追加のメッセージの配信を試みます。 ハイパーバイザーは、エッジによってトリガーされる割り込みの生成も試み、新しいメッセージが到着したことを示します。

SIM ページ

SIM ページは、256 バイトメッセージの 16 要素配列で構成されます ( データ構造HV_MESSAGE 参照)。 各配列要素 (メッセージ スロットとも呼ばれます) は、1 つの合成割り込みソース (SINTx) に対応します。 スロット内のメッセージの種類が HvMessageTypeNone と等しい場合、メッセージ スロットは "空" と言われます。

SIM ページのアドレスは、 SIMP レジスタで指定されます。 SIM ページのアドレスは、仮想プロセッサごとに一意である必要があります。 SIEF または SIM ページの他のインスタンスまたはその他のオーバーレイ ページ (ハイパーコール ページなど) と重なるようにこれらのページをプログラミングすると、未定義の動作が発生します。

仮想プロセッサによる SIM ページへの読み取りと書き込みのアクセスは、RAM への読み取りと書き込みのアクセスと同様に動作します。 ただし、ハイパーバイザーの SynIC 実装は、特定のイベントに応答してページにも書き込みます。

仮想プロセッサの作成とリセット時に、SIM ページは 0 にクリアされます。

SynIC メッセージ配信メカニズムは、ターゲット パーティション内のメッセージの効率的な配信と受信に対応するように設計されています。 ターゲット パーティション内の ISR (割り込みサービス ルーチン) を処理するメッセージは、次の手順を実行することをお勧めします。

  • SIM メッセージ スロットに入れられていたメッセージを調べます。
  • メッセージの内容を別の場所にコピーし、メッセージ スロット内のメッセージの種類を HvMessageTypeNone に設定します。
  • APIC の EOI レジスタに書き込むことで、ベクターの割り込みの終了を示します。
  • メッセージによって暗黙的に指定されたすべてのアクションを実行します。

メッセージ ソース

メッセージの送信をトリガーできるイベントのクラスは次のとおりです。

  • インターセプト: 仮想プロセッサ内のすべてのインターセプトにより、メッセージが親パーティションまたは上位 VTL に送信されます。
  • タイマー: タイマー メカニズムによってメッセージが送信されます。 各仮想プロセッサに関連付けられるのは、タイマーごとに 1 つずつ、4 つの専用タイマー メッセージ バッファーです。 受信メッセージ キューは、タイマーがメッセージの送信をトリガーした仮想プロセッサの SINTx に属します。
  • ゲスト メッセージ: ハイパーバイザーは、ゲスト間のパーティション間通信メカニズムとしてメッセージパッシングをサポートします。 このセクションで定義されているインターフェイスを使用すると、1 人のゲストが別のゲストにメッセージを送信できます。 このクラスのメッセージに使用されるメッセージ バッファーは、ゲスト メッセージ バッファーの受信側のポートごとのプールから取得されます。

メッセージ バッファー

メッセージ バッファーは、ハイパーバイザーに内部的に使用され、受信者に配信されるまでメッセージを格納します。 ハイパーバイザーでは、複数のメッセージ バッファー セットが保持されます。

ゲスト メッセージ バッファー

ハイパーバイザーは、ポートごとにゲスト メッセージ バッファーのセットを保持します。 これらのバッファーは、ゲストによってパーティション間で明示的に送信されるメッセージに使用されます。 ポートが作成されると、ハイパーバイザーはポート所有者のメモリ プールから 16 個のメッセージ バッファーを割り当てます。 これらのメッセージ バッファーは、ポートが削除されるとメモリ プールに返されます。

メッセージ バッファー キュー

各パーティションとパーティション内の各仮想プロセッサに対して、ハイパーバイザーは、仮想プロセッサの SynIC 内の SINTx (合成割り込みソース) ごとにメッセージ バッファーの 1 つのキューを保持します。 仮想プロセッサの作成時またはリセット時に、仮想プロセッサのすべてのメッセージ キューが空になります。

ゲスト メッセージ バッファーの信頼性とシーケンス処理

ゲストによって正常に投稿されたメッセージは、ハイパーバイザーによる配信のためにキューに登録されています。 ターゲット パーティションによる実際の配信と受信は、正しい操作に依存します。 パーティションでは、SynIC を無効にするか SIMP を無効にすることで、特定の仮想プロセッサへのメッセージの配信を無効にすることができます。

接続を切断すると、未配信 (キューに入れられている) メッセージには影響しません。 ターゲット ポートを削除すると、ポートのメッセージ バッファーが使用可能であるか、未配信 (キューに入っている) メッセージが含まれているかにかかわらず、常にすべてのポートのメッセージ バッファーが解放されます。

メッセージは、正常に投稿された順序で到着します。 受信ポートが特定の仮想プロセッサに関連付けられている場合、メッセージはポストされたのと同じ順序で到着します。 受信ポートがHV_ANY_VPに関連付けられている場合、メッセージが特定の順序で到着することは保証されません。

SynIC イベント フラグ

SynIC では、メッセージに加えて、イベント フラグと呼ばれる 2 番目の種類のクロスパーティション通知メカニズムがサポートされています。 イベント フラグは 、HvCallSignalEvent ハイパーコールを使用して明示的に設定することも、ハイパーバイザーによって暗黙的に設定することもできます。

イベント フラグとメッセージ

イベント フラグはメッセージよりも軽量であるため、オーバーヘッドが低くなります。 さらに、イベント フラグはハイパーバイザー内でバッファーの割り当てやキューを必要としないため、リソースが不足しているため HvCallSignalEvent が失敗することはありません。

イベント フラグの配信

パーティションが HvCallSignalEvent を呼び出すときに、イベント フラグ番号を指定します。 ハイパーバイザーは、受信仮想プロセッサの SIEF ページ内で少しアトミックに設定することで応答します。 SynIC または SIEF ページが無効になっている仮想プロセッサは、潜在的なターゲットとは見なされません。 使用可能なターゲットがない場合、ハイパーバイザーは操作を終了し、呼び出し元にエラーを返します。

イベント フラグが以前にクリアされた場合、ハイパーバイザーは、エッジによってトリガーされる割り込みを生成することによってフラグが設定されたことを受信パーティションに通知しようとします。 ターゲット仮想プロセッサとターゲット SINTx は、ポートの作成の一部として指定されます。 SINTx がマスクされている場合、HvSignalEvent はHV_STATUS_INVALID_SYNIC_STATEを返します。

固定優先度外部割り込みと同様に、プロセス優先度レジスタ (PPR) が SINTx レジスタで指定されたベクトルより小さく、割り込みが仮想プロセッサによってマスクされない (rFLAGS[IF] が 1 に設定されるまで、割り込みは仮想プロセッサによって確認されません)。

SIEF ページ

SIEF ページは、256 バイトのイベント フラグの 16 要素配列で構成されます ( HV_SYNIC_EVENT_FLAGSを参照)。 各配列要素は、1 つの合成割り込みソース (SINTx) に対応します。

SIEF ページのアドレスは、 SIEF レジスタで指定します。 SIEF ページのアドレスは、仮想プロセッサごとに一意である必要があります。 SIEF または SIM ページの他のインスタンスまたはその他のオーバーレイ ページ (ハイパーコール ページなど) と重なるようにこれらのページをプログラミングすると、未定義の動作が発生します。

SIEF ページへの仮想プロセッサによる読み取りと書き込みのアクセスは、RAM への読み取りと書き込みのアクセスと同様に動作します。 ただし、ハイパーバイザーの SynIC 実装は、特定のイベントに応答してページにも書き込みます。

仮想プロセッサの作成とリセット時に、SIEF ページは 0 にクリアされます。

ターゲット パーティション内のイベント フラグ割り込みサービス ルーチン (ISR) は、次の手順を実行することをお勧めします。

  • イベント フラグを調べて、設定されているイベント フラグ (存在する場合) を判断します。
  • LOCK AND や LOCK CMPXCHG などのロックされた (アトミック) 操作を使用して、1 つ以上のイベント フラグをクリアします。
  • APIC の EOI レジスタに書き込むことで、ベクターの割り込みの終了を示します。
  • 設定されたイベント フラグによって暗黙的に指定されたすべてのアクションを実行します。

ポートと接続

ゲスト間で送信されるメッセージまたはイベントは、事前に割り当てられた接続を介して送信する必要があります。 さらに、接続は宛先ポートに関連付けられている必要があります。

ポートは受信側のメモリ プールから割り当てられ、ターゲットとなる仮想プロセッサと SINTx を指定します。 イベント ポートには、呼び出し元がそのポートの有効なイベント フラグの範囲を指定できるようにする "基本フラグ番号" と "フラグ数" があります。

接続は、送信側のメモリ プールから割り当てられます。 接続を作成するときは、有効なポートに関連付けられている必要があります。 このバインドにより、単純な一方向の通信チャネルが作成されます。 その後、ポートが削除された場合、その接続は残っている間は役に立たなくなります。

SynIC レジスタ

各仮想プロセッサには、これらのレジスタの独自のコピーがあるため、個別にプログラミングできます。

x64 プラットフォームでは、これらのレジスタは RDMSR および WRMSR 命令を使用してモデル固有のレジスタ (MSR) としてアクセスされます。

MSR アドレス レジスタ名 機能
0x40000080 SCONTROL SynIC コントロール
0x40000081 SVERSION SynIC バージョン
0x40000082 SIEFP [割り込みイベント フラグ] ページ
0x40000083 簡 体 字 [メッセージの割り込み] ページ
0x40000084 EOM メッセージの末尾
0x40000090 SINT0 割り込みソース 0 (ハイパーバイザー)
0x40000091 SINT1 割り込みソース 1
0x40000092 SINT2 割り込みソース 2
0x40000093 SINT3 割り込みソース 3
0x40000094 SINT4 割り込みソース 4
0x40000095 SINT5 割り込みソース 5
0x40000096 SINT6 割り込みソース 6
0x40000097 SINT7 割り込みソース 7
0x40000098 SINT8 割り込みソース 8
0x40000099 SINT9 割り込みソース 9
0x4000009A SINT10 割り込みソース 10
0x4000009B SINT11 割り込みソース 11
0x4000009C SINT12 割り込みソース 12
0x4000009D SINT13 割り込みソース 13
0x4000009E SINT14 割り込みソース 14
0x4000009F SINT15 割り込みソース 15

ARM64 プラットフォームでは、これらのレジスタには HvCallGetVpRegistersHvCallSetVpRegisters ハイパーコールを使用して次のレジスタ名でアクセスされます。

HvRegister 名 機能
HvRegisterScontrol SynIC コントロール
HvRegisterSversion SynIC バージョン
HvRegisterSifp [割り込みイベント フラグ] ページ
HvRegisterSipp [メッセージの割り込み] ページ
HvRegisterEom メッセージの末尾
HvRegisterSirbp 割り込み応答バッファー ページ
HvRegisterSint0 割り込みソース 0 (ハイパーバイザー)
HvRegisterSint1 割り込みソース 1
HvRegisterSint2 割り込みソース 2
HvRegisterSint3 割り込みソース 3
HvRegisterSint4 割り込みソース 4
HvRegisterSint5 割り込みソース 5
HvRegisterSint6 割り込みソース 6
HvRegisterSint7 割り込みソース 7
HvRegisterSint8 割り込みソース 8
HvRegisterSint9 割り込みソース 9
HvRegisterSint10 割り込みソース 10
HvRegisterSint11 割り込みソース 11
HvRegisterSint12 割り込みソース 12
HvRegisterSint13 割り込みソース 13
HvRegisterSint14 割り込みソース 14
HvRegisterSint15 割り込みソース 15

SCONTROL レジスタ

このレジスタは、仮想プロセッサの SynIC 動作を制御するために使用されます。

仮想プロセッサの作成時とプロセッサのリセット時に、この SCONTROL (SynIC コントロール レジスタ) の値が0x0000000000000000。 したがって、メッセージ キューとイベント フラグの通知は無効になります。

ビット フィールド Description Attributes
63:1 RsvdP 値は保持する必要があります 読み取り/書き込み
0 Enable この仮想プロセッサを設定すると、メッセージ キューとイベント フラグ通知を SynIC に投稿できるようになります。 クリアすると、メッセージ キューとイベント フラグ通知をこの仮想プロセッサに送信できません。 読み取り/書き込み

SVERSION レジスタ

これは読み取り専用レジスタであり、SynIC のバージョン番号を返します。 このレジスタに書き込もうとすると、#GP エラーが発生します。

ビット フィールド Description Attributes
63:32 RsvdP Read
31:0 SynIC バージョン SynIc のバージョン番号 Read

SIEFP Register

仮想プロセッサの作成時およびプロセッサのリセット時に、この SIEFP (合成割り込みイベント フラグ ページ) レジスタの値が0x0000000000000000。 したがって、SIEFP は既定で無効になっています。 ゲストは、ビット 0 を設定して有効にする必要があります。 指定したベース アドレスがパーティションの GPA 領域の末尾を超えている場合、SIEFP ページにはゲストからアクセスできません。 レジスタを変更する場合、ゲストは、将来の互換性のために予約ビット (1 から 11) の値を保持する必要があります。

ビット フィールド Description Attributes
63:12 ベース アドレス SIEFP のベース アドレス (GPA 空間) (無効と想定される下位 12 ビット) 読み取り/書き込み
11:1 RsvdP 予約済み、値を保持する必要がある 読み取り/書き込み
0 Enable SIEFP の有効化 読み取り/書き込み

SIMP レジスタ

仮想プロセッサの作成時とプロセッサのリセット時に、この SIMP (合成割り込みメッセージ ページ) レジスタの値が0x0000000000000000。 したがって、SIMP は既定で無効になっています。 ゲストは、ビット 0 を設定して有効にする必要があります。 指定したベース アドレスがパーティションの GPA 領域の末尾を超えている場合、SIMP ページにはゲストからアクセスできません。 レジスタを変更する場合、ゲストは、将来の互換性のために予約ビット (1 から 11) の値を保持する必要があります。

ビット フィールド Description Attributes
63:12 ベース アドレス SIMP のベース アドレス (GPA 空間) (無効と想定される下位 12 ビット) 読み取り/書き込み
11:1 RsvdP 予約済み、値を保持する必要がある 読み取り/書き込み
0 Enable SIMP の有効化 読み取り/書き込み

SINTx レジスタ

仮想プロセッサの作成時に、すべての SINTx (合成割り込みソース) レジスタの既定値が0x0000000000010000。 したがって、すべての合成割り込みソースは既定でマスクされます。 ゲストは、適切なベクターをプログラミングし、ビット 16 をクリアして、マスクを解除する必要があります。

ポーリング ビットを設定すると、実際の割り込みが生成されないことを除き、割り込みソースのマスクを解除する効果があります。

AutoEOI フラグは、割り込みが仮想プロセッサに配信されるときに、ハイパーバイザーによって暗黙的な EOI を実行する必要があることを示します。 さらに、ハイパーバイザーは、仮想 APIC の "サービス内レジスタ" (ISR) 内の対応するフラグを自動的にクリアします。 ゲストがこの動作を有効にした場合、割り込みサービス ルーチンで EOI を実行してはなりません。 AutoEOI フラグはいつでも有効にすることができますが、ゲストは実行中の割り込みで明示的な EOI を実行する必要がありますが、タイミングを考慮すると、特定の割り込みが EOI を必要とするかどうかを把握するのが困難になるため、SINT がマスク解除されると、その設定は変更されないことをお勧めします。 同様に、AutoEOI フラグはいつでもオフにすることができますが、実行中の割り込みに関する同じ懸念が適用されます

vector の有効な値は 16 から 255 です。 無効なベクター番号を指定すると、#GP が発生します。

ビット フィールド Description Attributes
63:19 RsvdP 予約済み、値を保持する必要がある 読み取り/書き込み
18 ポーリング ポーリング モードを有効にする 読み取り/書き込み
17 AutoEOI 割り込み配信時に暗黙的な EOI を実行する必要があるかどうかを設定します 読み取り/書き込み
16 マスク SINT がマスクされている場合に設定する 読み取り/書き込み
15:8 RsvdP 予約済み、値を保持する必要がある 読み取り/書き込み
7:0 Vector 割り込みベクトル 読み取り/書き込み

EOM レジスタ

ゲストによるメッセージの末尾 (EOM) レジスタへの書き込みにより、ハイパーバイザーは仮想プロセッサに関連付けられている内部メッセージ バッファー キューをスキャンします。 メッセージ バッファー キューにキューに入ったメッセージ バッファーが含まれている場合、ハイパーバイザーはメッセージの配信を試みます。 SIM ページが有効で、SINTx に対応するメッセージ スロットが空の場合 (つまり、ヘッダーのメッセージの種類が HvMessageTypeNone に設定されている場合)、メッセージの配信は成功します。 メッセージが正常に配信されると、対応する内部メッセージ バッファーがデキューされ、空きとしてマークされます。 対応する SINTx がマスクされていない場合は、エッジによってトリガーされる割り込みが配信されます (つまり、IRR 内の対応するビットが設定されます)。

このレジスタは、ゲストがメッセージを "ポーリング" するために使用できます。 また、無効になっている (マスクされている) SINTx のメッセージ キューをドレインする方法としても使用できます。

メッセージ キューがすべて空の場合、EOM レジスタへの書き込みは no-opです。

EOM レジスタからの読み取りでは、常にゼロが返されます。

ビット フィールド Description Attributes
63:0 RsvdZ 書き込み専用トリガー Write