予約値
この仕様では、一部のフィールドを "予約済み" として文書化しています。 これらのフィールドには、将来のバージョンのハイパーバイザー アーキテクチャで特定の意味が与えられる場合があります。 前方互換性を最大にするため、ハイパーバイザー インターフェイスのクライアントは、このドキュメントに記載されているガイダンスに従う必要があります。 一般に、2 つの形式のガイダンスが提供されます。 値を保持する (図では RsvdP、コード セグメントでは予約済みP) – 前方互換性を最大限に高めるには、クライアントはこのフィールド内の値を保持する必要があります。 これは通常、現在の値を読み取り、予約されていないフィールドの値を変更し、値を書き戻すことによって行われます。 ゼロ値 (図では RsvdZ、コード セグメントでは ReservedZ として文書化) – 前方互換性を最大限に高める場合、クライアントはこのフィールド内の値をゼロにする必要があります。
読み取り専用構造体内の予約済みフィールドは、図では Rsvd として、コード セグメントでは単に予約済みとして文書化されています。 前方互換性を最大にするため、これらのフィールド内の値は無視する必要があります。 クライアントは、これらの値が常に 0 であると想定しないでください。
単純スカラー型
ハイパーバイザー データ型は、単純なスカラー型 UINT8、UINT16、UINT32、UINT64、UINT128 から構築されます。 これらのそれぞれは、指定されたビット数を持つ単純な符号なし整数スカラーを表します。 対応する符号付き整数スカラーもいくつか定義されています。INT8、INT16、INT32、INT64。 ハイパーバイザーでは、浮動小数点命令も浮動小数点型も使用しません。
Hypercall 状態コード
すべてのハイパーコールは、HV_STATUS型の 16 ビット状態コードを返します。
typedef UINT16 HV_STATUS;
メモリ アドレス空間の種類
ハイパーバイザー アーキテクチャでは、次の 3 つの独立したアドレス空間が定義されています。
- システム物理アドレス (SPA) は、 CPU で見られるように、基になるハードウェアの物理アドレス空間を定義します。 コンピューター全体のシステム物理アドレス空間は 1 つだけです。
- ゲスト物理アドレス (GPO) は、 ゲストの物理メモリのビューを定義します。 GPO は、基になる SPA にマップできます。 パーティションごとに 1 つのゲスト物理アドレス空間があります。
- ゲスト仮想アドレス (GVA) は、アドレス変換を有効にし、有効なゲスト ページ テーブルを提供するときにゲスト内で使用されます。
これらの 3 つのアドレス空間はすべて、最大 264 バイトのサイズです。 したがって、次の型が定義されます。
typedef UINT64 HV_SPA;
typedef UINT64 HV_GPA;
typedef UINT64 HV_GVA;
多くのハイパーバイザー インターフェイスは、1 バイトではなくメモリのページで動作します。 最小ページ サイズはアーキテクチャに依存します。 x64 の場合、4K として定義されます。
#define X64_PAGE_SIZE 0x1000
#define HV_X64_MAX_PAGE_NUMBER (MAXUINT64/X64_PAGE_SIZE)
#define HV_PAGE_SIZE X64_PAGE_SIZE
#define HV_LARGE_PAGE_SIZE X64_LARGE_PAGE_SIZE
#define HV_PAGE_MASK (HV_PAGE_SIZE - 1)
typedef UINT64 HV_SPA_PAGE_NUMBER;
typedef UINT64 HV_GPA_PAGE_NUMBER;
typedef UINT64 HV_GVA_PAGE_NUMBER;
typedef UINT32 HV_SPA_PAGE_OFFSET
を HV_SPA に変換するには、 HV_SPA_PAGE_NUMBER単に を で除算します HV_PAGE_SIZE。
構造体、列挙、およびビット フィールド
この仕様の後半で定義される多くのデータ構造体と定数値は、C スタイルの列挙と構造体の観点から定義されています。 C 言語では、特定の実装の詳細の定義を意図的に回避します。 ただし、このドキュメントでは次のことを前提としています。
- "enum" キーワードで宣言されたすべての列挙型は、32 ビット符号付き整数値を定義します。
- すべての構造体は、フィールドが自然に配置されるように埋め込まれます (つまり、8 バイトのフィールドは 8 バイトのオフセットに配置されます)。
- すべてのビット フィールドは、パディングなしで下位ビットから上位ビットにパックされます。
エンディアン
ハイパーバイザー インターフェイスはエンディアンに依存するように設計されていますが (つまり、ハイパーバイザーをビッグ エンディアンまたはリトル エンディアン システムに移植できる必要があります)、この仕様で後述するデータ構造の一部は、リトル エンディアン レイアウトを想定しています。 ビッグ エンディアン ポートが試行された場合、このようなデータ構造を修正する必要があります。
ポインターの名前付け規則
このドキュメントでは、ポインター型に名前付け規則を使用します。 特に、定義された型の前に "P" が付いている場合、その型へのポインターが示されます。 定義された型に付加された "PC" は、その型の定数値へのポインターを示します。