保留的值
此規格將一些欄位記載為「保留」。 這些欄位可能會在未來的 Hypervisor 架構版本中提供特定意義。 為了達到最大向前相容性,Hypervisor 介面的用戶端應遵循本檔中提供的指引。 一般而言,會提供兩種形式的指引。 保留值 (圖表中記載為 RsvdP,而程式碼區段中的 ReservedP) – 為了達到最大向前相容性,用戶端應保留此欄位中的值。 這通常是藉由讀取目前的值、修改非保留字段的值,以及將值寫回來完成。 圖表中記錄為 RsvdZ 的零值 (在程式碼區段中) – 為了達到最大向前相容性,用戶端應將此欄位內的值零。
唯讀結構內的保留字段只會記錄為圖表中的 Rsvd,而只是在程式碼區段中保留。 為了達到最大向前相容性,應該忽略這些欄位內的值。 用戶端不應假設這些值一律為零。
簡單純量類型
Hypervisor 資料類型是從簡單的純量類型 UINT8、UINT16、UINT32、UINT64 和 UINT128 所建置。 其中每一個都代表具有指定位元數目的簡單不帶正負號的整數純量。 也會定義數個對應的帶正負號整數純量:INT8、INT16、INT32 和 INT64。 Hypervisor 不會使用浮點指令或浮點類型。
Hypercall 狀態碼
每個 hypercall 都會傳回類型為 HV_STATUS 的 16 位狀態碼。
typedef UINT16 HV_STATUS;
記憶體位址空間類型
Hypervisor 架構會定義三個獨立位址空間:
- 系統實體位址 (SPA) 定義 CPU 所見基礎硬體的實體位址空間。 整部電腦只有一個系統實體位址空間。
- 客體實體位址 (GPO) 定義客體記憶體的檢視。 GPO 可以對應至基礎 SPA。 每個分割區都有一個客體實體位址空間。
- 客體虛擬位址 (GVA) 會在客體中啟用位址轉譯並提供有效的來賓頁面表格時使用。
這三個位址空間的大小上限為 264 個位元組。 因此會定義下列類型:
typedef UINT64 HV_SPA;
typedef UINT64 HV_GPA;
typedef UINT64 HV_GVA;
許多 Hypervisor 介面會處理記憶體分頁,而不是單一位元組。 頁面大小下限取決於架構。 針對 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_SPAHV_SPA_PAGE_NUMBER ,只要除以 HV_PAGE_SIZE 。
結構、列舉和位欄位
此規格稍後定義的許多資料結構和常數值都是以 C 樣式列舉和結構來定義。 C 語言的目的是避免定義特定實作詳細資料。 不過,本檔假設下列事項:
- 以 「enum」 關鍵字宣告的所有列舉都會定義 32 位帶正負號的整數值。
- 所有結構都會以欄位自然對齊的方式填補 (,也就是 8 位元組欄位會對齊 8 個位元組的位移,依此類) 。
- 所有位欄位都會從低順序封裝到高階位,沒有邊框間距。
位元組序
Hypervisor 介面的設計目的是要成為端對中性 (,也就是說,應該可以將 Hypervisor 移植到大端或小端系統) ,但此規格稍後定義的部分資料結構會採用小到小的版面配置。 如果嘗試使用大端埠,則必須修改這類資料結構。
指標命名慣例
檔使用指標類型的命名慣例。 特別是,在定義的型別前面加上 「P」 表示該類型的指標。 在定義的類型前面加上 「PC」 表示該類型的常數值指標。