[[_full_cpuid_control_for_bhyve]] === Полный контроль CPUID для bhyve Контакт: Hans Rosenfeld ==== Введение Ядра операционных систем, а также некоторые пользовательские библиотеки и программы часто должны знать, на какой модели 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 //