Определяне на вида на процесора инеговите характеристики
Определяне на вида на процесора и неговите характеристики
За квалифицираното и ефективно използване на персонален компютър е важно да знаете:
- честота на процесора за едно и също времезакъснение на различни компютри, както и за настройка на програмата, въз основа на честотата и вида на процесора;
- дали процесорът работи в нормален или "овърклокнат" режим;
- дали даден процесор може да изпълни определена инструкция: например, ако част от програмата е оптимизирана за MMX или SSE, тогава преди изпълнението на тази оптимизирана част е важно да се уверите, че процесорът поддържа тази технология.
Такава информация е необходима и за идентифициране на системни проблеми, свързани с работата на приложения на различни процесори, тъй като много търговски приложения, когато възникне грешка, изпращат информация за системата и кода на грешката до услугата за поддръжка, която, наред с други неща, анализира влиянието на типа процесор и неговите характеристики върху възникналата грешка, както и за пълна информация за процесора.
Има много програми и методи за определяне на характеристиките на процесора, но според нас те имат следните основни недостатъци:
- те не предвиждат появата на нови процесори и нови технологии;
- използването им е ограничено поради непълнотата на описанието им;
- повечето от тези програми се ръководят от сигнатурата на процесора (семейство, модел, стъпка) и размера на кеша от второ ниво при определяне на процесора, което не винаги е вярно, тъй като може да доведе до двусмислено и неправилно определяне на типа процесор за нови модели, в които размерът на кеш паметта може да се промени;
- използването на MSR регистри за тези цели не е правилнодокументиран.
Предложеният метод е насочен към решаването на тези проблеми.
За определяне на типа процесор се използва инструкцията CPUID, която определя:
- поддръжка от процесора на подходящи технологии;
- информация за вида и размера на кеш паметта на 1-во, 2-ро и 3-то ниво на процесора, както и информация за TLB буферите на процесора;
- името на процесора и неговата честота (в някои случаи);
- дата на пускане и партида (само за процесори Transmeta).
За да използвате тази инструкция, се проверява дали се поддържа от тествания процесор. Това се определя от възможността за програмна промяна на 21-ия бит на регистъра EFLAGS, което показва, че процесорът поддържа инструкцията CPUID [3,4,7].
Следващата стъпка е да стартирате CPU >
Името на процесора обикновено се определя по ред на приоритет, както следва.
1. Определете производителя на процесора, като използвате главно инструкцията CPU >
2. Опитваме се да извлечем името на процесора от низа на марката (низът на името на процесора се съдържа в регистрите eax, ebx, ecx, edx след инструкцията CPU >
3. Ако низът на марката не се поддържа, ще се провери ID на марката. Отлично от нула Brand ID показва поддръжка на Brand ID. След това, според таблиците на стойностите на ID на марката за съответния производител, се идентифицира типът на процесора.
4. В противен случай типът на процесора ще се определя от неговата сигнатура (битов масив, съдържащ информация за семейството, модела, степинга). В този случай е необходимо да се вземе предвид и производителят, тъй като някои процесори, например Celeron, Pentium II, може да имат същия подпис, тогава е необходимо да сравните размера на L2 кеша с размерите, известни за тези модели, нонапример процесорите Pentium III и Xeon (модел 7) и Pentium II и Xeon (модел 5) може да имат еднакъв размер на кеша, в който случай те трябва да се различават по типа на опаковката. Типът на опаковката може да бъде намерен в MSR регистъра на процесора.
За да определите честотата на процесора в общия случай, трябва:
1) разберете дали процесорът TSC поддържа 64-битов брояч в реално време, за който се проверява бит 4 от регистъра edx след изпълнение на инструкцията CPUID с параметър 1;
2) ако процесорът работи с този брояч, тогава е необходимо да получите текущата стойност на брояча, като използвате инструкцията rdtsc (ReaD от Time Stamp Counter); в този случай 64-битовата стойност на брояча се поставя в регистрите edx и eax;
3) след това направете забавяне за определен период от време (това е най-трудната част от определянето на честотата на процесора);
4) прочетете новата стойност на брояча с помощта на инструкцията rdtsc;
5) изчисляване на разликата между началната стойност на брояча и крайната;
6) вземете честотата в мегахерци, като разделите разликата на времето на забавяне в микросекунди.
Поради трудността да се извърши точно и кратко забавяне, горната схема за изчисляване на честотата става по-сложна. Конкретната техника зависи от операционната система. За операционната система Windows, за периода на работа с броячи, силно се препоръчва нишката и процесът, в който се извършва измерването, да бъдат зададени с най-висок приоритет: за процеса (REALTIME_PRIORITY_CLASS) и за нишката (THREAD_PRIORITY_TIME_CRITICAL). За многопроцесорни системи, използващи функцията SetThreadAffinityMask API, е необходимо да се зададе процесор, който сам ще участва в работата на този процес и нишка, за да се избегне повлияване на изчисляването на честотата на многопроцесорната обработка. Win32 API функции, коитоможе да са необходими и за изчисляване на забавянето QueryPerformance-Counter, QueryPerformanceFrequency, са описани подробно в [5].
MSR-регистрите (Model Specific Register - зависим от модела микропроцесорен регистър) за първи път се появяват в архитектурата на микропроцесора Pentium като средство за наблюдение на производителността. MSR регистрите принадлежат към зависимия от модела слой на процесорната архитектура. Наличието и предназначението на тези регистри по дефиниция зависи от конкретния модел процесор, което от своя страна не гарантира поддръжката им от бъдещи процесори. Регистрите MSR осигуряват управление на различни инструменти, зависими от хардуера и софтуера (броячи за наблюдение на производителността, разширения за отстраняване на грешки, поддръжка за изключване на машинни грешки и архитектура за управление на машината (MCA), MTRR регистри за поддръжка на разширени средства за кеширане и др.) [1,2].
За четене на стойността на тези регистри е предоставена командата rdmsr (ReaD от специфичен за модела регистър). Адресът на регистъра се определя от съдържанието на регистъра ecx преди изпълнението на инструкцията rdmsr. Резултатът от операцията се поставя в регистровата двойка edx:eax. За достъп до MSR регистрите трябва да предоставите нулево ниво на привилегии. Това може да се постигне в MS DOS или с помощта на специален драйвер за Windows (още повече, че за Win9x този драйвер ще бъде различен от драйвера за WinNT, 2000, XP).
Най-пълното описание на MSR регистрите в процесорите на Intel е дадено в [6]. Това описание обаче не е достатъчно пълно, тъй като не дешифрира умножителя на системната шина на процесора и типа на пакета на процесора.
Авторите установиха, че:
За процесорите на Intel е възможно да се определи номиналната тактова честота, на която трябва да работи, дори ако процесорът работи в свободен режим. ЗаЗа да направите това, трябва да получите коефициента на умножение и да го умножите по честотата на системната шина, получена от MSR регистрите:
След умножението получаваме честотата, на която трябва да работи процесорът. Сравнявайки го с честотата, изчислена с помощта на TSC брояча в реално време, както е показано по-горе, можем да заключим дали процесорът работи в нормален или ненормален режим.
Предложеният метод е софтуерно реализиран и тестван на следните процесори: Intel Pentium, Intel Pentium MMX, Intel Pentium II, Intel Pentium III, Intel Pentium 4, Intel Celeron (PII, PIII и P4), AMD 486DX4, AMD Athlon (включително мобилни), AMD Duron, AMD-K6 3D. Тестването беше извършено и върху процесори Intel Pentium 4 с 800 MHz шина и AMD Athlon (ядро Barton), появили се след края на разработката. Типът и параметрите им са правилно определени. Това потвърждава ефективността и приложимостта на предложения метод за нови процесори.
Представената техника е тествана за идентифициране на процесори, работещи в режим на свободна практика.
По-подробно описание на дефиницията на типа процесор и неговите характеристики, както и тестова версия на програмата можете да намерите на http://cpuid.nm.ru.
1. Монтажник / В. Юров. - Санкт Петербург: Издателска къща "Петър", 2000. - 624 с.: ил.
2. Асемблер: работилница / В. Юров. - Санкт Петербург: Издателска къща "Петър", 2003. - 400 с.
3. AP-485, Идентификация на процесор Intel® и инструкция за CPUID, ноември 2002 г., номер на поръчка: 241618-022.
4. Бележка за приложението за разпознаване на AMD процесор, публикация # 20734 Рев.: 3.01 Дата на издаване: май 2003 г.
5. MSDN библиотека октомври 2002 г.
6. IA-32 Ръководство за разработчици на софтуер за архитектура Intel®, том 3: Ръководство за системно програмиране, 2003 г., номер на поръчка 245472-010.