Типы данныхData Types

Зарезервированные значенияReserved Values

Эта спецификация документирует некоторые поля как "зарезервированные".This specification documents some fields as “reserved.” Эти поля могут иметь определенное значение в будущих версиях архитектуры гипервизора.These fields may be given specific meaning in future versions of the hypervisor architecture. Для обеспечения максимальной совместимости с прямой совместимостью клиенты интерфейса гипервизора должны следовать инструкциям, приведенным в этом документе.For maximum forward compatibility, clients of the hypervisor interface should follow the guidance provided within this document. Как правило, предоставляются две формы руководств.In general, two forms of guidance are provided. Сохранить значение (задокументировано как Рсвдп в диаграммах и Ресерведп в сегментах кода) — для обеспечения максимальной совместимости клиент должен сохранить значение в этом поле.Preserve value (documented as RsvdP in diagrams and ReservedP in code segments) – For maximum forward compatibility, clients should preserve the value within this field. Обычно это делается путем считывания текущего значения, изменения значений незарезервированных полей и записи значения обратно.This is typically done by reading the current value, modifying the values of the non-reserved fields, and writing the value back. Нулевое значение (задокументировано как Рсвдз в диаграммах и Ресерведз в сегментах кода) — для обеспечения максимальной совместимости, клиенты должны обнулить значение в этом поле.Zero value (documented as RsvdZ in diagrams and ReservedZ in code segments) – For maximum forward compatibility, clients should zero the value within this field.

Зарезервированные поля в структурах, доступных только для чтения, просто задокументированы как страницы RSVD в диаграммах и просто зарезервированы в сегментах кода.Reserved fields within read-only structures are simply documented as Rsvd in diagrams and simply as Reserved in code segments. Для обеспечения максимальной совместимости с прямой совместимостью значения в этих полях следует игнорировать.For maximum forward compatibility, the values within these fields should be ignored. Клиенты не должны рассчитывать, что эти значения всегда будут равны нулю.Clients should not assume these values will always be zero.

Простые скалярные типыSimple Scalar Types

Типы данных гипервизора строятся на основе простых скалярных типов UINT8, UINT16, UINT32, UINT64 и UINT128.Hypervisor data types are built up from simple scalar types UINT8, UINT16, UINT32, UINT64 and UINT128. Каждый из них представляет простое целое число без знака, скалярное с указанным числом битов.Each of these represents a simple unsigned integer scalar with the specified bit count. Также определены несколько соответствующих скалярных целых чисел со знаком: INT8, INT16, INT32 и INT64.Several corresponding signed integer scalars are also defined: INT8, INT16, INT32, and INT64. Гипервизор не использует ни инструкции с плавающей точкой, ни типы с плавающей запятой.The hypervisor uses neither floating point instructions nor floating point types.

Код состояния вызоваHypercall Status Code

Каждый вызов возвращает 16-разрядный код состояния типа HV_STATUS.Every hypercall returns a 16-bit status code of type HV_STATUS.

typedef UINT16 HV_STATUS;

Типы адресного пространства памятиMemory Address Space Types

Архитектура гипервизора определяет три независимых адресные пространства:The hypervisor architecture defines three independent address spaces:

  • Системные физические адреса (одностраничные приложения) определяют физическое адресное пространство основного оборудования, отображаемое процессорами.System physical addresses (SPAs) define the physical address space of the underlying hardware as seen by the CPUs. Для всей машины существует только одно физическое адресное пространство системы.There is only one system physical address space for the entire machine.
  • Физические адреса гостей (гпас) определяют представление физической памяти гостевой виртуальной машины.Guest physical addresses (GPAs) define the guest’s view of physical memory. Гпас можно сопоставить с базовым одностраничные приложения.GPAs can be mapped to underlying SPAs. Для каждой секции существует одно физическое адресное пространство гостевой виртуальной машины.There is one guest physical address space per partition.
  • Гостевые виртуальные адреса (ГВАС) используются в гостевой виртуальной машине, когда он включает преобразование адресов и предоставляет допустимую таблицу гостевой страницы.Guest virtual addresses (GVAs) are used within the guest when it enables address translation and provides a valid guest page table.

Все три из этих адресных пространств имеют размер до 264 байт.All three of these address spaces are up to 264 bytes in size. Таким образом определяются следующие типы:The following types are thus defined:

typedef UINT64 HV_SPA;
typedef UINT64 HV_GPA;
typedef UINT64 HV_GVA;

Многие интерфейсы гипервизора работают со страницами памяти, а не с отдельными байтами.Many hypervisor interfaces act on pages of memory rather than single bytes. Минимальный размер страницы зависит от архитектуры.The minimum page size is architecture-dependent. Для x64 он определяется как 4 КБ.For x64, it is defined as 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
typedef HV_GPA_PAGE_NUMBER *PHV_GPA_PAGE_NUMBER;

Чтобы преобразовать HV_SPA в HV_SPA_PAGE_NUMBER , просто разделите на HV_PAGE_SIZE .To convert an HV_SPA to an HV_SPA_PAGE_NUMBER, simply divide by HV_PAGE_SIZE.

Структуры, перечисления и битовые поляStructures, Enumerations and Bit Fields

Многие структуры данных и константные значения, определенные далее в этой спецификации, определяются в терминах перечислений и структур в стиле C.Many data structures and constant values defined later in this specification are defined in terms of C-style enumerations and structures. Язык C намеренно не определяет определенные подробности реализации.The C language purposely avoids defining certain implementation details. Однако в этом документе предполагается следующее:However, this document assumes the following:

  • Все перечисления, объявленные с помощью ключевого слова enum, определяют 32-разрядные целочисленные значения со знаком.All enumerations declared with the “enum” keyword define 32-bit signed integer values.
  • Все структуры дополняются таким образом, что поля выровнены естественно (т. е. 8-байтовое поле выровнено со смещением, равным 8 байтам и т. д.).All structures are padded in such a way that fields are aligned naturally (that is, an 8-byte field is aligned to an offset of 8 bytes and so on).
  • Все битовые поля упаковываются из низкого порядка в старшие (без заполнения).All bit fields are packed from low-order to high-order bits with no padding.

Порядок байтовEndianness

Интерфейс низкоуровневой оболочки разрабатывается как нейтральный (т. е. его можно перенести в систему с обратным порядком байтов или с прямым порядком байтов), но некоторые структуры данных, определенные далее в этой спецификации, предполагают компоновку с прямым порядком байтов.The hypervisor interface is designed to be endian-neutral (that is, it should be possible to port the hypervisor to a big-endian or little-endian system), but some of the data structures defined later in this specification assume little-endian layout. Такие структуры данных должны быть дополнены, если и когда попытается использовать порт с обратным порядком байтов.Such data structures will need to be amended if and when a big-endian port is attempted.

Соглашение об именовании указателейPointer Naming Convention

В документе используется соглашение об именовании для типов указателей.The document uses a naming convention for pointer types. В частности, "P" в начале определенного типа указывает на указатель на этот тип.In particular, a “P” prepended to a defined type indicates a pointer to that type. "ПК", добавленный к определенному типу, указывает на постоянное значение этого типа.A “PC” prepended to a defined type indicates a pointer to a constant value of that type.