[[_full_cpuid_control_for_bhyve]]
=== Полный контроль CPUID для bhyve

Контакт: Hans Rosenfeld <rosenfeld@grumpf.hope-2000.org>

==== Введение

Ядра операционных систем, а также некоторые пользовательские библиотеки и программы часто должны знать, на какой модели CPU они работают и какие архитектурные возможности доступны для использования.
На платформах на базе x86 для запроса всей этой информации у CPU можно использовать инструкцию CPUID.

В среде виртуальной машины не вся информация, сообщаемая хост-процессором, должна быть доступна гостевой ОС, некоторую другую информацию о CPU, например, о топологии системы, необходимо изменить в соответствии с конфигурацией ВМ, и также существует некоторая дополнительная информация, которую необходимо сообщать, но которую не поддерживает ни один реальный CPU, например, идентификация гипервизора.

Таким образом, в рамках своей обычной работы в качестве гипервизора bhyve эмулирует инструкцию x86 CPUID для своих гостевых ВМ.
В настоящее время большая часть информации CPUID от хост-процессора передаётся гостевой ВМ с маскированием некоторых функций, а также сообщается синтетическая информация о гипервизоре, его возможностях и его конфигурации.
Ничего из этого в настоящее время нельзя явно настроить в bhyve.

==== Мотивация

Полный контроль над информацией CPUID, эмулируемой для гостевой ВМ, имеет множество важных вариантов использования:

===== Миграция ВМ

Для миграции работающей или приостановленной ВМ между разными хост-системами ВМ обычно требуется, чтобы обе задействованные хост-системы работали на одном и том же или по крайней мере совместимом по функциям семействе, модели и степпинге хост-процессоров.
Даже незначительные различия в модели и степпинге CPU могут привести к различиям в доступном наборе функций.

Контроль над информацией CPUID для гостевой ВМ позволяет администратору ограничить ВМ использованием общего подмножества функций CPU, разделяемого всеми хост-системами ВМ, на которых ВМ потенциально может работать, что также может быть основано на абстрактном уровне архитектуры x86, а не на реальной модели CPU.

В настоящее время это поддерживается QEMU/KVM на Linux, и эквивалентная поддержка в bhyve является ключевым шагом на пути к поддержке полнофункциональной живой миграции ВМ.

===== Фиксированная модель CPU

Некоторое программное обеспечение проверяет семейство/модель/степпинг CPU, а также строку бренда CPU по причинам совместимости ПО.
Изменение этих параметров из-за миграции ВМ или изменения оборудования в хост-системе ВМ было бы обнаружено и могло бы считаться системным изменением, потенциально отключая лицензию на проприетарное ПО.
Возможность использовать предопределённую модель CPU, будь то на основе реального CPU или архитектурного подмножества, полностью решила бы эту проблему.

===== Изменение сигнатуры гипервизора

Некоторое программное обеспечение, такое как драйверы Nvidia, проверяет сигнатуру гипервизора на соответствие определённым известным значениям.
Bhyve идентифицирует себя как "bhyve bhyve   ", в то время как KVM сообщает "KVMKVMKVM\0\0\0".
Хотя реализация переключателя в командной строке для изменения сигнатуры гипервизора bhyve для каждой ВМ была бы возможна и без полного контроля CPUID, реализация этой функции с использованием полного контроля CPUID была бы более естественной и привела бы к более чистой архитектуре.

===== Маскирование функций и изменение архитектуры (даунгрейд / апгрейд)

Возможность легко понижать или повышать модель CPU или маскировать отдельные биты функций может предоставить преимущества для разработки и тестирования операционных систем и приложений.

==== Текущее состояние контроля CPUID для bhyve

Базовая реализация части ядра vmm для контроля CPUID доступна в bhyve на illumos уже несколько лет.
Этот код был написан Oxide для использования со своим гипервизором Propolis, который основан на компонентах ядра FreeBSD/bhyve, перенесённых на illumos без использования какого-либо пользовательского кода bhyve.

Как и все улучшения bhyve, сделанные на illumos, код ядра vmm для контроля CPUID имеет двойную лицензию CDDL и BSD.
Он был перенесён на bhyve во FreeBSD под лицензией BSD.
В качестве доказательства концепции в пользовательском пространстве bhyve были реализованы новые параметры конфигурации для контроля CPUID, демонстрирующие потенциал полного контроля CPUID в bhyve.

==== Обзор проекта

Текущая работа над этим проектом направлена на интеграцию существующей концептуальной работы во FreeBSD и добавление следующих функций для удобства использования:

- удобный метод конфигурации для переопределения отдельных битов, частей или даже целых функций CPUID по мере необходимости, сохраняя при этом остальную информацию CPUID хоста или предопределённую конфигурацию CPUID
- удобный метод конфигурации для сигнатуры гипервизора, сообщаемой bhyve
- набор предопределённых конфигураций CPUID на основе общих уровней архитектуры x86, возможно, также включающий набор данных CPUID для нескольких реальных моделей CPU, и удобный метод конфигурации для выбора одной из них для ВМ

Спонсор: Фонд FreeBSD

//
// The FreeBSD Russian Documentation Project
//
// Original EN revision (16.02.2026): e9d9fc005914a65f4a58d0ca08e0cde6365cfcee
//
