logo

Главная Система команд x86 Базовая система команд CPU CPUID
Система команд x86
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

CPUID

Идентификация CPU

Влияние команды на флаги и форматы команды:

OF

DF

IF

TF

SF

ZF

AF

PF

CF

 

Код

Команда

Описание

Проц.

Пример

0F A2

CPUID

Идентификация CPU

Pentium

cpuid

Операция:

switch (EAX)

   case 0: (* EAX = 0 *)

      EAX = hv; (* hv = 2 для процессора Pentium II *)

      (* hv - это максимально возможное входное значение, которое распознается командой CPUID *)

      EBX = Строка идентификации продавца;

      EDX = Строка идентификации продавца;

      ECX = Строка идентификации продавца;

      break;

   case 1: (* EAX = 1 *)

      EAX[3:0] = Номер поколения;

      EAX[7:4] = Модель;

      EAX[11:8] = Семейство;

      EAX[13:12] = Тип;

      EAX[31:14] = Зарезервировано;

      EBX = Зарезервирован; (* 0 *)

      ECX = Зарезервирован; (* 0 *)

      EDX = Флаги особенностей;

      break;

   case 2: (* EAX = 2 *)

      EAX = Данные о КЭШ и TLB;

      EBX = Данные о КЭШ и TLB;

      ECX = Данные о КЭШ и TLB;

      EDX = Данные о КЭШ и TLB;

      break;

   case 3: (* EAX = 3 *)

      ECX = младшие 32 бита идентификационного номера CPU;

      EDX = средние 32 бита идентификационного номера CPU;

      break;

   default: (* EAX > hv *)

      EAX = Зарезервирован; (* Неопределен *)

      EBX = Зарезервирован; (* Неопределен *)

      ECX = Зарезервирован; (* Неопределен *)

      EDX = Зарезервирован; (* Неопределен *)

      break;

end-of-switch

Описание:

Команда CPUID впервые появилась в процессоре Pentium, она предоставляет программному обеспечению информацию о продавце, семействе, модели и поколении процессора, на котором она выполнена.

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

 

Стандартные функции

 

Входное значение EAX = 0

При входном значении 0 в EAX, после выполнения команды CPUID регистр EAX будет содержать максимальное значение, понимаемое командой CPUID (только стандартные функции), а в регистрах EBX, EDX и ECX будет находится строка идентификации производителя процессора (EBX содержит первых 4 символа, EDX содержит следующие 4 символа и ECX содержит последние 4 символа). В таблице 6.33. приведены значения, выдаваемые наиболее распространенными моделями микропроцессоров.

 

Таблица 6.33. Строки идентификации, возвращаемые процессорами различных производителей

 

Содержимое регистров после выполнения команды CPUID (EAX = 0)

Тип процессора (производитель)

EAX

EBX : EDX : ECX

486SL … Pentium III Xeon (Intel)

x

GenuineIntel (756E6547h : 49656E69h : 6C65746Eh)

6x86(L) (Cyrix)

1

CyrixInstead (69727943h : 736E4978h : 64616574h)

6x86MX (Cyrix)

1

CyrixInstead

MediaGX (Cyrix)

1

CyrixInstead

MediaGX MMX Enhansed (Cyrix)

2

CyrixInstead

WinChip 2 (IDT)

1

CentaurHauls

Am486 (AMD)

1

AuthenticAMD (68747541h : 444D4163h : 69746E65h)

Am5x86 (AMD)

1

AuthenticAMD

AMD-K5 (AMD)

1

AuthenticAMD

AMD-K6 (AMD)

1

AuthenticAMD

AMD-K6-2 (AMD)

1

AuthenticAMD

AMD-K6-3 (AMD)

1

AuthenticAMD

 

Входное значение EAX = 1

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

  • EAX[3:0] — (Stepping) номер разработки микропроцессора;
  • EAX[7:4] — (Model) модель микропроцессора,
  • EAX[11:8] — (Family) номер семейства микропроцессора
  • EAX[13:12] — (Type) тип микропроцессора (00b – стандартный, 01b – OverDrive, 10b – Dual), процессоры Pentium OverDrive for Pentium возвращают 00b в поле тип;
  • EAX[31:14] — зарезирвировано.

Регистры EBX и ECX зарезервированы.

