DOSUG CZ– розовая кнопка на сайте!
Logo

Определение типа процессора

Согласитесь, есть много причин для того, чтобы вашей программе знать о типе процессора, на которой она работает. Например, ваша программа может использовать инструкции, работающие лишь на некоторых моделях процессоров, или в зависимости от типа процессора загружать соответствующую DLL с кодом, оптимизированным для этого процессора. В любом случае вы должны правильно определить производителя, модель, и, что более важно, поддерживаемые функции и особенности процессора. В этой статье описаны приемы и методы, с помощью которых вы легко (и главное, правильно) определите тип процессора и будет предложен класс C++ , который поможет вам в этом, реализуя набор функций, определяющих большинство практически интересующих параметров процессоров от производителя до тактовой частоты. Конечно, DLL - наиболее подходящее место для реализации этого класса, но это будет уже вашим заданием.

Как определяется процессор и функции, им поддерживаемые

Определение модели процессора и FPU (если FPU присутствует) на компьютерах до Intel 486 основывалось на определении архитектурных особенностей процессора, плюс с очень большой достоверностью можно было предполагать, что это процессор Intel. Определение процессора на компьютере, где установлена ОС Windows немного легче, чем обычно - процессор должен быть как минимум 386 из-за того, что Win32 работает только в защищенном режиме, поэтому код процедуры определения может быть полностью 32-битным. Поэтому в статье не рассматривается определение процессоров слабее 386. Тем из вас, кто все же хочет определить 8086/8088 процессоры можно сказать, что биты 12-15 регистра флагов FLAGS (вы еще помните 16-битные регистры?) в этих моделях всегда установлены , а на 286 в реальном режиме эти биты сброшены.

Различие между 386 и 486 процессорами заключается в том, что в 486 в регистре флагов EFLAGS есть бит выравнивания AC (бит 18). Бит был добавлен в 486 и не может быть установлен на 386 процессоре. Если вы выяснили, что работаете на 486 процессоре, не забудьте восстановить регистр EFLAGS. Это показано в следующем фрагменте кода:

pushfd
pop eax        // читаем EFLAGS
mov ebx,eax    // сохраняем EFLAGS
xor eax,40000h // переключаем бит AC в EFLAGS
push eax       // сохраняем в стеке
popfd          // загружаем в EFLAGS
pushfd         // заталкиваем EFLAGS в стек
pop eax        // опять читаем EFLAGS
xor eax,ebx    // проверяем бит AC
mov CPU, 386   // процессор - 386
je End_Detect  // Если бит сброшен - определяемый процессор - 386 и выход
mov CPU, 486   // процессор - 486
push ebx       // восстанавливаем EFlags
popfd
..
.. проверяем более старшие версии CPU с помощью CPUID, и т.д.
..

В 486 процессоре впервые появилась сигнатура, из которой можно вычислить модель и степпинг процессора, отсюда же можно вычислить поддерживаемые функции. Единственная проблема состоит в том, что эта сигнатура записывается в регистр EDX после перезагрузки компьютера и теряется, если BIOS не сделает ее копию. Некотрые BIOS имеют возможность считать сигнатуру или сохраняют ее в определенном месте сегмента данных BIOS, однако это мало помогает, если наше приложение работает под Windows. Данные, которые можно извлечь из этой сигнатуры, следующие:

Формат сигнатуры, записываемой в регистр EDX

Степпинг: Биты 0 - 3 Семейство и модель процессора

Модель: Биты 4 - 7 Модель семейства, например, Pentium III

Семейство: Биты 8 - 11 Архитектурное семейство, все процессоры Pentium II и III семейства 6

Тип: Биты 12 - 13 Тип процессра - OEM или OverDrive и т.д.

Замечание: В статье не используется определение типа процессора по полю типа, т.к. Pentium Overdrive (Type 01) для процессоров Pentium идентифицируется по этому полю как процессоры OEM (Type 00), поэтому эти процессоры будут определяться как стандартные процессоры Pentium. Pentium Overdrive для процессоров 486 не имеют такой проблемы. 486 Pentium Overdrive определяются по их уникальному степпингу.

Самые поздние модели 486 процессоров решают проблему с сигнатурой с помощью новой инструкции CPUID, которая среди прочей информации возвращает сигнатуру процессора, что дает возможность в любое время определить его тип. Для определения, поддерживает ли исследуемый процессор инструкцию CPUID, попробуйте изменить бит ID регистра EFLAGS (бит 21). Если бит изменяет свое состояние, инструкция CPUID доступна. Очень важно сначала определить, что процессор не слабее 486, т.к. этот бит может быть изменен и на 386, который не поддерживает инструкцию CPUID, а попытка вызвать инструкцию вызовет исключение "Invalid opcode". Позже мы более подробно остановимся на инструкции CPUID, вам нужно лишь знать, что без этой инструкции и без сигнатуры, полученной после презагрузки, единственное, что мы можем определить - используется ли 386 или 486 процессор и ничего не можем сказать о его модели или степпинге.

Определение присутствия математического сопроцессора (FPU) в настоящий момент кажется несущественной, однако желательно всегда проверять присутсвие FPU. 486 процессор был первым процессором, имеющим встроенный FPU, и то только в моделях DX. Модель SX не имеет встроенного сопроцессора, но имеет возможность подключить внешний 80487 сопроцессор для операций с плавающей точкой. Поэтому даже если определен 486 процессор, то нет оснований предполагать, что есть FPU. Первым процессором, где можно с уверенностью предполагать присутствие FPU был Pentium.

 
главная - о проекте - контакты - реклама на сайте
 
LBN100 Elite

SoftStudio.Ru - студия разработки программ
LBN100 Elite