Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
33_Metodicheskie_ukazania_po_laboratornym_rabot...doc
Скачиваний:
0
Добавлен:
07.01.2020
Размер:
706.56 Кб
Скачать

116

Министерство образования Республики Беларусь

Гомельский государственный университет им. Ф. Скорины

Физический факультет

Кафедра АСОИ

Методические указания к лабораторному практикуму по учебной дисциплине:

Диагностика неисправностей микропроцессорных систем”

Гомель, 2005

Введение

Выполнение лабораторных работ по учебной дисциплине " Программная диагностика персонального компьютера " предполагает обучение студентов основам программирования аппаратной части персонального компьютера.

Выполнение лабораторных работ включает:

  1. Изучение студентами необходимого теоретического материала по теме лабораторной работы.

  2. Постановку задачи в соответствии с заданием.

  3. Составление программы.

  4. Подготовку отчета о выполненной работе и его защиту.

Каждая работа оформляется отдельно. В отчете о работе указываются:

  1. фамилия, имя, отчество студента;

  2. код группы;

  3. порядковый номер в журнале;

  4. наименование и номер лабораторной работы;

  5. тексты и описания разработанных фрагментов программ;

  6. результаты расчетов, графики и т.д.;

  7. краткие выводы и предложения.

Структура отчета по лабораторной работе:

  1. Тема лабораторной работы.

  2. Цель работы.

  3. Постановка задачи.

  4. Проектные решения.

  5. Текст программы.

  6. Распечатка результатов.

Лабораторная работа № 1. Создание программы определения характеристик центрального процессора.

Цель работы: изучить методы определения и написать программу определения характеристик центрального процессора.

Определение параметров процессора на аппаратном уровне.

Определение любого существующего intel-совместимого процессора складывается из 3 основных этапов:

  1. Определение поддержки инструкции CPUID.

  2. Если она поддерживается - определение остальных параметров.

  3. Определение тактовой частоты.

Процессоры поддерживают  инструкцию  CPUID (как intel, так и AMD), начиная с пятого поколения (Pentium) и поздних моделей 486.

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

Посмотрим, чем отличаются процессоры не поддерживающие CPUID (80386, 80486, более старые процессоры вроде 80286 и ниже рассматривать сейчас не имеет смысла).

Все просто – если бит 18 в EFLAGS доступен, значит процессор 486 или лучше, если его невозможно изменить инструкцией POPF – 386.

В том же EFLAGS нужно попробовать изменить бит ID (21) если его можно программно изменить – процессор поддерживает инструкцию CPUID.

CPUID имеет параметр, который задается в регистре EAX.

Обычно в ответ на вызов CPUID с EAX=0 процессор возвращает в EBX:ECX:EDX некоторую строку-идентификатор производителя.

У intel это «GenuineIntel», у AMD – «AuthenticAMD», у Cyrix – «CyrixInstead».(Обратите внимание, что размеры всех строк – 12 символов – три 4-байтных регистра).

При вызове CPUID с EAX=1 в регистре EAX возвращается информация о типе, модели и степпинге (изменения в рамках одной модели) процессора.

Эти значения расшифровываются по специальным таблицам.

EAX[00:03] – степпинг (stepping) EAX[07:04] – модель (model) EAX[11:08] – семейство (family) EAX[13:12] – тип (type) EAX[15:14] – резерв (reserved) EAX[19:16] – расширенная модель (extended model) (только Pentium 4) EAX[23:20] – расширенное семейство (extended family) (только Pentium 4) EAX[31:24] – резерв (reserved) EBX[07:00] – брэнд-индекс (brand-index) EBX[15:08] – длина строки, очищаемой инструкцией CLFLUSH (Pentium 4) EBX[23:16] - резерв EBX[31:24] – идентификатор APIC процессора. ECX – 0

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

Бит

Описание

0

Наличие сопроцессора

1

Расширение для режима V86, наличие флагов VIP и VIF в EFLAGS

2

Расширения отладки (останов по обращению к портам)

3

Возможности расширения размера страниц до 4Мб

4

Наличие счетчика меток реального времени (и инструкции RDTSC)

5

Поддержка модельно-специфических регистров в стиле Pentium

6

