CPUID (CPU Identification)

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 02:02, 18 декабря 2016.
CPUID (CPU Identification)
Cpuid22.jpg
Разработчики: System Information Development Kit (SIDK), System Monitoring Development Kit (SMDK)
Постоянный выпуск: 1.78 / 21 November 2016 (2016-11-21)
Состояние разработки: Active
Операционная система: Windows 98 - Windows 10
Локализация: Английский, Китайский
Тип ПО: Утилита
Веб-сайт www.cpuid.com

CPUID (CPU Identification) - это дополнительная инструкция процессоров архитектуры x86, которая используется для получения информации о процессоре. С ее помощью можно определить тип процессора и его характеристики. Она впервые была представлена корпорацией Intel в 1993 году примерно в то же время, когда этой же корпорацией представила торговую марку процессоров x86 Pentium и улучшенные процессоры i486. Код инструкции CPUID - 0F A2 (если задавать двумя байтами, если словом - A20Fh). Во время исполнения инструкции задействован регистр EAX, и в некоторых случаях - ECX.

История

Поскольку архитектура Intel развивается с добавлением новых поколений и моделей процессоров (8086, 8088, Intel286, Intel386, Intel486, процессоры Pentium, процессоры Pentium OverDrive, процессоры Pentium с технологией MMX, процессоры Pentium OverDrive с технологией MMX, процессоры Pentium Pro, а также: Pentium II, Pentium II Xeon, Pentium II Overdrive, Intel Celeron, Mobile Intel Celeron, Pentium III, Mobile Intel Pentium III - M, Pentium III Xeon, Pentium 4 , Mobile Intel Pentium 4 – M, Intel Xeon and Intel Xeon MP), важно, чтобы Intel предоставлял средства, с помощью которых программное обеспечение может идентифицировать характеристики каждого процессора. Этот идентификационный механизм развился в сочетании с архитектурой Intel следующим образом:

  1. Первоначально Intel опубликовал кодовые последовательности, которые могли обнаружить незначительную реализацию или архитектурные различия для идентификации поколения, к которому относится процессор
  2. Позже, с появлением процессора Intel386 корпорация включила в состав процедуру идентификации подписи процессора, в результате которой можно было узнать семейство, модель и версию процессора, используя программные решения. Однако это можно было сделать только после перезагрузки.
  3. Поскольку архитектура Intel развилась, корпорация расширила процедуру идентификации подписи процессора, и она стала называться CPUID инструкция. С ее помощью можно выяснить не только подпись процессора, но и информацию о характеристиках, поддерживаемых и внедряемых на процессоре Intel.

Эволюция процедуры идентификации процессора была необходима, потому что, поскольку архитектура Intel распространяется, рынок IT-технологий должен был быть готов к настройке функциональности процессора на фоне множества поколений и моделей, имеющих разный набор характеристик. Ожидая, что такая тенденция распространиться и на будущие поколения процессоров, нововведение в архитектуру Intel CPUID инструкция расширяема. Учитывая сильные стороны инструкции CPUID, разработчики могут создавать приложения и инструменты, которые могут использоваться совместно несмотря на богатое разнообразие поколений процессоров Intel в прошлом, настоящем и будущем.[1]

Проверка возможности исполнения CPUID инструкции

Семейство процессоры Intel486 и последующие процессоры предоставляют прямой метод для того, чтобы определить, поддерживает ли внутренняя архитектура процессора CPUID инструкцию. Этот метод использует специальный флаг ID, находящийся в 21 бите регистра EFLAGS. Если программа сможет изменить значение этот флага, то процессор поддерживает CPUID инструкцию, иначе - не поддерживает. Этот бит проиллюстрирован ниже.

Рис.1. 21 бит в разных типах процессоров

Результат работы CPUID инструкции

Рис.2 Результаты выполнения инструкции CPUID

Инструкция CPUID поддерживает два набора функций. Первый набор функций возвращает базовую информацию о процессоре. С помощью второго набора можно получить дополнительную информацию о процессоре. На рисунке 2 проиллюстрировано то, какая базовая информация о процессоре может быть получена и где она хранится. Выходные данные инструкции CPUID полностью зависимы от содержания регистра EAX. Это означает, что, помещая различные значения в регистр EAX, а затем выполняя инструкцию CPUID, инструкция CPUID выполняет определенную функцию в зависимости от того, какое значение было помещено в регистр EAX (см. таблицу 1). Чтобы определить максимально допустимое входное значение регистра EAX и функций CPUID, которые возвращают базовую информацию о процессоре, программе следует установить значение параметра регистра EAX в нулевое, а затем выполнить инструкцию CPUID следующим образом:

MOV EAX, 00H
CPUID

После выполнения инструкции CPUID возвращаемое значение будет присутствовать в регистре EAX. Всегда используйте значение EAX, которое больше или равно нулю и меньше либо равно максимально допустимого значения EAX.

Чтобы определить максимально допустимое входное значение регистра EAX и функций CPUID, которые возвращают дополнительную информацию, программе следует установить значение параметра регистра EAX, равное 80000000h а затем исполнить инструкцию CPUID следующим образом:

MOV 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.

Таблица 1. Информация, возвращаемая инструкцией 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 Продолжение строки бренда

Процессорная идентификационная подпись

Начиная с семейства процессоров Intel486, регистр EDX содержит идентификационную подпись процессора, появляющуюся там после сброса (см. рисунок 3). Идентификационная подпись процессора - это 32-разрядное значение. Подпись процессора состоит из 8 различных битовых полей. Поля серого цвета представляют собой зарезервированные биты и должны кэшироваться. Остальные 6 полей формируют идентификационную подпись процессора.

Рис.3 Регистр EDX после сброса

Процессоры, которые поддерживают инструкцию CPUID, также возвращают 32-разрядную идентификационную подпись процессора, после сброса. Однако, инструкция CPUID дает возможность проверки подписи процессора в любое время. Рисунок 3 показывает формат 32-разрядной подписи процессора для Intel486 и последующих процессоров. Обратите внимание на то, что значение подписи процессора EDX после сброса эквивалентно выходному значению подписи процессора в регистре EAX на рисунке 2. Рассмотрим содержание EDX регистра подробнее: (здесь можно сделать таблицу)

  • Биты с 20 по 27: дополнительная информация о семействе, используется в сочетании с основным кодом семейства, определенным между битами 8 и 11, чтобы указать, принадлежит ли процессор Intel386, Intel486, Pentium, Pentium Pro или Pentium 4 семействам.
  • Биты с 16 по 19: дополнительная информация о модели, используется в сочетании с номером модели, определенным между битами 4 и 7, используются для идентификации модели процессора в семействе. ID в битах 0 до 3 указывает номер ревизии той модели.
  • Биты с 12 по 13: информация о типе процессора, указывает, является ли процессор исходным процессором OEM, OverDrive или сдвоенным (Dual). Значения типа процессора, возвращенный в битах 12 и 13 из регистра EAX, представлены в таблице 2.
  • Биты с 8 по 11: основной код семейства процессора
  • Биты с 4 по 7: модель семейства процессора
  • Биты с 0 по 3: номер ревизии модели
Таблица 2. Типы процессора (биты 12 и 13)
Значение Описание
00 OEM процессор
01 OverDrive процессор
10 Dual процессор
11 Зарезервировано Intel (не используется)

Флаги и характеристики

Когда регистр 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 характеристики процессора.

Таблица 3. Форматы дескриптора
Бит 31 Тип дескриптора Описание
1 Зарезервирован Зарезервирован для будущего использования
0 8-битные дескрипторы Дескрипторы, указывающие на параметр таблицы для определения характеристик кэша. Указывает на NULL, если содержит 0

Серийный номер процессора

Серийный номер процессора расширяет понятие идентификации процессора. Серийный номер процессора - 96-разрядное число, доступное через инструкцию CPUID. Он может использоваться приложениями, чтобы идентифицировать процессор.

Серийный номер процессора создает уникальное программное решение для конкретного процессора. Серийный номер в комбинации с другими классификаторами может быть применен к идентификации пользователя. Приложения включают проверку подлинности членства, резервное копирование данных / восстановление, съемная защита данных хранения, управление доступом к файлам, или подтвержденный обмен документом между надлежащими пользователями. Также серийный номер может использоваться для включения доверенного PC.

Наличие серийного номера процессора

Чтобы определить, поддерживается ли функция определения серийного номера процессора, программе следует установить значение параметра регистра EAX равным 1, а затем выполнить инструкцию CPUID следующим образом:

