logo
несколько программ / bsp33

Команда cpuid

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

CPU_ID MACRO

db 0fh

db 0a2h

ENDM

Как работает команда CPUID?

Перед вызовом этой команды необходимо загрузить в регистр EAX значение, которое определяет выполняемые действия. В первый раз вы должны вызвать команду CPUID, загрузив предварительно в регистрEAX нулевое значение:

mov eax, 00h

CPU_ID

Команда вернет в регистре EAX максимальное значение, которое можно передавать командеCPUID для определения выполняемых действий. Кроме того, в регистрахEBX, ECX иEDX будут находиться байты текстовой строки описания фирмы-изготовителя процессора. Для процессоровIntel это будет строкаGenuineIntel.

Следующая последовательность команд перепишет эти байты в буфер _vendor_id_msg в формате, пригодном для вывода на консоль средствами BIOS:

_vendor_id_msg db "............", 0dh, 0ah, "$"

. . .

mov dword ptr _vendor_id_msg, ebx

mov dword ptr _vendor_id_msg[+4], edx

mov dword ptr _vendor_id_msg[+8], ecx

Для определения модели процессора следует вызвать команду CPUID, загрузив предварительно в регистрEAX значение 1:

mov eax, 1

CPU_ID

При этом в регистр EAX будет загружено слово сигнатуры, по которому можно определить модель процессора, а в регистрEDX – слово, состоящее из отдельных флагов, характеризующих возможности процессора (feature flags). РегистрыEBX иECX зарезервированы для моделей процессоров, которые будут разработаны в будущем.

Ниже приведен фрагмент кода, в котором слово сигнатуры и слово возможностей записываются в переменные _cpu_signature и _features_edx для дальнейшего анализа:

_cpu_signature dd 0

_features_edx dd 0

. . .

mov _cpu_signature, eax

mov _features_edx, edx

Рассмотрим формат слова сигнатуры, возвращаемое командой CPUID в регистреEAX:

Биты

Описание

0-3

Код модификации модели (stepping)

4-7

Код модели

8-11

Код семейства моделей

12-13

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

14-31

Зарезервировано

Слово сигнатуры состоит из отдельных полей, назначение которых будет описано ниже.

Биты 12 и 13 определяют тип процессора:

Значение битов 12 и 13

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

00

Процессор, изготовленный производителем OEM

01

Процессор OverDrive

10

Процессор типа Dual, который можно использовать в двухпроцессорных системах

11

Зарезервировано

Заметим, что многопроцессорные системы могут быть построены не только на базе процессоров типа Dual, но и на обычных процессорах.

Ниже мы привели таблицу, с помощью которой по содержимому трех полей слова сигнатуры (тип процессора, код семейства и код модели) можно распознать процессор:

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

Код семейства

Код модели

Описание процессора

00

0100

0100

Intel 486 SL

00

0100

0111

Intel DX2

00

0100

1000

Intel DX4

00, 01

0100

1000

Intel DX4 OverDrive

00

0101

0001

Pentium 60, 66;

Pentium OverDrive для процессоровPentium 60, 66

00

0101

0010

Pentium 75, 90, 100, 120, 133, 150, 166, 200

01

0101

0010

Pentium OverDrive для процессоров Pentium 75, 90, 100, 120, 133

01

0101

0011

Pentium OverDrive для систем на базе процессораIntel 486

00

0101

0100

Pentium 166, 200 с командамиMMX

01

0101

0100

Зарезервировано. Будет использоваться процессорами Pentium OverDrive для процессоров Pentium 75, 90, 100, 120, 133

00

0110

0001

Pentium Pro

00

0110

0011

Pentium II

00

0110

0101

Зарезервировано для новых процессоров P6

01

0110

0011

Зарезервировано для процессоров Pentium OverDrive для процессоров Pentium Pro

Что же касается кода модификации модели (stepping), то он определяет изменения в процессоре. Вы найдете описания этих кодов для процессораPentium в руководствеPentium Processor Specification Update, который можно приобрести в фирмеIntel.

Приведем описание битов, возвращаемых командой CPUIDв регистреEDX. Напомним, что это слово состоит из отдельных флагов, характеризующих возможности процессора (feature flags).

Бит

Описание

0

На кристалле процессора имеется арифметический сопроцессор, совместимый по командам с сопроцессором Intel 387

1

Процессор может работать в режиме виртуального процессора 8086

2

Процессор может работать с прерываниями ввода/вывода, а также с битом DE регистраCR4

3

Возможно использование страниц памяти размером 4 Мбайт

4

В процессоре есть команда RDTSC, которая может работать с битомTSD регистраCR4

5

Набор регистров процессора, специфический для модели, доступен с помощью команд RDMSR, WRMSR

6

Возможна физическая адресация памяти с использованием шины с шириной, большей чем 32 разряда

7

В процессоре реализовано исключение Machine Check(исключение с номером 18). Возможно использование битаMCE регистраCR4

8

В процессоре реализована команда сравнения и обмена 8 байт данных CMPXCHG8

9

В процессоре есть локальный APIC

10

Зарезервировано

11

В процессоре реализованы команды быстрого вызова системы SYSENTER иSYSEXIT

12

В процессоре есть регистры Memory Type Range

13

Доступен глобальный бит в PDE иPTE, а также битPGE в регистреCR4

14

Применена архитектура Machine Check Architecture

15

В процессоре реализованы команды условного перемещения данных CMOVCC и (при установленном бите 0)FCMOVCC иFCOMI

16-22

Зарезервировано

23

Применена технология MMX

24-31

Зарезервировано

Еще одно применение для команды CPUID – определение характеристик кэша, установленного в процессоре. Для этого перед вызовом командыCPUID в регистрEAX необходимо загрузить значение 2. Подробное изучение этой возможности выходит за рамки нашей книги. При необходимости вы узнать все подробности о командеCPUID на сервереIntel в сетиInternet по указанному нами ранее адресу.