Расширение физического адреса до 36 бит

7

Поддержка Machine Check Exception (исключение машинного контроля)

8

Инструкция CMPXCHG8B

9

Наличие APIC

10

RESERVED

11

Поддержка инструкций SYSENTER и SYSEXIT (для AMD – SYSCALL и SYSRET)

12

Регистры управления кэшированием (MTRR)

13

Поддержка бита глобальности в элементах каталога страниц

14

Поддержка архитектуры машинного контроля

15

Поддержка инструкций условной пересылки CMOVxx

16

Поддержка атрибутов страниц

17

Возможность использования режима PSE-36 для страничной адресации

18

Поддержка серийного номера процессора

19

Поддержка инструкции CLFLUSH

20

RESERVED

21

Поддержка отладочной записи истории переходов

22

Наличие управления частотой синхронизации(ACPI), для AMD – “фирменное” MMX

23

Поддежка MMX

24

Поддержка инструкций сохранения\восстановления контекста FPU

25

SSE

26

SSE2

27

Самослежение (Self Snoop)

28

RESERVED

29

Автоматическое снижение производительности при перегреве

30

Наличие расширенных инструкций AMD 3Dnow!

31

Наличие AMD 3Dnow!

При вызове CPUID с EAX=2 (функция появилась начиная с Pentium II, в процессорах AMD она недоступна)  в регистрах EAX, EBX, ECX, EDX возвращаются так называемые «дескрипторы», которые описывают возможности кэшей и TLB буферов. Причем AL содержит число, указывающее сколько раз необходимо последовательно выполнить CPUID (с EAX=2) для получения полной информации. Дескрипторы постоены по такому принципу: никаких битов тестировать не нужно, если определенный байт просто присутствует в регистре – значит его нужно интерпретировать. На практике обычно делают так, к примеру EDX, сначала смотрят что в DL, интерпретируют его содержимое, потом делают SHR EDX,8 и смотрят опять DL и т.д. Признаком достоверности информации в регистре является бит 31, если он равен 1 – содержимое регистра достоверно. Прежде чем выполнять команду CPUID с EAX=2 сначала нужно удостовериться что текущий процессор ее подерживает.

Счастливые обладатели процессоров Pentium III (только их) могут определить серийный номер своего процессора (предварительно разрешив в BIOS его сообщение процессором, которое по умолчанию отключено) при помощи CPUID с EAX=3.

В регистрах EDX:ECX возвращаются младшие 64 бита номера, вместе с тем, что возвращается в EAX при CPUID (EAX=1), они составляют уникальный 96-битный идентификатор процессора (о котором, в свое время, было столько разговоров).

Кроме того, процессоры AMD имеют возможности вызова функций EAX=80000005h и 80000006h по ним сообщается такая информация как ассоциативность TLB и элементов кэша, но в такие дебри мы сейчас углубляться не будем.

В процессорах AMD (начиная с K5) и Pentium4 имеются возможности сообщения некоторой 48-символьной строки (не той что по CPUID(0)) эти возможности также задействуются с помощью номеров функций более 80000000h.

Инструкция CPUID доступна в любом режиме процессора и с любым уровнем привилегий.

К мануалу прилагается исходник посвященный использованию инструкции CPUID, программа определяет поддержку MMX, SSE, SSE2. Там используются только случаи с EAX=0 и EAX=1, причина этого проста -  начиная с EAX=2 начинаются очень большие разночтения между intel и AMD, и чтобы не делать мануал заточенный под intel (так же как и под AMD). Предусмотреть оба случая - значит усложнить программу и найти себе проблемы с тестированием на разных процессорах.

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

 Начиная с Pentium в архитектуру был введен счетчик тактов (вообще говоря интел его так не называет, и утвеждает что в будущем он может считать не такты, гарантируется лишь, что счетчик будет монотонно возрастать) мы будем определять частоту процессора используя именно этот счетчик. Для начала немного о нем самом: Счетчик тактов имеет разрядность 64 бита и увеличивается на 1 с каждым тактом процессора начиная с сигнала RESET#, он продолжает счет при выполнении инструкции HLT (собственно при выполнении этой инструкции процессор вовсе не останавливается, а всего-навсего непрерывно выполняет инструкцию NOP, которая ,в свою очередь , является закамуфлированной инструкцией XCHG AX,AX (опкод NOP – 10010000b, опкод XCHG AX,reg – 10010reg, что при использовании регистра AX (000) дает 10010000b, интересно, что фактически существует 32-разрядный аналог NOP-а – XCHG EAX,EAX, на кодовую последовательность 66h,90h процессор реагирует нормально). Считывание счетчика тактов можно запретить для прикладных программ (CPL=3) уставнокой в 1 бита TSD в CR4 (в win считываение запрещено). После выполнения инструкции RDTSC (у кого на нее ругается компилятор – db 0fh,031h) регистры EDX:EAX содержат текущее значение счетчика. Измерение частоты при помощи RDTSC происходит следующим образом:

