Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Зарезервированные значения
В этой спецификации некоторые поля считаются зарезервированными. Эти поля могут иметь конкретное значение в будущих версиях архитектуры низкоуровневой оболочки. Для обеспечения максимальной прямого совместимости клиенты интерфейса низкоуровневой оболочки должны следовать указаниям, приведенным в этом документе. Как правило, предоставляются две формы рекомендаций. Сохранение значения (задокументировано как 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" в начале определенного типа указывает указатель на постоянное значение этого типа.