В регистре EDX будет содержаться информация о некоторых свойствах и возможностях микропроцессора. Установленный флаг свойств указывает на то, что соответствующее свойство (возможность, функция) данной моделью микропроцессора поддерживается. Информация о свойствах определена следующим образом:

Не все из указанных битов свойств определены в различных моделях процессоров различных производителей. В ранних моделях некоторые из этих битов указываются как зарезервированные, некоторые биты могут по разному интерпретироваться. Но, поскольку постоянно выпускаются модифицированные версии старых моделей процессоров, могут встречаться самые разнообразные комбинации (основные наиболее важные для прикладного программирования биты, такие как: наличие интегрированного FPU, поддержка команд MMX и т.п., везде интерпретируются одинаково).

В таблице 6.34. представлена информация о содержимом регистров некоторых наиболее распространенных моделей микропроцессоров после выполнения команды CPUID с входным EAX = 1.

 

Таблица 6.34



Тип процессора

EAX[11:8] Family

EAX[7:4] Model

EAX[3:0] Stepping

EDX Feature Flags

Intel486SL

4

4

x

н/д

Intel WB Enhansed 486DX2

4

7

x

н/д

Intel 486DX4

4

8

x

н/д

Pentium (60, 66)

5

1

x

н/д

Pentium (75…200)

5

2

x

н/д

Pentium MMX (166, 200)

5

4

x

н/д

PentiumPro

6

1

x

н/д

Pentium II (Model 3)

6

3

x

н/д

Pentium II Xeon (Model 5)

6

5

x

н/д

Intel Celeron (Model 5)

6

5

x

н/д

Intel Celeron (Model 6)

6

6

x

н/д

Pentium III

6

7

x

н/д

Pentium III Xeon

6

7

x

н/д

6x86(L) (Cyrix)

5

2

x

00000105h

6x86MX (Cyrix)

6

0

x

0080A13Dh

MediaGX (Cyrix)

4

4

x

00000001h

MediaGX MMX Enhansed (Cyrix)

5

4

x

00808131h

WinChip 2 (IDT)

5

8

x

008000B5h

Am486 (AMD)

4

x

x

00000001h

Am5x86 (AMD)

4

x

x

00000001h

AMD-K5 (Model 0) (AMD)

5

0

x

000003BFh

AMD-K5 (Model 1) (AMD)

5

1

x

000021BFh

AMD-K5 (Model 2) (AMD)

5

2

x

000021BFh

AMD-K5 (Model 3) (AMD)

5

3

x

000021BFh

н/д — не документировано. Производители выпускали и выпускают

          многие процессоры с различной функциональностью (в разных

          корпусах, по разным технологиям и т.п.). Соответственно, в

          процессорах одного наименования и производителя одни и те же

          функции могут и поддерживаться и не поддерживаться.

 

Входное значение EAX = 2

Команда CPUID со входным значением EAX = 2 предназначена для получения информации об объеме и типе КЭШ памяти микропроцессора. После выполнения этой команды в регистрах EAX, EBX, EDX, ECX содержится соответствующая информация, причем, в младших 8-ми битах регистра EAX (регистр AL) содержится число, указывающее на то, сколько раз подряд необходимо выполнить команду CPUID со входным EAX = 2, чтобы получить достоверную информацию о микропроцессоре (в случае AL = 1, команда должна выполняться однократно).

Самый старший бит в каждом 32-битном регистре указывает на то, содержит ли данный регистр информацию (бит 31 = 0) или зарезирвирован (бит 31 = 1). Все байты незарезирвированных регистров (EAX, EBX, EDX, ECX) содержат т.н. дескрипторы, которые описывают всю, имеющуюся в микропроцессоре КЭШ память. Значения этих дескрипторов расшифровываются по таблице 6.35.

 

Таблица 6.35. Рашифровка значений дескрипторов, возвращаемых командой CPUID в регистрах EAX, EBX, EDX, ECX

 

Значение дескриптора

Описание

00h

Нуль-дескриптор (без значения)

01h

TLB команд, 4К страницы: 4-направленный ассоциативный, 32 элемента

02h

TLB команд, 4М страницы: полностью ассоциативный, 2 элемента

03h

TLB данных, 4К страницы: 4-направленный ассоциативный, 64 элемента

04h

TLB данных, 4М страницы: 4-направленный ассоциативный, 8 элементов

06h

КЭШ команд: размер 8К, 4-направленный ассоциативный, длина строки 32 байта

0Ah

