ISSN 0236-235X (P)
ISSN 2311-2735 (E)

Journal influence

Higher Attestation Commission (VAK) - К1 quartile
Russian Science Citation Index (RSCI)

Bookmark

Next issue

2
Publication date:
16 June 2024

The article was published in issue no. № 3, 2003
Abstract:
Аннотация:
Authors: Kalabin, A.L. (alex.ka.86@gmail.com) - Tver State Technical University, Tver , Russia, Ph.D, () -
Ключевое слово:
Page views: 29129
Print version
Full issue in PDF (13.63Mb)

Font size:       Font:

Для квалифицированного и эффективного использования персонального компьютера важно знать:

-         тип процессора;

-         частоту процессора для одинаковой временной задержки на разных компьютерах, а также для настройки работы программы, исходя из частоты и типа процессора;

-         работает ли процессор в штатном или «разогнанном» режиме;

-         может ли данный процессор выполнить ту или иную инструкцию: например, если часть программы оптимизирована под MMX или SSE, то перед выполнением этой оптимизированной части важно убедиться в том, что процессор поддерживает эту технологию.

Такая информация также необходима для выявления систематических проблем, связанных с работой приложений на различных процессорах, так как многие коммерческие приложения при возникновении ошибки отправляют информацию о системе и коде ошибки в службу поддержки, которая в том числе анализирует влияние типа процессора и его характеристик на возникшую ошибку, а также для полной информации о процессоре.

Существует множество программ и методик определения характеристик процессора, но они, на наш взгляд, имеют следующие основные недо- статки:

-         в них не предусмотрено появление новых процессоров и новых технологий;

-         использование их ограничено из-за не полноты их описания;

-         большинство подобных программ ориентируется при определении процессора на его сигнатуру (семейство, модель, степпинг) и на объем кэш-памяти второго уровня, что не всегда является верным, поскольку может приводить к неоднозначному и неверному определению типа процессора для новых моделей, в которых объем кэш-памяти может измениться;

-         использование MSR-регистров для этих целей должным образом не документировано.

Предлагаемая нами методика направлена на решение этих проблем.

Для определения типа процессора используется инструкция CPUID, которая определяет:

-         производителя процессора;

-         поддержку процессором соответствующих технологий;

-         информацию о типе и размере кэш-памяти 1-го, 2-го и 3-го уровней процессора, а также информацию о TLB-буферах процессора;

-         название процессора и его частоту (в некоторых случаях);

-         дату выпуска и партию (только для процессоров Transmeta).

Для использования этой инструкции проверяется, поддерживается ли она тестируемым процессором. Это определяется возможностью программного изменения 21-го бита регистра EFLAGS, которое свидетельствует о поддержке процессором инструкции CPUID [3,4,7].

Следующим шагом является запуск CPUID (при eax=0). Это позволяет узнать производителя и количество поддерживаемых стандартных уровней инструкции CPUID. Далее необходимо последовательно выполнить CPUID для этих уровней и сохранить всю полученную информацию. Затем выполняется CPUID (при eax=80000000h), что позволяет выявить, поддерживаются ли дополнительные уровни CPUID, и, если они поддерживаются, последовательно выполнить CPUID для дополнительных уровней и сохранить всю полученную информацию. В случае если процессор поддерживает специальные уровни CPUID, надо проделать такую же последовательность действий, как для стандартных и дополнительных уровней.

Название процессора в общем случае определяется в порядке приоритетности следующим образом.

1.        Определятся производитель процессора, в основном с помощью инструкции CPUID при eax=0 (строка названия производителя записывается в регистры ebx, edx, ecx).

2.        Название процессора пытаемся извлечь из Brand String (строка названия процессора содержится в регистрах eax, ebx, ecx, edx после выполнения инструкции CPUID при eax=0x80000002h, eax=0x80000003h, eax=0x80000004h), она поддерживается, если инструкция CPUID при eax=0x80000000h возвращает в eax число не меньше 0x80000004h.

3.        Если Brand String не поддерживается, то проверятся Brand ID. Ненулевое значение Brand ID свидетельствует о поддержке Brand ID. Тогда по таблицам значений Brand ID для соответствующего производителя идентифицируется тип процессора.

4.        Иначе определятся тип процессора по его сигнатуре (битовому массиву, содержащему информацию о семействе, модели, степпинге). При этом необходимо также учитывать и производителя, так как некоторые процессоры, например, Celeron, Pentium II могут иметь одинаковую сигнатуру, то надо сравнивать размер кэш-памяти второго уровня с известными для данных моделей размерами, однако, например, процессор Penti- um III и Xeon (модель 7), а также Pentium II и Xeon (модель 5) могут иметь одинаковый размер кэш-памяти, и в этом случае их стоит различать по типу упаковки. Тип упаковки можно узнать из MSR-регистра процессора.

Для определения частоты процессора в общем случае надо:

1) выяснить, поддерживает ли процессор TSC 64-битный счетчик реального времени, для чего проверяется бит 4 регистра edx после выполнения инструкции CPUID с параметром 1;

2) если процессор работает с этим счетчиком, то необходимо получить текущее значение счетчика с помощью инструкции rdtsc (ReaD from Time Stamp Counter); при этом 64-битное значение счетчика помещается в регистры edx и eax;

3) после этого сделать задержку в течение определенного промежутка времени (это наиболее сложная часть определения частоты процессора);

4) считать новое значение счетчика с помощью инструкции rdtsc;

5) вычислить разность первоначального значения счетчика и конечного;

6) получить частоту в мегагерцах, разделив разность на время задержки в микросекундах.

