CPUID — это машинная инструкция процессоров архитектуры x86 и x86-64, которая позволяет программе напрямую запросить у процессора сведения о нём: производителя, модель, степпинг, количество ядер и перечень поддерживаемых технологий. Именно через неё утилиты вроде CPU-Z или HWiNFO показывают вам название чипа и список инструкций вроде AVX или AES-NI — никаких датчиков и внешних запросов для этого не требуется.
Инструкция появилась ещё в процессорах Intel Pentium и поздних моделях 486, а затем стала стандартом для всех x86-совместимых чипов, включая продукцию AMD. До её появления программам приходилось определять тип процессора косвенными трюками — например, анализируя поведение флагов процессора, что было ненадёжно. CPUID решила эту задачу раз и навсегда.
Как работает инструкция CPUID
Механизм вызова устроен предельно просто: программа помещает номер запроса (его называют листом, или leaf) в регистр EAX, иногда уточняя подзапрос в регистре ECX, и выполняет команду CPUID. Процессор в ответ заполняет регистры EAX, EBX, ECX и EDX битовыми полями с информацией. Никаких привилегий для этого не нужно — инструкция доступна любому приложению, включая обычные пользовательские программы.
Разные номера листов возвращают разные категории данных. Базовые листы отвечают за идентификацию и функции, а так называемые расширенные (с номерами от 0x80000000) — за дополнительные сведения, например полное маркетинговое название процессора в виде текстовой строки.
Пример вызова на языке ассемблера выглядит так:
mov eax, 0
cpuid
; после выполнения EBX, EDX, ECX содержат строку производителя
Какую информацию возвращает CPUID
Объём данных зависит от конкретной модели процессора: современные чипы поддерживают больше листов, чем старые. Тем не менее базовый набор сведений доступен практически на любом x86-процессоре последних десятилетий.
- 🔧 Строка производителя — GenuineIntel для Intel или AuthenticAMD для AMD, возвращается листом 0.
- 🧬 Family, Model, Stepping — числовые идентификаторы поколения и ревизии чипа, по которым ПО точно определяет модель.
- ⚡ Флаги возможностей — поддержка SSE, AVX, AES-NI, VT-x, Hyper-Threading и других технологий.
- 🧮 Топология — количество физических ядер и логических потоков, что важно для планировщика ОС.
- 💾 Параметры кэша и TLB — размеры и структура кэш-памяти разных уровней.
- 🌡️ Серийный номер — существовал только на ранних Pentium III; из соображений приватности от него быстро отказались, и в современных чипах его нет.
Отдельно стоит упомянуть брендовую строку — то самое длинное название вроде «Intel Core i7-12700K», которое вы видите в диспетчере задач. Она собирается из трёх расширенных листов и хранится прямо в процессоре как текст.
Основные листы CPUID и их назначение
Ниже приведены наиболее известные листы. Точный перечень поддерживаемых листов зависит от модели процессора — программа должна сначала запросить максимальный доступный номер листа и только потом обращаться к конкретным данным.
| Номер листа (EAX) | Возвращаемая информация |
|---|---|
| 0 | Максимальный базовый лист и строка производителя |
| 1 | Family/Model/Stepping и базовые флаги функций |
| 4 | Параметры кэш-памяти (определяется итеративно) |
| 7 | Расширенные флаги: AVX2, BMI, защитные механизмы |
| 0x80000002–0x80000004 | Полное маркетинговое название процессора |
⚠️ Внимание: интерпретировать сырые биты CPUID «вручную» нужно строго по официальной документации Intel или AMD. Один и тот же бит у разных вендоров и поколений может означать разное, а ошибочная трактовка приведёт к неверным выводам о возможностях чипа.
Где CPUID используется на практике
Чаще всего вы сталкиваетесь с результатами работы CPUID, даже не подозревая об этом. Диспетчер задач Windows, показывающий название процессора, установщики программ, проверяющие совместимость, гипервизоры — все они опираются на эту инструкцию.
Операционная система при загрузке опрашивает процессор через CPUID, чтобы понять, какие функции можно задействовать: поддерживает ли чип аппаратную виртуализацию, сколько логических потоков доступно планировщику, какие защитные механизмы включать. Программы с оптимизациями под конкретные наборы инструкций — видеокодеки, архиваторы, библиотеки шифрования — проверяют флаги CPUID и выбирают подходящую ветку кода: быструю через AVX2 или совместимую со старыми чипами.
Ещё одна важная область — лицензирование и антипиратская защита. Связка данных CPUID вместе с другими идентификаторами железа используется для привязки лицензий к конкретному компьютеру. Правда, сам по себе CPUID для этого ненадёжен: у однотипных процессоров идентификаторы совпадают.
CPUID в виртуальных машинах
Гипервизоры — VMware, Hyper-V, KVM, VirtualBox — перехватывают выполнение CPUID внутри виртуальной машины и могут подменять возвращаемые значения. Это штатный механизм, а не обход защиты: так гипервизор скрывает функции физического процессора, которые нельзя безопасно предоставить гостевой системе, или маскирует различия между хостами в кластере, чтобы виртуальную машину можно было переносить между серверами.
Из-за этого же механизма некоторые программы определяют, что запущены в виртуальной среде: гипервизоры оставляют характерные признаки в ответах CPUID, включая фирменные строки вендора виртуализации. Вредоносное ПО иногда использует эту проверку, чтобы не проявлять активность в песочницах аналитиков.
Почему в виртуалке может не работать вложенная виртуализация
Если гипервизор не пробросил флаги VT-x или AMD-V через CPUID в гостевую систему, вложенный гипервизор внутри виртуальной машины не увидит поддержку аппаратной виртуализации и откажется работать. Включение этой опции зависит от настроек конкретного гипервизора и поддержки со стороны физического процессора.
Как посмотреть данные CPUID без программирования
Писать код на ассемблере вовсе не обязательно — готовые утилиты показывают всю информацию в удобном виде. Вот безопасный порядок действий:
- 🪟 Откройте диспетчер задач Windows (вкладка «Производительность» → «ЦП») — там видны название, число ядер и потоков, поддержка виртуализации.
- 📊 Установите CPU-Z или HWiNFO — эти утилиты отображают Family/Model/Stepping, ревизию, полный список поддерживаемых инструкций и параметры кэша.
- 🐧 В Linux выполните команду
lscpuили посмотрите файл/proc/cpuinfo— система собирает эти данные через CPUID при загрузке. - 💻 Для разработчиков доступны встроенные функции компиляторов, например
__cpuidв MSVC или аналогичные интринсики в GCC.
☑️ Проверка возможностей процессора
Если какая-то программа отказывается запускаться с ошибкой о неподдерживаемом процессоре, первым делом сверьте её системные требования с флагами из CPU-Z. Возможная причина — отсутствие нужного набора инструкций, например AVX, и программно это не исправить: набор инструкций зашит в кремний.
⚠️ Внимание: скачивайте диагностические утилиты только с официальных сайтов разработчиков. Под видом «программ для проверки процессора» нередко распространяется вредоносное ПО.
Ограничения и подводные камни CPUID
Инструкция сообщает только то, что о себе «знает» процессор, и не всегда эта картина полная. Например, поддержка виртуализации может присутствовать в флагах CPUID, но быть отключена в BIOS/UEFI — тогда флаг есть, а функция недоступна. Обратная ситуация тоже встречается: обновление микрокода может изменять поведение некоторых функций без смены идентификаторов модели.
Ещё один нюанс — одинаковые значения CPUID у разных экземпляров одной модели процессора. Использовать эти данные как уникальный «отпечаток» конкретного компьютера нельзя: серийных номеров у современных x86-чипов нет. Для идентификации системы применяют комбинацию источников — данные материнской платы, TPM и другие идентификаторы.
Наконец, в виртуальных средах данные CPUID могут быть намеренно изменены гипервизором, поэтому диагностика «железа» изнутри виртуальной машины показывает не физический процессор хоста, а его виртуализованный профиль.
Часто задаваемые вопросы
CPUID — это вирус или системный процесс Windows?
Нет, CPUID — это не процесс и не файл, а инструкция процессора. Однако если вы увидели в системе отдельный процесс или файл с похожим названием, стоит проверить его антивирусом: вредоносные программы иногда маскируются под технические термины.
Можно ли изменить данные, которые возвращает CPUID?
На физическом компьютере — нет, значения зашиты в процессор и определяются его моделью и микрокодом. В виртуальных машинах гипервизор может подменять ответы CPUID, и это штатная функция для обеспечения совместимости.
Почему CPU-Z показывает другое название, чем наклейка на корпусе?
Утилита берёт брендовую строку напрямую из процессора через расширенные листы CPUID. Маркетинговое название на упаковке может отличаться по формату записи, но модель и поколение должны совпадать. Расхождение модели — повод проверить, тот ли процессор установлен.
Замедляет ли частый вызов CPUID работу компьютера?
Для обычных программ влияние ничтожно — инструкция выполняется очень быстро. В виртуальных средах вызовы CPUID перехватываются гипервизором, что дороже, но при типичной нагрузке разница незаметна.
Как программа узнаёт количество ядер через CPUID?
Через специальные листы топологии процессор сообщает структуру ядер и потоков. Однако корректный разбор этих данных зависит от поколения чипа и вендора, поэтому надёжнее использовать системные API операционной системы, которые уже учитывают эти различия.