КЭШ данных: размер 8К, 2-направленный ассоциативный, длина строки 32 байта

0Ch

КЭШ данных: размер 16К, 4-направленный ассоциативный, длина строки 32 байта

40h

Нет интегрированного КЭШа второго уровня (L2 cache)

41h

Объединенный КЭШ: размер 128К, 4-направленный ассоциативный, длина строки 32 байта

42h

Объединенный КЭШ: размер 256К, 4-направленный ассоциативный, длина строки 32 байта

43h

Объединенный КЭШ: размер 512К, 4-направленный ассоциативный, длина строки 32 байта

44h

Объединенный КЭШ: размер 1М, 4-направленный ассоциативный, длина строки 32 байта

45h

Объединенный КЭШ: размер 2М, 4-направленный ассоциативный, длина строки 32 байта

 

Например, процессор Pentium Pro с КЭШ второго уровня 256К возвращает следующие значения в регистрах: EAX = 03020101h, EBX = 00000000h, ECX = 00000000h, EDX = 06040A42h; а процессор Pentium II (Model 3) с КЭШ второго уровня 512К — EAX = 03020101h, EBX = 00000000h, ECX = 00000000h, EDX = 0C040843h.

 

Входное значение EAX = 3

Команда CPUID со входным значением EAX = 3 — одно из последних нововведений Intel. Она предназначена для чтения т.н. идентификационного номера микропроцессора — уникального 96-разрядного номера, который может использоваться программным обеспечением, например, для авторизации доступа к каким-либо ресурсам, идентификации пользователя и т.п. После выполнения этой команды регистр ECX содержит младшие 32 бита идентификационного номера, а регистр EDX — средние 32 бита. Старшие 32 бита идентификационного номера — это данные, выдаваемые в регистре EAX командой CPUID с входным EDX = 1. Стандартная форма записи идентификационного номера, определяемая фирмой Intel, выглядит следующим образом: XXXX-XXXX-XXXX-XXXX-XXXX-XXXX (где X – шестнадцатиричная цифра, запись в верхнем регистре).

 

Входное значение EAX > 3

Все функции с входным значением в EAX большим, чем 3, но меньшим, чем выдаваемое функцией с EAX = 0 предельное значение, относятся к специфическим функциям модели, в типовой технической документации не описаны и могут меняться от процессора к процессору.

 

Нестандартные функции

 

Для некоторых процессоров-клонов (AMD, Cyrix, IDT…) определены т.н. нестандартные (расширенные) функции команды CPUID. Они вызываются при входных значениях в EAX больших 7FFF_FFFFh. Полное описание этих функций вы сможете найти в технических руководствах фирм-производителей по конкретным процессорам. Здесь приводятся лишь некоторые наиболее важные.

 

Входное значение EAX = 80000000h

Функция может быть вызвана только после идентификации производителя процессора. После ее выполнения в регистре EAX будет содержаться максимальное входное значение EAX для поддерживаемых расширенных (нестандартных) функций. В таблице даны результаты выполнения данной команды на некоторых процессорах.

 

Таблица 6.36. Содержимое регистров после выполнения команды CPUID с EAX = 80000000h

Тип процессора

EAX

MediaGX MMX Enhansed (Cyrix)

800000005h

WinChip 2 (IDT)

800000005h

Am486 (AMD)

800000000h

Am5x86 (AMD)

800000000h

AMD-K5 (Model 0) (AMD)

800000000h

AMD-K5 (Model 1) (AMD)

800000005h

AMD-K5 (Model 2) (AMD)

800000005h

AMD-K5 (Model 3) (AMD)

800000005h

AMD-K6 (AMD)

800000005h

AMD-K6-2 (AMD)

800000005h

AMD-K6-3 (AMD)

800000005h

 

Входное значение EAX = 80000001h

Результат выполнения данной команды практически идентичен команде CPUID с входным значением EAX = 1. Разница заключается в том, что в этом случае в регистре EDX содержится т.н. расширенная информация о свойствах (Extended Feature Flags). Помимо стандартной информации, здесь содержатся данные о наличии у процессора самых разнообразных специальных возможностей, которые не являются стандартными для процессоров Intel (например, поддержка команд 3DNow!).

У микропроцессоров разных производителей расширенная информация о свойствах, выдаваемая в регистре EDX после выполнения CPUID c входным EAX = 80000001h, определяется по разному. Для точной идентификации всех выдаваемых значений обратитесь к фирменной документации на конкретный тип микропроцессора. Для прикладного программирования имеет значение только один бит — бит, показывающий наличие поддержки 3DNow! команд. Согласно установленному фирмой AMD стандарту этот бит помещается в EDX[31] (0 – 3DNow! не поддерживается, 1 – 3DNow! поддерживается).

 

Входное значение EAX = 80000002h, 80000003h, 80000004h

Команда CPUID с указанными входными значениями в EAX выдает последовательно в регистрах EAX, EBX, ECX, EDX 48-ми значную ASCII строку, содержащую полное наименование процессора. Эта строка обычно используется BIOS для вывода на экран ПК при начальной загрузке.

 

Входное значение EAX = 80000005h

Данная команда предназначена для получения информации о TLB и КЭШе процессора (выдается в регистрах EBX, ECX, EDX).

Особые ситуации защищенного режима:


Нет.

Особые ситуации режима реальной адресации:


Нет.

Особые ситуации режима V86:


Нет.

Замечание:

Для того, чтобы узнать — поддерживается ли команда CPUID конкретной моделью процессора, программное обеспечение должно проверить флаг 21 (ID) регистра EFLAGS. Если в программе можно установить и сбросить этот флаг, значит команда CPUID данным процессором поддерживается. В противном случае, выполнение данной команды может вызвать особую ситуацию #UD (Неопределенный код операции). Ниже приведен пример программы, определяющей поддержку команды CPUID.

 

pushfd             ; EFLAGS копировать в стек

pop eax            ; выбрать в EAX содержимое стека

mov ebx, eax    ; сохранить выбранное значение флагов

xor eax, 200000h   ; изменить бит 21 в выбранном значении флагов

push eax           ; поместить новое значение флагов в стек

popfd              ; выбрать в EFLAGS из стека новые значения флагов

pushfd             ; EFLAGS копировать в стек

pop eax            ; выбрать в EAX содержимое стека

xor eax, ebx    ; сравнить считанное новое значение флагов с сохраненным ранее

je no_cpuid        ; переход, eсли бит 21 не изменился

 

Следующим обязательным шагом должна быть команда CPUID со входным занчением EAX = 0, позволяющая определить — какие входные значения поддерживает данный процессор. Помимо этого, интерпретация битов поддерживаемых свойств в регистре EDX (при входном значении EAX = 1) должна производиться только после анализа информации о производителе и модели микропроцессора, т.к. существуют некоторые отличия как по количеству, так и по назначению некоторых битов в разных моделях процессоров.

Использование информации, выдаваемой командой CPUID с входным EAX = 1 в прикладных задачах необходимо, например, для определения поддержки команд MMX. Это может быть сделано следующим образом.

 

mov eax,1          ; установка входного значения EAX=1

CPUID              ; выполнение функции

test edx, 800000   ; проверка 23-го бита

jnz YES_MM         ; переход, если MMX поддерживается

 

Аналогично, но с использованием расширенной функции CPUID, определяется поддержка 3DNow! команд в процессорах AMD (K6) и IDT (WinChip 2).

 

...

[проверка поддержки CPUID]

[проверка поддержки расширенных

функций – CPUID (EAX = 80000000h)]

...

mov eax,80000001h    ; установка входного значения EAX=8000_0001h

CPUID                ; выполнение расширенной функции

test edx,80000000h   ; проверка 31-го бита

jnz YES_3DNow!       ; переход, если 3DNow! поддерживается

 

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

Во мнигих микропроцессорах некоторые свойства и функции могут быть программно отключены путем программирования специальных регистров модели (MSR), которые для каждого микропроцессора различны (см. технические описания для каждой конкретной модели). В этом случае результат действия стандартных функций команды CPUID также изменяется — процессор индицирует поддержку только включенных функций. Более того, в некоторых процессорах можно программно отключить поддержку самой команды CPUID. Тогда, при попытке ее выполнения, будет генерироваться особая ситуация #UD (Неопределенный код операции).

 


Входит в группу команд: Базовая система команд CPU



Все права защищены © 1997-2011 Перепечатка возможна только по согласованию с владельцем авторских прав. admin@club155.ru

Яндекс.Метрика               Сервер радиолюбителей России - схемы, документация,

 соревнования, дипломы, программы, форумы и многое другое!   схемы новости электроники