Вследствие сложности выполнения точной и короткой задержки приведенная схема вычисления частоты усложняется. Конкретная методика зависит от операционной системы. Для операционной системы Windows на период работы со счетчиками настоятельно рекомендуется установить для потока и процесса, в которых производится измерение, самый высокий приоритет: для процесса (REALTIME_PRIORITY_CLASS) и для потока (THREAD_PRIORITY_TIME_CRITICAL). Для многопроцессорных систем с помощью функции API SetThreadAffinityMask надо назначить процессор, который один будет задействован в работе этого процесса и потока, чтобы избежать влияние на вычисление частоты многопроцессорности. Функции Win32 API, которые также могут понадобиться для вычисления задержки QueryPerformance- Counter, QueryPerformanceFrequency, подробно описаны в [5].

MSR-регистры (Model Specific Register – модельно-зависимый регистр микропроцессора) впервые появились в архитектуре микропроцессора Pentium как средство мониторинга производительности. MSR-регистры относятся к модельно-зависимому слою архитектуры процессора. Наличие и назначение этих регистров по определению зависит от конкретной модели процессора, что, в свою очередь, не гарантирует их поддержку будущими процессорами. MSR-регистры обеспечивают управление различными аппаратными и программно-зависимыми средствами (счетчики мониторинга производительности, расширения отладки, поддержка исключения машинной ошибки и архитектуры машинного контроля (MCA), регистры MTRR для поддержки расширенных средств кэширования и т.п.) [1,2].

Для чтения значения этих регистров предусмотрена команда rdmsr (ReaD from Model Specific Register). Адрес регистра определяется содержимым регистра ecx до выполнения инструкции rdmsr. Результат операции помещается в пару регистров edx:eax. Для доступа к MSR-регистрам необходимо обеспечить нулевой уровень привилегий. Этого можно достигнуть в MS DOS или с помощью специального драйвера для Windows (причем для Win9x этот драйвер будет отличен от драйвера для WinNT, 2000, XP).

Наиболее полное описание MSR-регистров в процессорах компании Intel приведено в [6]. Однако это описание не является достаточно полным, так как в нем не расшифровывается умножитель системной шины процессора и тип упаковки процессора.

Авторами определено, что:

·   тип упаковки процессора зашифрован в битах 52-50 регистра IA32_PLATFORM_ID (адрес 17h);

·   умножитель для процессора Intel Pentium II, Pentium III зашифрован в битах 25-22 и в 27-м дополнительном бите регистра EBL_CR_POWERON (адрес 2Ah);

· умножитель для процессора Intel Pentium 4 с ядром Willamete (сигнатура < 0´0F20) зашифрован в битах 11-8 регистра MSR_EBC_HARD_POWERON (адрес 2Ah);

· умножитель для процессора Intel Pentium 4 с ядром Northwood и более поздних (сигнатура >= 0´0F20) зашифрован в битах 31-24 регистра MSR_EBC_FREQUENCY_ID (адрес 2Ch);

· умножитель для процессора AMD Athlon, Duron зашифрован в битах 27-24 и в 19-м дополнительном бите регистра MSR_K7_HWCR (адрес 0C0010015h);

· умножитель для процессора AMD K6 зашифрован в битах 3-0 MSR-регистра (адрес 0C0000087h).

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

· для Intel Pentium II, III – биты 19:18 регистра EBL_CR_POWERON, адрес 2Ah. (00b – 66 MHz, 10b – 100 MHz, 01b – 133 MHz);

· для Intel Pentium 4 (Willamete, модель < 2) – биты 23:21 регистра MSR_EBC_FREQUENCY_ID, адрес 2Ch. (000b – 100 MHz);

· для Intel Pentium 4 (новые, модель >= 2) – биты 18:16 регистра MSR_EBC_FREQUENCY_ID, адрес 2Ch. (000b – 100 MHz, 001b – 133 MHz, 010b – 200 MHz, 011b – 166 MHz).

После умножения получаем частоту, на которой должен работать процессор. Сравнивая ее с частотой, вычисляемой с помощью счетчика реального времени 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 c 800 MHz шиной и AMD Athlon (ядро Barton). Верно определены их тип и параметры. Это подтверждает работоспособность и приме- нимость предлагаемой методики для новых процессоров.

Представленная методика протестирована на определение процессоров, работающих во внештатном режиме.

Более детальное описание определения типа процессора и его характеристик, а также тестовую версию программы вы можете найти на сайте http://cpuid.nm.ru.

Авторы будут благодарны за присланные скриншоты работы программы для продолжения тестирования, а также за замечания и предложения по адресу: cpuid@nm.ru.

Список литературы

1.   Assembler / В. Юров. – СПб: Изд-во ”Питер”, 2000. – 624 с.: ил.

2.   Assembler: практикум / В. Юров. – СПб: Изд-во ”Питер”, 2003. – 400 с.

3.   AP-485, Intel® Processor Identification and the CPUID Instruction, November 2002, Order Number: 241618-022.

4.   AMD Processor Recognition Application Note Publication # 20734 Rev: 3.01 Issue Date: May 2003.

5.   MSDN Library October 2002.

6.   IA-32 Intel ® Architecture Software Developer’s Manual Volume 3: System Programming Guide, 2003, Order Number 245472-010.

7.   http://www.sandpile.org


Permanent link:
http://swsys.ru/index.php?page=article&id=630&lang=en
Print version
Full issue in PDF (13.63Mb)
The article was published in issue no. № 3, 2003

Perhaps, you might be interested in the following articles of similar topics: