次の方法で共有


仮想プロセッサ

各パーティションには、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 プラットフォームでは、仮想プロセッサの ID は、RDMSR を使用してHV_X64_MSR_VP_INDEXハイパーバイザーで定義された MSR (モデル固有のレジスタ) を介してゲストによって取得できます。

#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 を使用して Virtual VP Assist MSR (0x40000073) に書き込むことで、オーバーレイ ページの場所 (GPA 空間内) を指定します。 Virtual VP Assist Page MSR の形式は次のとおりです。

ビット フィールド Description
0 Enable VP アシスト ページを有効にします
11:1 RsvdP 予約済み
63:12 ページ PFN Virtual VP Assist Page PFN

ARM64 プラットフォームの場合

ARM64 プラットフォームでは、ゲストは HvCallSetVpRegisters ハイパーコールを使用して HvRegisterVpAssistPage 合成レジスタに書き込むことで、オーバーレイ ページの場所 (GPA 空間内) を指定します。 レジスタ形式は x64 MSR 形式と同じです。

仮想プロセッサのランタイム レジスタ

ハイパーバイザーのスケジューラは、各仮想プロセッサがコードの実行に消費する時間を内部的に追跡します。 追跡される時間は、仮想プロセッサが実行中のゲスト コードを消費する時間と、関連付けられている論理プロセッサがそのゲストの代わりにハイパーバイザー コードの実行に費やす時間の組み合わせです。 この累積時間は、読み取り専用レジスタを介してアクセスできます。 時間数量は 100ns 単位で測定されます。

x64 プラットフォームの場合

x64 プラットフォームでは、RDMSR を使用して、64 ビット読み取り専用HV_X64_MSR_VP_RUNTIMEハイパーバイザー MSR を介して VP ランタイムにアクセスします。

ARM64 プラットフォームの場合

ARM64 プラットフォームでは、VP ランタイムは HvCallGetVpRegisters ハイパーコールを使用して HvRegisterVpRuntime 合成レジスタを介してアクセスされます。 これは読み取り専用レジスタです。

非特権命令実行防止 (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によって返される推奨カウントの倍数ごとにこの通知を行う必要があります。 このハイパーコールを通じて、ゲストはハイパーバイザーに長いスピンロック取得を通知します。 これにより、ハイパーバイザーはより適切なスケジュール決定を行うことができます。