Поделиться через


Типы данных

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

В этой спецификации некоторые поля считаются зарезервированными. Эти поля могут иметь конкретное значение в будущих версиях архитектуры низкоуровневой оболочки. Для обеспечения максимальной прямого совместимости клиенты интерфейса низкоуровневой оболочки должны следовать указаниям, приведенным в этом документе. Как правило, предоставляются две формы рекомендаций. Сохранение значения (задокументировано как RsvdP в схемах и ReservedP в сегментах кода) — для максимальной совместимости с пересылкой клиенты должны сохранять значение в этом поле. Обычно это делается путем считывания текущего значения, изменения значений не зарезервированных полей и записи значения обратно. Нулевое значение (задокументированное как RsvdZ в схемах и ReservedZ в сегментах кода) — для максимальной совместимости с пересылкой клиенты должны обнулять значение в этом поле.

Зарезервированные поля в структурах, доступных только для чтения, просто документируются как Rsvd в схемах и как зарезервированные в сегментах кода. Для обеспечения максимальной прямого совместимости значения в этих полях следует игнорировать. Клиенты не должны предполагать, что эти значения всегда будут равны нулю.

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

Типы данных гипервизора создаются из простых скалярных типов UINT8, UINT16, UINT32, UINT64 и UINT128. Каждый из них представляет собой простой скаляр без знака с указанным числом битов. Также определено несколько соответствующих скаляров со знаком: INT8, INT16, INT32 и INT64. Гипервизор не использует ни инструкции с плавающей запятой, ни типы с плавающей запятой.

Код состояния гипервызова

Каждый гипервыск возвращает 16-разрядный код состояния типа HV_STATUS.

typedef UINT16 HV_STATUS;

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

Архитектура гипервизора определяет три независимых адресных пространства:

  • Физические системные адреса (SPA) определяют физическое адресное пространство базового оборудования, как это видно ЦП. Существует только одно системное физическое адресное пространство для всего компьютера.
  • Физические адреса гостей (GGP) определяют представление физической памяти гостя. Объекты групповой политики можно сопоставить с базовыми приложениями spa. Для каждой секции имеется одно физическое адресное пространство гостя.
  • Гостевые виртуальные адреса (GVA) используются в гостевой системе, когда он включает преобразование адресов и предоставляет допустимую таблицу гостевой страницы.

Все три адресных пространства имеют размер до 264 байт. Таким образом, определяются следующие типы:

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

Многие интерфейсы низкоуровневой оболочки действуют на страницах памяти, а не на отдельных байтах. Минимальный размер страницы зависит от архитектуры. Для 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 байтов и т. д.).
  • Все битовые поля упаковываются от разрядов низкого порядка до битов высокого порядка без заполнения.

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

Интерфейс низкоуровневой оболочки предназначен для байтового нейтрального интерфейса (т. е. можно перенести гипервизор в систему с большим эндианом или с маленьким эндианом), но некоторые структуры данных, определенные далее в этой спецификации, предполагают, что макет с маленьким эндианом. Такие структуры данных необходимо будет изменить при попытке создания порта big-endian.

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

В документе используется соглашение об именовании для типов указателей. В частности, "P", добавленный к определенному типу, указывает указатель на этот тип. "PC" в начале определенного типа указывает указатель на постоянное значение этого типа.