MOV EAX, 01H
CPUID

После выполнения инструкции CPUID регистры ECX и EDX содержат характеристики и флаги. Если флаг PSN (бит 18 регистра EDX) равен 1, то серийный номер процессора поддерживается и включен. При 0 он либо выключен, либо не поддерживается.

Формирование 96-битного серийного номера

96-разрядный серийный номер процессора - это комбинация трех 32-разрядный объектов. Чтобы получить доступ к старшим 32-разрядным битам, программе следует установить параметр регистра EAX в 1, а затем выполнить инструкцию как показано ниже:

MOV EAX, 01H
CPUID

После ее выполнения регистр EAX содержит идентификационную подпись процессора. Она включает старшие 32-разрядные бита серийного номера процессора. Значение в EAX должно быть сохранено до сбора оставшихся 64 битов серийного номера.

Чтобы получить к ним доступ, программе следует установить параметр регистра EAX в 3, а затем выполнить инструкцию CPUID:

MOV EAX, 03H
CPUID

После выполнения инструкции CPUID регистр EDX содержит средние 32 бита, а регистр ECX содержит младшие значащие 32 бита серийного номера. После этого программа может соединить сохраненную идентификационную подпись, EDX и ECX, а затем возвратить полный 96-битный серийный номер процессора.[2]

Номер, помогающий идентифицировать процессор

Начиная с процессоров Pentium 3, концепция идентификации процессора была расширена добавлением специального идентификационного номера. Он представляет собой 8-битный номер, доступный через инструкцию CPUID. Может быть использован приложениями для облегчения идентификации процессора.

Процессоры, которые имеют такой номер, возвращают его в битах с 0 по 7 в регистре EBX, когда CPUID выполняется со стартовым значением 1 регистра EAX. Процессоры, которые не поддерживают такой номер, возвращают нулевое значение в этих же битах регистра EBX.

Строка идентификации

Эта строка - новое расширение инструкции CPUID, реализованная в некоторых процессорах. Используя ее, эти процессоры будут возвращать эту идентификационную строку в кодировке ASCII и максимальную рабочую частоту через инструкцию CPUID. Когда инструкция будет выполняться с набором значений регистра EAX, указанным с таблице 4, процессор будет возвращать эту строку в регистрах общего назначения.[3]

Таблица 4. Характеристики идентификационной строки процессора
Входное значение 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 инструкции, программе следует придерживаться следующей последовательности:

  1. Шаг 1. Определить, поддерживается ли CPUID инструкция модификацией флага ID в регистре EFLAGS. Если изменить его не получается, значит - не поддерживается.
  2. Шаг 2. Выполните инструкцию со значением в EAX 80000000h. Это нужно сделать для того, чтобы выяснить, поддерживается ли идентификационная строка. Если эта функция возвратила значение, большее, чем 80000000h, идентификационная строка поддерживается, и программе следует использовать функции с 80000002h по 80000004h для дальнейшей идентификации.
  3. Шаг 3. Если идентификационная строка не поддерживается, выполните CPUID со значением 1 в регистра EAX. Такая функция возвратит идентификационную подпись в регистр EAX и номер, помогающий в идентификации в биты с 0 по 7 регистра EBX. Если они будут содержать отличное от 0 значение, значит, номер поддерживается. В таком случае программе нужно просканировать список номеров для идентификации.
  4. Шаг 4. Если номер не поддерживается, программа использует идентификационную подпись вместе с дескрипторами кэша для идентификации.

Источники

  1. Википедия [Электронный ресурс]: CPUID — материал из Википедии — свободной энциклопедии: Версия 749927331, сохранённая в 22:29 16 ноября 2016. / Авторы Википедии // Википедия, свободная энциклопедия. — Электрон. дан. — Сан-Франциско: Фонд Викимедиа, 2016. — Режим доступа: https://en.wikipedia.org/wiki/CPUID
  2. Intel [Электронный ресурс] : CPUID / Дата обращения: 14 декабря 2016 - Режим доступа: http://bochs.sourceforge.net/techspec/24161821.pdf
  3. Хабрахабр [Электронный ресурс] : Идентификация процессоров / Дата обращения: 14 декабря 2016 - Режим доступа: https://habrahabr.ru/company/intel/blog/220851/