Маскируются все прерывания кроме таймерного.

Делается HLT.

Считывается и сохраняется значение счетчика.

Снова HLT.

Считывается значение счетчика.

Разность значений считанных в пунктах 3 и 5 есть количество тактов за 1 тик таймера (частота прерываний таймера примерно 18,2Гц).

На первый взгляд ничего непонятно. Посмотрим на временную диаграмму.

Момент запуска программы обозначен как t0, штрихи на оси – моменты, когда происходит прерывание от таймера. Первый HLT в листинге нужен для того чтобы преодолеть время t1, которое неизвестно заранее, так как программа может быть запущена в произвольное время. Затем, в момент между t1 и t2 считывается значение счетчика, оно сохраняется и снова делается HLT, процессор будет простаивать до первого прерывания, то есть практически ровно период t2, который и равен периоду прерываний от таймера. Таким образом, при известном значении периода таймера 18,2 Гц, а также количества тактов за этот период можно узнать точную тактовую частоту.

mov al,0FEh ;маскируем все прерывания кроме таймера

out 21h,al

hlt

rdtsc

mov esi,eax

hlt

rdtsc

sub eax,esi

;в EAX - количество тактов процессора за 1 тик таймера

…….. ;преобразование в мегагерцы и вывод на экран

mov al,0

out 21h,al

Для определения типа процессора в приведенном ниже примере используется запись в стек слова состояния процессора и последующего извлечения его. При этом проверяется содержимое старших извлеченных из стека битов.

.MODEL tiny

.STACK 100h

.DATA

msg1 db "Тип вашего процессора: ", "$"

m_8086 db "8086","$"

m_80286 db "80286","$"

m_80386 db "80386","$"

.CODE

.STARTUP

mov ah, 9h

mov dx, OFFSET msg1

int 21h

; Записываем 0 в регистр флагов

xor ax,ax

push ax

popf

; Переписываем регистр флагов через

; стек в регистр AX

pushf

pop ax

; Проверяем установку старших четырех битов

and ax,0F000h

cmp ax,0F000h

; Если эти биты установлены, программа

; работает на процессоре 8086

je short CPU_8086

; Записываем 0F000h в регистр флагов

mov ax,0F000h

push ax

popf

; Переписываем регистр флагов через

; стек в регистр AX

pushf

pop ax

; Проверяем установку старших четырех битов

and ax,0F000h

; Если эти биты установлены, программа

; работает на процессоре 80286

jz short CPU_80286

; Если биты не установлены, то программа

; работает на процессоре 80386

mov dx, OFFSET m_80386

jmp end_program

CPU_80286:

mov dx, OFFSET m_80286

jmp end_program

CPU_8086:

mov dx, OFFSET m_8086

end_program:

mov ah, 9h

int 21h

.EXIT 0

END

Варианты лабораторных работ:

Варианта

Задание

1

Определение наличия поддержки APIC

2

Определение поддержки инструкций SYSENTER и SYSEXIT (для AMD – SYSCALL и SYSRET)

3

Определение серийного номера процессора

4

Определение тактовой частоты процессора

5

Определение поддержки инструкции CLFLUSH

6

Определение наличия управления частотой синхронизации(ACPI), для AMD – “фирменное” MMX

7

Определение поддержки MMX

8

Определение поддержки SSE

9

Определение поддержки SSE2

0

Определение поддержки 3DNow!

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]