Возможность программного определения типа процессора заложена в архитектуру 32-разрядных процессоров "отродясь". В любом процессоре сразу после аппаратного сброса в регистре (E)DX можно прочитать номер семейства (3 — 386, 4 — 486, 5 — Pentium, 6 — P6...), модели, типа и степпинга. Расшифровка основных полей приводится в таблице 1. Кроме перечисленных в таблице, имеется поле степпинга (биты 3:0) — номер версии процессора в пределах одной модели. Информацию этого поля, к сожалению, без таблиц изготовителя не расшифровать. Поле "тип" (биты 13:12) различает процессоры OEM-версий (00), OverDrive (01) и Dual (10); значение 11 зарезервировано. Наиболее интересная информация содержится в полях "семейство" (биты 11:8) и "модель" (биты 7:3). Старшие биты (14–31) регистра EDX пока не используются (они нулевые). Процессоры 80386 имели несколько иное назначение бит: поле "семейство" совпадает, поле "модель" занимает биты 15:11, биты 7:0 отводятся под степпинг. Для младших процессоров регистр DH содержит идентификатор процессора (01 — 8086/88, 02 —80286), DL — номер модели. Поле "модель" позволяет отличать, например, Pentium MMX от "просто" Pentium 75–233 МГц или Pentium 60–66 МГц, Celeron от Pentium II или Pentium Pro. По полю "тип" можно отличить, например, процессоры OverDrive. Поле "степпинг" без таблиц не расшифровать, оно несет информацию о нюансах — например, исправлены ли те или иные ошибки, возможный диапазон частот (определяется косвенно и не точно).
Вернуться к содержанию
Тип EDX[13:12] | Семейство EDX[11:8] | Модель EDX[7:4] | Процессор |
---|---|---|---|
Intel486DX | |||
Intel486DX | |||
Intel486SX | |||
Intel487, IntelDX2, IntelDX2 OverDrive, AMD DX2 в режиме WT | |||
IntelSXL | |||
IntelSX2 OverDrive | |||
IntelDX2 Enhanced в режиме WB, AMD DX2 в режиме WB | |||
IntelDX4 OverDrive, AMD DX4 в режиме WT | |||
AMD DX4 в режиме WB | |||
Am5x86 в режиме WT | |||
Am5x86 в режиме WB | |||
IntelDX4 OverDrive | |||
AMD K5-PR75, 90, 100 | |||
Pentium 60, 66 Pentium OverDrive для Pentium 60, 66 AMD K5-PR120, 133 | |||
Pentium 75, 90, 100, 120, 133, 150, 166, 200 AMD K5-PR166 | |||
Pentium OverDrive 75, 90, 100, 120, 133 | |||
Pentium OverDrive для 486 | |||
Pentium MMX (166, 200, 233) | |||
Зарезервировано (OverDrive для Pentium 75, 90, 100, 120, 133) | |||
Pentium Pro | |||
Pentium II первого поколения (233–300 МГц) | |||
Pentium II OverDrive | |||
Pentium II Desсhutes (333–450 МГц), Celeron (266, 300 МГц), Xeon | |||
Celeron 300A, 333–533 | |||
Pentium III и Pentium III Xeon | |||
Pentium III Coppermine, Pentium III Xeon, Celeron 533A, 566, 600 | |||
Начиная с процессоров Pentium появилась новая инструкция CPUID, по которой любая программа на любом уровне привилегий в любой момент времени могла получить ту же информацию, что и BIOS после сброса, и, вдобавок, 32-битный набор флагов расширений базовой архитектуры, реализованных в данном процессоре. Полученную информацию программа может использовать, например, для выбора исполняемого кода, оптимального для данного процессора (или отказа исполнения на "недостойном" ее процессоре), а также для настройки констант программных реализаций задержек. Инструкция CPUID была реализована и в ряде поздних моделей процессоров класса 486. Формат инструкции практически безгранично расширяем, с ее помощью процессор может выдавать хоть весь свой словесный портрет (если эту возможность заложат его разработчики). Однако информация для CPUID "зашивается" в процессор на этапе изготовления кристалла, что не позволяет, например, "выпытать" у процессора его официальную тактовую частоту (она определяется позже — на этапе тестирования уже готового процессора). А эта информация была бы полезна при борьбе с пиратским разгоном (перемаркировкой) процессоров, что, в общем-то, волнует изготовителя.
Следующий шаг, уже явно нацеленный на учет и контроль, был сделан в процессоре Pentium II Xeon. Здесь имеется специальная постоянная (только для чтения) память процессорной информации PIROM, которая хранит такие данные, как электрические спецификации ядра процессора и кэш-памяти (диапазоны частот и питающих напряжений), S-спецификацию (степпинг) и 64-битный серийный номер процессора. Кроме того, имеется энергонезависимая память Scratch EEPROM, которая предназначена для занесения системной информации поставщиком процессора (или компьютера с этим процессором) и может быть защищена от последующей записи. Для взаимодействия с PIROM и Scratch EEPROM (а также устройством термоконтроля) процессор имеет дополнительную последовательную шину SMBus (System Management Bus) — отдельный электрический интерфейс, с которым работает чипсет системной платы. Обращение к этим учетным данным получается довольно сложным — это целая процедура, привязанная к реализации чипсета, а не одна инструкция.
И, наконец, в Intel решили соединить всеобщий учет (и контроль) с простотой доступа: в процессор Pentium-3 ввели расширение инструкции CPUID, по которому легко можно получить 64-битный уникальный идентификатор данного процессора. Идентификатор процессора, по замыслу Intel, должен стать дополнительным средством аутентификации в сети Internet (и других сетях), наряду с именем пользователя и паролем, вводимыми вручную. Однако, если имя и пароль можно сменить в любое время, идентификатор присваивается навечно и принудительно, хотя имеется возможность запретить процессору сообщать свой идентификатор. Вот эта всеобщая инвентаризованность и вызвала бурю обсуждений прав на частную жизнь пользователей нового процессора. После жарких споров фирма Intel "идя навстречу пожеланиям трудящихся" постановила, что по умолчанию выдача идентификатора запрещена, а разрешается только с ведома пользователя. Как подчеркивает Intel, идентификатор сообщается пассивно, то есть компьютер с новым процессором, ОС и броузером не кричит на весь мир "я — номер такой-то!". Это естественно, поскольку для идентификации процессор должен исполнить фрагмент программного кода, в котором вызывается инструкция CPUID и интерпретируются ее результаты.
Для управления выдачей идентификатора в модельно-специфичном регистре BBL_CR_CTL (MSR 119h) выделяется запрещающий бит (бит 21). Он может быть установлен в "1" программно — с помощью инструкции обращения к MSR, и тогда по инструкции CPUID будет доступна только традиционная информация. Заметим, что инструкции обращения к MSR обычно привилегированы, т. е. могут выполняться только на уровне привилегий ядра ОС. По аппаратному сбросу процессора (и только так!) бит обнуляется, и полная идентификация разрешается. Декларированное "отключение по умолчанию" возлагается на ОС, и для Windows предлагается специальная утилита, опрашивающая значение бита MSR и управляющая его установкой, а также сообщающая прочитанный (по возможности) идентификатор. Для использования ОС, отличных от Windows, Intel рекомендует разработчикам BIOS включать фрагмент кода аналогичного назначения в BIOS Setup (здесь любое переключение будет требовать перезагрузки).
Основная информация о процессоре предоставляется по инструкции CPUID, доступность которой определяется через бит 21 (ID) регистра EFLAGS. По инструкции CPUID(0) можно определить производителя процессора и возможности данной инструкции. Вызов CPUID(1) сообщает сигнатуру процессора — тип, семейство, модель и степинг (таблица 1), а также список расширений архитектуры (таблица 2). Как видно из таблицы 1, одному и тому же сочетанию типа, семейства и модели может соответствовать несколько типов процессоров — например, Pentium-2 и Pentium-2 Xeon по ним неразличимы. Эти процессоры различаются элементами системы кэширования, и их можно распознать по дескрипторам (таблица 3), сообщаемым по CPUID(2). И, наконец, серийный номер процессора, если это позволено (см. ниже), можно узнать по CPUID(3). Серийный номер появился с процессорами Pentium 3 (он был введен еще в кристалл Celeron модели 6, но на конечном этапе производства эту возможность отключали).
Заметим, что здесь нигде в явном виде не фигурирует тактовая частота процессора — для каждой модели и степинга выпускаются процессоры с некоторым диапазоном тактовых частот, а конкретное значение обозначается на корпусе после отбраковочных испытаний. В процессорах Xeon "официальная" тактовая частота заносится в энергонезависимую память конфигурации, откуда может быть считана по интерфейсу SMBus. Доступ к этой памяти осуществляется по процедурам, определяемым чипсетом системной платы, но не по одной определенной инструкции процессора. Возможно, тактовую частоту можно определить и по серийному номеру процессора, но пока на это нет официальных указаний.
Идентификация процессора требуется на разных уровнях ПО. Первым делом идентификацию выполняет BIOS — для того, чтобы сообщить о найденных процессорах пользователю и выполнить необходимые настройки под конкретную модель и степинг процессора. Для процессоров 6-го поколения эта информация позволяет определить, какими ошибками (erratum) страдает данный процессор и какими "заплатками" эти ошибки нейтрализуются. Нейтрализация ошибок может выполняться как с помощью модификации микрокода процессора (update microcode), так и специфическими фрагментами программного кода для обработчиков прерываний и исключений. Эти "заплатки" могут входить как в операционные системы, так и в BIOS. Если конкретный процессор "не знаком" для BIOS или ОС, "заплатки" для него не будут загружены и возможны различные неожиданности при работе. В этом случае стоит позаботиться об обновлении BIOS (для флэш-BIOS это технически несложно) или приобретении загружаемых "заплат" для ОС.
В зависимости от обнаруженного процессора, ОС может использовать те или иные варианты реализации своих функций. ОС защищенного режима (а теперь иными практически и не пользуются) разрешает или запрещает те или иные архитектурные расширения (в основном записью в регистр CR4). Прикладным программам остается только согласиться с предлагаемым набором свойств процессора или отказаться от работы. Прикладные программы могут получать информацию о процессоре по инструкции CPUID при любом уровне привилегий, а привилегированные программы (PL=0) могут пользоваться и данными CR4.
Вернуться к содержанию
Рассмотрим возможности идентификации процессоров разных поколений. Программам, загружаемым операционной системой, да и самой ОС информация о процессоре из регистра EDX недоступна (аппаратный сброс был слишком давно). Задача идентификации осложняется тем, что поколение процессора заранее неизвестно. Когда появился процессор 80286, его (и все последующие) отличали от 8086/88 по значениям, сохраняемым в стеке инструкцией PUSH SP: первые процессоры сначала декрементировали указатель стека, а потом его сохраняли. Для идентификации процессоров, начиная еще с 16-разрядных, рекомендуется анализ значения регистра флагов, сохраненного по инструкции PUSHF после попытки его изменения. Приведем параметры регистра флагов в том порядке, в каком их анализируют при идентификации типа:
Для 32-разрядных процессоров анализируется EFLAG:
Для определения присутствия сопроцессора выполняют инструкцию FNINIT, после чего исполняют инструкцию FNSTENV и проверяют корректность образа сопроцессора, сохраненного в памяти. Тип сопроцессора обычно определяется типом CPU, кроме процессора 80386, который может работать как с 80287, так и с 80387. Их различить можно по способу представления +бесконечность и –бесконечность: у 287 они одинаковы, у 387 — различны.
Инструкция CPUID, доступная, начиная с Pentium и некоторых моделей 486, вызывается с параметром, указанным в регистре EAX. Значение EAX при вызове CPUID, указанные в скобках, определяет функцию вызова:
Вызов 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#).
MOV ECX,119h
RDMSR ;загрузка значения MSR в EDX:EAX
OR EAX,00200000h ;модификация бита 21
WRMSR ;запись в MSR
Вызовы инструкций CPUID с EAX>3 (в пределах разрешенного значения, сообщенного процессором при вызове CPUID(0) зарезервированы для будущих применений.
Фирма AMD расширила вызовы CPUID. Для проверки наличия расширений вызывается CPUID с EAX=8000_0000h. При наличии расширений в EAX результатом будет число, большее 8000_0000h, — максимальный параметр расширенного вызова. Вызовом EAX=8000_0001h можно определить специфические расширения архитектуры от AMD. Например, поддержка 3DNow! определяется по установленному биту 31 регистра EDX.
Вернуться к содержанию
Бит | Название | Назначение |
---|---|---|
Floating Poin Unit — наличие математического сопроцессора | ||
Virtual-8086 Mode Enhancements — расширение режима V86 (виртуализация флага прерываний) | ||
Debugging Extensions — расширение отладки (возможность остановки по обращению к портам) | ||
Page Size Extension — возможность применения размера страницы в 4 Мбайт | ||
Time Stamp Counter — наличие счетчика меток реального времени | ||
Model Specific Register — поддержка модельно-специфических регистров в стиле Pentium (инструкции RDMSR, WRMSR) | ||
Physical Address Extension — возможность расширения физического адреса до 36 бит | ||
Machine Check Exception — поддержка исключения машинного контроля #MC | ||
Поддержка инструкции CMPXCHG8B | ||
Наличие встроенного программно-доступного контроллера прерываний APIC | ||
Зарезервировано | ||
SYSENTER Present — поддержка инструкций быстрых системных вызовов SYSENTER и SYSEXIT | ||
Memory Type Range Registers — наличие регистра управления кэшированием MTRRcap | ||
Page Global Enable — поддержка бит глобальности в элементах каталога и таблиц страниц, а также бита PGE в регистре CR4 | ||
Machine Check Architecture — поддержка архитектуры машинного контроля | ||
Conditional Move — поддержка инструкций условной пересылки CMOVcc, а если есть FPU, то и инструкций FCMOVCC и FCOMI | ||
Page Attribute Table — поддержка таблиц атрибутов страниц (PAT) | ||
36-bit Page Size Extension — возможность использования 36-битной физической адресации для страниц в 4 Мб | ||
Processor Number — поддержка сообщения 96-битного серийного номера по инструкции CPUID(3) | ||
Зарезервировано | ||
MMX | Поддержка MMX | |
FXSR | Fast floating point save and restore — поддержка инструкций быстрого сохранения и восстановления контекста FPU (инструкций FXSAVE и FXRSTOR). Указывает и на доступность индикатора использования этих инструкций операционной системой (CR4.OSFXSR) | |
XMM | Наличие блока XMM (поддержка новых инструкций расширения SSE) | |
– | Зарезервировано |
Нулевой дескриптор (в неиспользуемых байтах) | |
TLB инструкций: страницы 4К, 4WSA, 32 вхождения | |
TLB инструкций: страницы 4М, FA, 2 вхождения | |
TLB данных: страницы 4К, 4WSA, 64 вхождения | |
TLB данных: страницы 4М, 4WSA, 8 вхождений | |
Кэш инструкций (LI): 8К, 4WSA, размер строки 32 байта | |
Кэш инструкций (LI): 16К, 4WSA, размер строки 32 байта | |
Кэш данных (LI): 8К, 2WSA, размер строки 32 байта | |
Кэш данных (LI): 16К, 2WSA, размер строки 32 байта | |
Нет вторичного кэша | |
Вторичный кэш 128К, 4WSA, размер строки 32 байта | |
Вторичный кэш 256К, 4WSA, размер строки 32 байта | |
Вторичный кэш 512К, 4WSA, размер строки 32 байта | |
Вторичный кэш 1М, 4WSA, размер строки 32 байта | |
Вторичный кэш 2М, 4WSA, размер строки 32 байта |
где:
4WSA — четырехканальный наборно-ассоциативный кэш
FA — полностью ассоциативный кэш
Вернуться к содержанию
Источники информации: