свойства cpuid что это
Cpuid
cpuid
CPUID (CPU Identification) — ассемблерная мнемоника инструкции процессоров x86, используется для получения информации о процессоре. Используя её, программа может определить тип ЦП и его возможности (например, можно определить, какие расширения поддерживаются процессором).
Инструкция CPUID впервые появилась в процессорах i486. Потом она начала поддерживаться всеми процессорами начиная с Intel 486DX/SX/DX2 SL, AMD 486DX4, Cyrix 6×86 (M1), UMC U5S.
Содержание
Проверка поддержки инструкции CPUID процессором
Так как инструкция CPUID отсутствовала в первых процессорах архитектуры x86, перед её использованием следует удостоверится что ЦП её поддерживает. Для этого производится попытка изменить бит 21 (ID) регистра EFLAGS. Если бит успешно поменяется, то инструкция CPUID процессором поддерживается.
Приведённый ниже исходный код проверяет поддержку инструкции CPUID:
В данном примере используется инструкция XOR, так как она непременно поменяет только 21-й флаг ID не затронув другие. Обратите внимание: здесь используются 32-битные инструкции, поэтому рекомендуем сначала проверить поддерживает ли процессор 32-битные директивы.
Использование CPUID
Инструкция CPUID по содержимому регистра EAX определяет какого рода информацию о процессоре необходимо вернуть. Первый раз её следует вызывать со значением EAX = 0. При этом будет возвращено максимально допустимое значение параметра инструкции, поддерживаемое данным процессором.
Для того, чтобы получить информацию о дополнительных функциях, имеющихся в процессорах, в регистре EAX перед вызовом CPUID должен быть установлен бит 31. Например, чтобы определить максимально допустимое значение параметра для дополнительных функций, необходимо выполнить CPUID со значением EAX = 80000000h.
EAX = 0: Получить идентификатор производителя процессора
При EAX = 0 ЦП возвращает идентификатор производителя процессора (англ. Vendor ID ) в виде 12 символов ASCII, содержащихся в регистрах EBX, EDX, ECX (именно в таком порядке). В регистре EAX же возвращается максимально допустимое значение EAX при вызове CPUID.
Вот некоторые идентификаторы производителей процессоров:
ASCii-строка | HEX-значения EBX:EDX:ECX | Название производителя |
---|---|---|
"GenuineIntel" | 756E6547:49656E69:6C65746E | Intel |
"AuthenticAMD" | 68747541:69746E65:444D4163 | AMD |
"CyrixInstead" | 69727943:736E4978:64616574 | Cyrix |
"CentaurHauls" | 746E6543:48727561:736C7561 | Centaur |
"SiS SiS SiS " | 20536953:20536953:20536953 | SiS |
"NexGenDriven" | 4778654E:72446E65:6E657669 | NexGen |
"GenuineTMx86" | 756E6547:54656E69:3638784D | Transmeta |
"RiseRiseRise" | 65736952:65736952:65736952 | Rise |
"UMC UMC UMC " | 20434D55:20434D55:20434D55 | UMC |
"Geode by NSC" | 646F6547:79622065:43534E20 | National Semiconductor |
Ссылки
Полезное
Смотреть что такое «Cpuid» в других словарях:
cpuid — (CPU Identification) ассемблерная мнемоника инструкции процессоров x86, используется для получения информации о процессоре. Используя её, программа может определить тип ЦП и его возможности (например, можно определить, какие расширения… … Википедия
cPUID — (CPU Identification) ассемблерная мнемоника инструкции процессоров x86, используется для получения информации о процессоре. Используя её, программа может определить тип ЦП и его возможности (например, можно определить, какие расширения… … Википедия
CPUID — (CPU Identification) ассемблерная мнемоника инструкции процессоров x86, используется для получения информации о процессоре. Используя её, программа может определить тип процессора и его возможности (например, можно определить, какие… … Википедия
CPUID — The CPUID opcode is a processor supplementary instruction (its name derived from CPU IDentification) for the x86 architecture. It was introduced by Intel in 1993 when it introduced the Pentium and SL Enhanced 486 processors.[1] By using the CPUID … Wikipedia
CPUID — Die CPUID Kennung ist seit den späteren 486ern Teil der x86 Prozessorarchitektur, ab dem Pentium war sie dann vollständig verfügbar. Die Kennung erlaubt der Software im laufenden Betrieb den Prozessor zu identifizieren, einschließlich des… … Deutsch Wikipedia
CPUID — abbr. Central Processing Unit IDentifier (CPU) … United dictionary of abbreviations and acronyms
CPUID String — Четырехзначная строка символов, по которой производится идентификация процессора. Первым символом обычно идет ноль, второй и третий означают семейство и номер модели, четвертый символ означает степпинг. Например, сравнивая два процессора с CPUID… … Глоссарий терминов бытовой и компьютерной техники Samsung
CPU-Z — CPUID Développeur Franck Delattre … Wikipédia en Français
Xeon — New Intel Xeon Logo used in 2011 Produced From 1998 to present Common manufacturer(s) … Wikipedia
Intel Core (microarchitecture) — This article is about the Intel microarchitecture. For Intel processors branded as Intel Core, including the Core microarchitecture based Core 2 and others not based on the Core microarchitecture, see Intel Core. The Intel Core microarchitecture… … Wikipedia
(Само)идентификация процессоров. Часть вторая. Волосатый CPUID
В первой части я рассказал о необходимости идентификации расширений, присутствующих на конкретном процессоре. Это нужно для того, чтобы исполняющийся код (операционная система, компилятор или пользовательское приложение) смог надёжно определить, какие возможности аппаратуры он может задействовать. Также в предыдущей статье я сравнил несколько популярных архитектур центральных процессоров общего назначения. Возможности по идентификации между ними сильно разнятся: некоторые предоставляют полную информацию о расширениях ISA, тогда как другие ограничиваются парой чисел для различения вендора и ревизии.
В этой части я расскажу об одной инструкции архитектуры Intel IA-32 — CPUID, введённой специально для перечисления декларируемых процессором расширений. Немного о том, что было до её появления, что она умеет сообщать, какие неожиданности могут поджидать и какой софт позволяет интерпретировать её вывод.
Источник изображения: [1]
История
Как я уже утверждал в первой части, присутствует следующая тенденция: чем более «встраиваемая» природа у процессора, тем меньше возможностей для идентификации заложено в его архитектуру. Создатели встраиваемых систем почему-то не волнуются о переносимости двоичного кода.
Не являлся исключением и Intel 8086 — микропроцессор 1970-х годов, выросший из «калькуляторной» серии 8008, 8080, 8085. Изначально в него не было заложено никаких средств идентификации.
Начиная с 808386 сведения о модели, степпинге и семействе стали сообщаться в регистре EDX сразу после перезагрузки (получения сигнала RESET). Инструкция CPUID, кодируемая байтами 0x0f 0xa2, была введена в процессорах 80486. Наличие CPUID можно было распознать по возможности записи в бит 21 регистра флагов. Для поддержки работы на более старых ЦПУ приходилось идти на очень изощрённые методы для того, чтобы различать процессоры серий от 8086 до 80386.
Перечисленные в оригинальной статье техники были опробованы преимущественно на ЦПУ от Intel. В статье автор признаёт, что они не позволяют надёжно классифицировать клоны x86 других производителей.
Интерфейс
Для системного программиста работа по идентификации некоторого расширения обычно заключается в установке входных значений в регистрах EAX (лист, англ. leaf) и ECX (подлист, англ. subleaf), исполнению CPUID и прочтению результата в четырёх регистрах: EAX, EBX, ECX, EDX. Отдельные битовые поля выходных регистров будут содержать информацию о значениях связанных с ними архитектурных параметров конкретного ядра процессора.
Все валидные сочетания входных листов-подлистов и четвёрок регистров на выходе формируют таблицу CPUID. Для современных процессоров она содержит около двух десятков строк по четыре 32-битных столбца.
Я не буду расписывать детально все официально описанные поля этой таблицы. Интересующиеся всегда могут найти их в Intel SDM [1] (рекомендую запастись терпением — около 40 страниц текста только про CPUID). Болеее того, для уже заявленных, но ещё не выпущенных в физических продуктах расширений ISA соответствующие им новые поля CPUID могут быть найдены в [3]. Вместо этого я классифицирую информацию, которую можно извлечь из вывода этой инструкции. Для обозначения битовых полей таблицы я буду использовать принятую для этого нотацию: CPUID.leaf.subleaf.reg[bitstart:bitend]. Например, CPUID.0.EBX[31:0] — это биты с 0 по 31 выходного регистра EBX после исполнения CPUID, которая на вход получила лист 0 (EAX = 0); подлист (входное значение ECX) игнорируется, поэтому он не указан.
Регионы листов
Неподдерживаемые значения входных EAX и ECX не приводят к возникновению исключений, а вместо этого возвращают нули во всех четырёх регистрах, либо «мусор» (значения другого листа согласно спецификации). Допустимые же сочетания листов и подлистов образуют три непрерывных региона.
Brand String
Конечно же, ни один вендор не упустит возможности увековечить своё имя в идентификационных данных своего продукта. Причём желательно сделать это не просто в виде числа, а впечатать ASCII-строку (хорошо хоть, что не Unicode).
В IA-32 CPUID текст можно найти минимум в двух группах листов. CPUID.0.EBX, ECX, EDX содержат 12 байт ASCII-строки, специфичной для каждого вендора. Для Intel это, конечно же, «GenuineIntel». А три листа CPUID.0x80000002–0x80000004 предоставляют аж 48 байт для кодирования в ASCII так называемой Brand String. Именно её видно при распечатке cat /proc/cpuinfo в Linux. И, хотя формат её более-менее стандартизован: «вендор марка серия CPU @ частота», я настоятельно не рекомендую по её содержимому принимать решения в программном коде. Слишком значительно её содержимое может варьироваться: частота может быть указана в МГц или в ГГц (а в реальности быть совсем иной из-за динамической подстройки), пробелы могут менять положение, а симулятор или виртуальная машина могут подставить туда вообще что угодно. Вся информация из brand string может быть найдена программно более надёжными способами.
Информация о кэшах, такая как их тип, количество, ёмкость, геометрия, разделяемость между ядрами полезна для тюнинга высокопроизводительного математического софта, например, библиотек BLAS (basic linear algebra system).
Изначально конфигурацию кэшей описывал лист 2. Спроектировали его не очень дальновидно. Формат кодирования информации в нём был выбран не самый гибкий, он не смог в будущем поддержать постоянные изменения в объёме и конфигурации нескольких уровней кэшей. В настоящее время использование информации из листа 2 не рекомендуется, там могут стоять 0xFF-ки.
Судя по тому, что лист 0x80000006 входит в расширенный диапазон (хотя я не уверен, документальных доказательств пока что не нашёл), он был добавлен не Intel. С помощью него была сделана попытка информацию листа 2 дополнить данными о строении кэшей, которые потребовались разработчикам софта. При этом опять же не было намерения предоставить пространство для роста.
Лист 4 — последнее и пока что наиболее гибкое представление данных о кэшах. Цена этому — добавление концепции подлистов, кодируемых в ECX. Каждый подлист описывает один кэш: данных, кода или совмещённый, определяет его уровень, ёмкость и т.д. Хватит ли четвёртого листа надолго — поживём, увидим.
Топология
Изменяемые поля
Разное
В этой секции я собрал прочие интересные моменты, связанные с историей и работой команды CPUID.
Processor Serial Number
Во времена Pentium III каждый процессор получил уникальный серийный номер, содержавшийся в CPUID.3.ECX и CPUID.3.EDX [7]. Легко представить, насколько такая фича была бы удобна для нужд защиты ПО от копирования. Однако в 1999 году Европейское сообщество запротестовало, разумно опасаясь, что подобная функциональность повредит приватности пользователей таких систем. Уже в Intel Pentium IV серийный номер был убран, сейчас лист 3 возвращает нули.
Вендоры и CPUID
Очень интересная таблица [5] повествует о том, что хранят (или в прошлом хранили) в разных листах CPUID разные вендоры. Например, описывается некий mystery level 0x8fffffff, в котором процессоры AMD K8 возвращали строку IT’S HAMMER TIME.
Agner Fog о войнах ISA
История появления расширений набора инструкций IA-32 в условиях конкурентной борьбы нескольких компаний [4]. Добавление новых инструкций всегда влияло на CPUID, и не всегда все могли договориться о том, как это сделать правильно.
Они испортили CPUID! IA32_BIOS_SIGN_ID
Инструкция CPUID всегда нравилась мне лаконичностью своего интерфейса и отсутствием неожиданностей в работе: один регистр на входе и четыре на выходе. В её работе нет генерации исключений, нет обращений к памяти, нет чтения/модификации регистра флагов, на неё не влияют префиксы, она работает во всех режимах процессора. По сравнению с зоопарком CISC-команд IA-32 это был почти идеал.
… пока не оказалось, что иногда на вход необходимо подать два регистра для кодирования листа и подлиста. Окей, не так всё хорошо. Ну хотя бы выходные регистры заранее известны и всегда изменяются…
И тут оказалось, что иногда CPUID изменяет ещё один регистр — а именно IA32_BIOS_SIGN_ID, — и сохраняет в нём сигнатуру текущей программы микрокода процессора. Происходит это, если до этого было произведено обновление прошивки процессора. По каким-то причинам информация об этой процедуре была раскидана по мануалу [1] на тысячу страниц, и потому она ускользала от меня очень долго.
Национальная библиотека им. Н. Э. Баумана
Bauman National Library
Персональные инструменты
CPUID (CPU Identification)
Содержание
История
Эволюция процедуры идентификации процессора была необходима, потому что, поскольку архитектура Intel распространяется, рынок IT-технологий должен был быть готов к настройке функциональности процессора на фоне множества поколений и моделей, имеющих разный набор характеристик. Ожидая, что такая тенденция распространиться и на будущие поколения процессоров, нововведение в архитектуру Intel CPUID инструкция расширяема. Учитывая сильные стороны инструкции CPUID, разработчики могут создавать приложения и инструменты, которые могут использоваться совместно несмотря на богатое разнообразие поколений процессоров Intel в прошлом, настоящем и будущем. [1]
Проверка возможности исполнения CPUID инструкции
Результат работы CPUID инструкции
Инструкция CPUID поддерживает два набора функций. Первый набор функций возвращает базовую информацию о процессоре. С помощью второго набора можно получить дополнительную информацию о процессоре. На рисунке 2 проиллюстрировано то, какая базовая информация о процессоре может быть получена и где она хранится. Выходные данные инструкции CPUID полностью зависимы от содержания регистра EAX. Это означает, что, помещая различные значения в регистр EAX, а затем выполняя инструкцию CPUID, инструкция CPUID выполняет определенную функцию в зависимости от того, какое значение было помещено в регистр EAX (см. таблицу 1). Чтобы определить максимально допустимое входное значение регистра EAX и функций CPUID, которые возвращают базовую информацию о процессоре, программе следует установить значение параметра регистра EAX в нулевое, а затем выполнить инструкцию CPUID следующим образом:
После выполнения инструкции CPUID возвращаемое значение будет присутствовать в регистре EAX. Всегда используйте значение EAX, которое больше или равно нулю и меньше либо равно максимально допустимого значения EAX.
Чтобы определить максимально допустимое входное значение регистра EAX и функций CPUID, которые возвращают дополнительную информацию, программе следует установить значение параметра регистра EAX, равное 80000000h а затем исполнить инструкцию CPUID следующим образом:
После выполнения инструкции CPUID возвращаемое значение будет в регистре EAX. Всегда используйте значение параметра регистра EAX, которое больше либо равно 80000000h и меньше либо равно максимальному допустимому значению EAX. На сегодняшних и будущих IA-32 процессорах 31 бит в регистре EAX будет очищен, когда выполнится CPUID с входным параметром, большим, чем максимальное значение для любого набора функций, и когда расширенные функции не поддерживаются. Все остальные значения битов, возвращаемые процессором в ответ на инструкцию CPUID со значением в EAX больше подходящего для этого процессора, являются уникальными для данной модели и не рекомендуется их изменять.
Идентификатор производителя
В дополнение к возврату максимально допустимого значения в регистре EAX одновременно может быть также проверен идентификатор производителя Intel. Если регистр EAX содержит на входе ноль, то инструкция CPUID также возвращает идентификатор производителя в EBX, EDX и ECX регистрах (см. рисунок 2). Эти регистры содержат строку ASCII: GenuineIntel.
В то время как любой имитатор архитектуры Intel может поддержать инструкцию CPUID, ни одни из них не может претендовать на то, что он является подлинной частью Intel. Таким образом, присутствие строки GenuineIntel является гарантией того, что инструкция CPUID и идентификатор реализованы в соответствии с документом, содержащим описание процессоров Intel и инструкции CPUID. Если такая строка не появилась после исполнения инструкции, не полагайтесь на информацию в этом документе для интерпретации информации, возвращенной инструкцией CPUID.
Начальное значение EAX | Предоставляемая информация о процессоре |
---|---|
Базовая информация | |
0H | EAX Максимальное входное значение EBX «Genu» ECX «ntel» EDX «ineI» |
1H | EAX 32-битный идентификатор производителя (Расширенные семейство и модель, тип, семейство, модель, версия также 95-64 биты из 96-битного серийного номера, когда установлен флаг PSN) EBX Биты 7-0: Индекс Биты 15-8: Размер строки CLFLUSH (размер строки кэша = возвращаемое значение * 8). Допустимо только при установке флага CLFSH Биты 23-16: Граф логических процессоров. Допустимо только при установке флага HTT Биты 31-24: Уникальное значение контроллера APIC (работает с прерываниями). Только для Pentium 4 и последующих. ECX Зарезервирован под дополнительные флаги EDX Флаги характеристик |
2H | EAX. EBX, ECX, EDX Кэш и TLB дескрипторы |
3H | EAX Зарезервировано EBX Зарезервировано ECX Биты 31-0 96-битного серийного номера EDX Биты 31-0 96-битного серийного номера |
Расширенная информация | |
80000000h | EAX максимальное входное значение EBX, ECX, EDX Зарезервированы |
80000001h | EAX Расширенный идентификатор производителя, а также характеристики EBX, ECX, EDX Зарезервированы |
80000002h | EAX Строка бренда EBX, ECX, EDX Продолжение строки бренда |
80000003h | EAX, EBX, ECX, EDX Продолжение строки бренда |
80000004h | EAX, EBX, ECX, EDX Продолжение строки бренда |
Процессорная идентификационная подпись
Процессоры, которые поддерживают инструкцию CPUID, также возвращают 32-разрядную идентификационную подпись процессора, после сброса. Однако, инструкция CPUID дает возможность проверки подписи процессора в любое время. Рисунок 3 показывает формат 32-разрядной подписи процессора для Intel486 и последующих процессоров. Обратите внимание на то, что значение подписи процессора EDX после сброса эквивалентно выходному значению подписи процессора в регистре EAX на рисунке 2. Рассмотрим содержание EDX регистра подробнее: (здесь можно сделать таблицу)
Флаги и характеристики
Когда регистр EAX содержит значение 1, инструкция CPUID (в дополнение к загрузке подписи процессора в регистре EAX), загружает EDX и регистр ECX со значениями флагов. Значения флагов (когда Флаг = 1) показывают, какие функции поддерживает процессор. Чтобы узнать, какие функции поддерживает процессор, следует обратиться к руководству для разработчиков, пользователей или другой подходящей документации процессора.
Размер кэша, формат и информация TLB
Когда регистр EAX содержит значение 2, инструкция CPUID загружает EAX, EBX, ECX и регистры EDX с дескрипторами, которые указывают кэш процессоров и характеристики TLB. Последние 8 бит регистра EAX (AL) содержат значение, которое показывает, сколько раз должна выполниться инструкция CPUID, чтобы получить полную картину системы кэширования процессора. Например, процессор Pentium 4 возвращает значение 1 в последних 8 битах регистра EAX, чтобы указать, что инструкция CPUID должна быть выполнена один раз (при EAX = 2) для получения полной картины конфигурации процессора.
Остальной EAX регистр, EBX, ECX и EDX регистры содержат кэш и дескрипторы TLB. Таблица 3 показывает, что когда бит 31 в данном регистре равен нулю, этот регистр содержит допустимые 8-разрядные дескрипторы. Чтобы декодировать дескрипторы, переместитесь последовательно от старшего значащего байта регистра вниз до младшего значащего байта регистра. Предполагая, что 31 бит равен 0, то в этом случае регистр содержит допустимый кэш или дескрипторы TLB в битах с 24 по 31, с 16 по 23, с 8 по 15 и с 0 по 7. Программа должна сравнить значение, находящееся в конце битовых полей дескриптора со значениями, декодирующими дескриптор, и таким образом определить кэш и TLB характеристики процессора.
Бит 31 | Тип дескриптора | Описание |
---|---|---|
1 | Зарезервирован | Зарезервирован для будущего использования |
0 | 8-битные дескрипторы | Дескрипторы, указывающие на параметр таблицы для определения характеристик кэша. Указывает на NULL, если содержит 0 |
Серийный номер процессора
Серийный номер процессора создает уникальное программное решение для конкретного процессора. Серийный номер в комбинации с другими классификаторами может быть применен к идентификации пользователя. Приложения включают проверку подлинности членства, резервное копирование данных / восстановление, съемная защита данных хранения, управление доступом к файлам, или подтвержденный обмен документом между надлежащими пользователями. Также серийный номер может использоваться для включения доверенного PC.
Наличие серийного номера процессора
Чтобы определить, поддерживается ли функция определения серийного номера процессора, программе следует установить значение параметра регистра EAX равным 1, а затем выполнить инструкцию CPUID следующим образом:
После выполнения инструкции CPUID регистры ECX и EDX содержат характеристики и флаги. Если флаг PSN (бит 18 регистра EDX) равен 1, то серийный номер процессора поддерживается и включен. При 0 он либо выключен, либо не поддерживается.
Формирование 96-битного серийного номера
После ее выполнения регистр EAX содержит идентификационную подпись процессора. Она включает старшие 32-разрядные бита серийного номера процессора. Значение в EAX должно быть сохранено до сбора оставшихся 64 битов серийного номера.
Чтобы получить к ним доступ, программе следует установить параметр регистра EAX в 3, а затем выполнить инструкцию CPUID:
После выполнения инструкции CPUID регистр EDX содержит средние 32 бита, а регистр ECX содержит младшие значащие 32 бита серийного номера. После этого программа может соединить сохраненную идентификационную подпись, EDX и ECX, а затем возвратить полный 96-битный серийный номер процессора. [2]
Номер, помогающий идентифицировать процессор
Начиная с процессоров Pentium 3, концепция идентификации процессора была расширена добавлением специального идентификационного номера. Он представляет собой 8-битный номер, доступный через инструкцию CPUID. Может быть использован приложениями для облегчения идентификации процессора.
Процессоры, которые имеют такой номер, возвращают его в битах с 0 по 7 в регистре EBX, когда CPUID выполняется со стартовым значением 1 регистра EAX. Процессоры, которые не поддерживают такой номер, возвращают нулевое значение в этих же битах регистра EBX.
Строка идентификации
Входное значение EAX | Функции | Возвращаемое значение |
---|---|---|
80000000h | Наибольшая поддерживаемая функция | EAX=80000004, EBX, ECX, EDX зарезервированы |
80000001h | Расширенная идентификационная подпись и биты | EAX, EBX, ECX, EDX зарезервированы |
80000002h | Идентификационная строка | EAX, EBX, ECX, EDX содержат ASCII строку |
80000003h | Идентификационная строка | EAX, EBX, ECX, EDX содержат ASCII строку |
80000004h | Идентификационная строка | EAX, EBX, ECX, EDX содержат ASCII строку |
Последовательность идентификации процессора
Для идентификации процессора с помощью CPUID инструкции, программе следует придерживаться следующей последовательности: