Главная » Комплектуючі та аксесуари » Что такое код процессора. Идентификация процессоров пользовательскими программами

Что такое код процессора. Идентификация процессоров пользовательскими программами

Рассмотрим возможности идентификации процессоров разных поколений. Программам, загружаемым операционной системой, да и самой ОС информация о процессоре из регистра EDX недоступна (аппаратный сброс был слишком давно). Задача идентификации осложняется тем, что поколение процессора заранее неизвестно. Когда появился процессор 80286, его (и все последующие) отличали от 8086/88 по значениям, сохраняемым в стеке инструкцией PUSH SP: первые процессоры сначала декрементировали указатель стека, а потом его сохраняли. Для идентификации процессоров, начиная еще с 16-разрядных, рекомендуется анализ значения регистра флагов, сохраненного по инструкции PUSHF после попытки его изменения. Приведем параметры регистра флагов в том порядке, в каком их анализируют при идентификации типа:
  • У процессоров 8086/88 биты 12–15 всегда установлены — попытка их сброса не удается;
  • У 80286 в реальном режиме биты 12–15 всегда сброшены;
  • У 32-разрядных процессоров в реальном режиме бит 15 всегда сброшен, а биты с 12–14 хранят последнее загруженное в них значение. В защищенном режиме бит 15 всегда сброшен, а бит 14 хранит последнее загруженное в него значение (биты 12, 13 можно изменить только при IOPL=0).
Для 32-разрядных процессоров анализируется EFLAG:
  • Бит 18 доступен, начиная с процессоров 486, — у 80386 его невозможно изменить;
  • Биты 19 (VIF) и 20 (VIP) у процессоров, не поддерживающих расширения виртуального режима (VME) всегда нулевые;
  • Бит 21 (ID) определяет возможность использования инструкции CPUID. Признаком доступности инструкции является возможность программного изменения значения этого бита.

Для определения присутствия сопроцессора выполняют инструкцию FNINIT, после чего исполняют инструкцию FNSTENV и проверяют корректность образа сопроцессора, сохраненного в памяти. Тип сопроцессора обычно определяется типом CPU, кроме процессора 80386, который может работать как с 80287, так и с 80387. Их различить можно по способу представления +бесконечность и –бесконечность: у 287 они одинаковы, у 387 — различны.

Инструкция CPUID. доступная, начиная с Pentium и некоторых моделей 486, вызывается с параметром, указанным в регистре EAX. Значение EAX при вызове CPUID. указанные в скобках, определяет функцию вызова:

  • CPUID (0) — в регистре EAX возвращается максимально допустимое значение параметра вызова; в регистрах EBX, EDX и ECX процессор возвращает символьную строку, специфичную для производителя. Символы строки размещаются в регистрах в указанном порядке, начиная с младших байт.
Процессоры Intel возвращают строку "GenuineIntel":
  • EBX=756E6547h — "Genu", символ "G" в регистре BL,
  • EDX=49656E69h — "ineI", символ "i" в регистре DL,
  • ECX=6C65746Eh — "ntel", символ "n" в регистре CL.
Процессоры AMD возвращают строку "AuthenticAMD":
  • EBX=68747541h
  • ECX=444D4163h
  • EDX=69746E65h
  • CPUID (1) — в младшем слове регистра EAX процессор возвращает код идентификации (см. таблицу 1 ) он же сигнатура процессора и старший элемент 96-битного серийного номера. Это же значение содержится в регистре DX после аппаратного сброса:
    • EAX[3:0] — степпинг;
    • EAX[7:4] — модель;
    • EAX[11:8] — семейство;
    • EAX[13:12] — тип;
    • EAX[31:14] — зарезервировано (0);
    • Регистры EBX=0, ECX=0 (резерв).
    • Регистр EDX содержит список имеющихся расширений базовой архитектуры — отображает регистр свойств (Feature Flags register). Назначение бит регистра приведено в таблице 2 .
  • CPUID (2) — в регистрах EAX, EBX, ECX, EDX возвращаются параметры конфигурации процессора. Младшие 8 бит EAX сообщают, сколько раз нужно подряд вызвать инструкцию (с EAX=2) для получения полной информации о процессоре. Остальные байты регистра EAX и других регистров содержат дескрипторы отдельных узлов, которые расшифровываются по специальным таблицам. Признаком использования каждого из регистров EAX, EBX, ECX, EDX является нуль в его бите 31.

    Вызов CPUID (2) появился с процессорами 6-го поколения. Пока что по нему сообщаются только дескрипторы элементов кэширования (таблица 3 ). Например, для Pentium Pro по CPUID (2) возвращается EAX=03020101h, EBX=0, ECX=0, EDX=06040A42h. Это означает, что вызов нужно делать однократно (AL=1); TLB инструкций для страниц 4К имеет 32 вхождения (01h), для страниц 4М — 2 вхождения; TLB данных для страниц 4К на 64 вхождения (03h), для страниц 4М — на 8 вхождений (04h); первичный кэш инструкций — 8К (06h), данных — 8К (0Ah); вторичный кэш 256К (42h). CPUID (3) — получение младших 64 бит серийного номера процессора (Intel Processor Serial Number), доступно начиная с Pentium III (семейство 6, модель 7 и старше). EDX — средние 32 бита идентификатора; ECX — младшие 32 бита идентификатора. Полный идентификатор имеет длину 96 бит. Старшие 32 бита — код идентификации процессора, возращаемый в EAX по CPUID (1). Доступность вызова определяется по биту PN регистра свойств (после CPUID (1) бит EDX.18=1). После аппаратного сброса у процессоров, поддерживающих сообщение идентификатора, этот вызов разрешен. Запретить сообщение идентификатора до следующего аппаратного сброса можно установкой в единицу бита 21 регистра. Фрагмент программы на ассемблере для запрета сообщения номера приведен ниже. После запрета бит PN обнуляется. Снова разрешить сообщение номера программно невозможно, повторное разрешение возможно только через аппаратный сброс (по сигналу RESET, но не INIT#).

  • Вызовы инструкций CPUID с EAX>3 (в пределах разрешенного значения, сообщенного процессором при вызове CPUID (0) зарезервированы для будущих применений.

    Фирма AMD расширила вызовы CPUID. Для проверки наличия расширений вызывается CPUID с EAX=8000_0000h. При наличии расширений в EAX результатом будет число, большее 8000_0000h, — максимальный параметр расширенного вызова. Вызовом EAX=8000_0001h можно определить специфические расширения архитектуры от AMD. Например, поддержка 3DNow! определяется по установленному биту 31 регистра EDX.