仮想プロセッサ

各パーティションには、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)

仮想プロセッサの ID は、ハイパーバイザーで定義された MSR (モデル固有のレジスタ) HV_X64_MSR_VP_INDEXを介してゲストによって取得できます。

#define HV_X64_MSR_VP_INDEX 0x40000002

仮想プロセッサのアイドル スリープ状態

仮想プロセッサは、仮想アイドル 状態のプロセッサ電源状態、またはプロセッサ スリープ状態に配置できます。 この強化された仮想アイドル状態により、低電力アイドル状態に配置された仮想プロセッサは、割り込みが仮想プロセッサでマスクされている場合でも、割り込みの到着と共に起動されます。 つまり、仮想アイドル状態を使用すると、ゲスト パーティション内のオペレーティング システムは、ゲスト パーティションで実行するときに使用できない OS のプロセッサの省電力手法を利用できます。

AccessGuestIdleMsr 特権を持つパーティションは、ハイパーバイザーで定義された MSR HV_X64_MSR_GUEST_IDLEへの読み取りを通じて、仮想プロセッサのアイドル スリープ状態へのエントリをトリガーできます。 割り込みが仮想プロセッサで有効になっているかどうかに関係なく、割り込みが到着すると、仮想プロセッサが起動します。

[仮想プロセッサ アシスト] ページ

ハイパーバイザーは、ゲスト GPA スペースにオーバーレイされる仮想プロセッサごとにページを提供します。 このページは、ゲスト VP とハイパーバイザー間の双方向通信に使用できます。 ゲスト OS には、この仮想 VP アシスト ページへの読み取り/書き込みアクセス権があります。

ゲストは、Virtual VP Assist MSR (0x40000073) に書き込むことで、オーバーレイ ページの場所 (GPA 空間内) を指定します。 Virtual VP Assist Page MSR の形式は次のとおりです。

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

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

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

非特権命令実行防止 (NPIEP)

非特権命令実行 (NPIEP) は、ユーザー モード コードによる特定の命令の使用を制限する機能です。 具体的には、この機能を有効にすると、SIDT、SGDT、SLDT、STR 命令の実行をブロックできます。 これらの命令を実行すると、#GPエラーが発生します。

この機能は、 HV_X64_MSR_NPIEP_CONFIG_CONTENTSを使用して VP 単位で構成する必要があります。

ゲスト スピンロック

一般的なマルチプロセッサ対応オペレーティング システムでは、特定の操作のアトミック性を適用するためにロックが使用されます。 ハイパーバイザーによって制御される仮想マシン内でこのようなオペレーティング システムを実行する場合、ロックによって保護されるこれらの重要なセクションは、クリティカル セクション コードによって生成されたインターセプトによって拡張できます。 重要なセクション コードは、ハイパーバイザー スケジューラによって割り込まれる場合もあります。 ハイパーバイザーはこのようなプリエンプションを回避しようとしますが、発生する可能性があります。 その結果、ロックホルダーが再びスケジュールされ直されるまで、他のロック候補がスピンし、スピンロックの取得時間が大幅に延長される可能性があります。

ハイパーバイザーは、ハイパーバイザーに過剰なスピン状況を示す前にスピンロックの取得を試行する必要がある回数をゲスト OS に示します。 この数は、CPUID リーフ 0x40000004で返されます。 値 0 は、ゲスト OS が長いスピンロック取得についてハイパーバイザーに通知しないことを示します。

HvCallNotifyLongSpinWait ハイパーコールは、マルチプロセッサ仮想マシンのロックの統計的公平性プロパティを改善するために、対応するゲストのためのインターフェイスを提供します。 ゲストは、CPUID リーフ 0x40000004によって返される推奨カウントの倍数ごとにこの通知を行う必要があります。 このハイパーコールを通じて、ゲストはハイパーバイザーに長いスピンロック取得を通知します。 これにより、ハイパーバイザーはより適切なスケジュール決定を行うことができます。