
- •Введение
- •Лабораторная работа № 1. Создание программы определения характеристик центрального процессора.
- •Определение параметров процессора на аппаратном уровне.
- •Лабораторная работа № 2.
- •Конфигурация персонального компьютера
- •Cmos-память и конфигурация компьютера
- •32H Текущее столетие
- •Использование bios для определения конфигурации
- •Лабораторная работа 3. Тестирование оптических накопителей.
- •Использование I/o Control Codes.
- •Использование Windows Management Instrumentation (wmi).
- •Порты контроллера накопителей на гибких дисках
- •Порт 3f2h.
- •Порт 3f4h.
- •Команды управления накопителями
- •Перечень команд контpоллеpа нгмд
- •Структура байтов состояния
- •Формат дорожки
- •Отличия контроллера для ат-подобных пэвм
- •Порт 3f7h.
- •Лабораторная работа № 5. Диагностика контроллера накопителей на жестких дисках.
- •Контроллер жестких дисков для хт-подобных пэвм
- •Порты ввода-вывода
- •Порт 320h.
- •Порт 321h.
- •Порт 322h.
- •Порт 323h.
- •Общий формат команды и терминология
- •Описание команд Проверка готовности накопителя (класс 0, опкод 0).
- •Рекалибровать (класс 0, опкод 1).
- •Запрос состояния (класс 0, опкод 3).
- •Форматирование накопителя (класс 0, опкод 4).
- •Проверка секторов (класс 0, опкод 5).
- •Форматирование дорожки (класс 0, опкод 6).
- •Форматирование дефектной дорожки (класс 0, опкод 7).
- •Чтение секторов (класс 0, опкод 8).
- •Запись секторов (класс 0, опкод 0Ah).(*)
- •Поиск цилиндра по номеру (класс 0, опкод 0Ch).(*)
- •Чтение внутреннего озу контроллера (класс 0, опкод 0Eh).(*)
- •Запись внутреннего озу контроллера (класс 0, опкод 0Fh).(*)
- •Диагностика внутреннего озу контроллера (класс 7,опкод 0).(*)
- •Тест устройства (класс 7, опкод 3).
- •Расширенный тест контроллера (класс 0, опкод 4).
- •Считывание без контроля (класс 7, опкод 5).
- •Запись без контроля (класс 7, опкод 6).
- •Разметка диска
- •Контроллер жестких дисков для ат-подобных пэвм
- •Описание портов ввода-вывода Порт 1f0h
- •Порт 1f1h.
- •Система команд
- •Лабораторная работа №6. Программное тестирование портов для работы с клавиатурой
- •Аппаратное прерывание клавиатуры
- •Средства bios для работы с клавиатурой
- •Чтение символа с ожиданием
- •Проверка буфера на наличие в нем символов
- •Получение состояния переключающих клавиш
- •Установка временных характеристик клавиатуры
- •Запись символов в буфер клавиатуры
- •Чтение символа с ожиданием для 101-клавишной клавиатуры
- •Проверка буфера на наличие в нем символов для 101-клавишной клавиатуры
- •Получение состояния переключающих клавиш для 101-клавишной клавиатуры
- •Лабораторная работа № 7. Тестирование и контроль оперативной памяти.
- •Алгоритм определения объёма оперативной памяти.
- •Сущность тестирования памяти.
- •Алгоритм диагностирования памяти в тесте Memtest86.
- •Лабораторная работа № 8. Программирование принтера. Цель работы: изучение методов программирования принтера.
- •Средства ms-dos для работы с принтером
- •Программирование режимов принтера
- •Установка атрибутов/цветов символов.
- •Сдвиг экрана и страницы.
- •Вертикальный сдвиг текстового экрана.
- •Сдвиг текстового экрана горизонтально.
- •Переключение между текстовыми страницами.
- •Сдвиг между страницами текста.
- •Использование wmi.
- •Аналогичным образом могут использоваться свойства и других классов.
Министерство образования Республики Беларусь
Гомельский государственный университет им. Ф. Скорины
Физический факультет
Кафедра АСОИ
Методические указания к лабораторному практикуму по учебной дисциплине:
“Диагностика неисправностей микропроцессорных систем”
Гомель, 2005
Введение
Выполнение лабораторных работ по учебной дисциплине " Программная диагностика персонального компьютера " предполагает обучение студентов основам программирования аппаратной части персонального компьютера.
Выполнение лабораторных работ включает:
Изучение студентами необходимого теоретического материала по теме лабораторной работы.
Постановку задачи в соответствии с заданием.
Составление программы.
Подготовку отчета о выполненной работе и его защиту.
Каждая работа оформляется отдельно. В отчете о работе указываются:
фамилия, имя, отчество студента;
код группы;
порядковый номер в журнале;
наименование и номер лабораторной работы;
тексты и описания разработанных фрагментов программ;
результаты расчетов, графики и т.д.;
краткие выводы и предложения.
Структура отчета по лабораторной работе:
Тема лабораторной работы.
Цель работы.
Постановка задачи.
Проектные решения.
Текст программы.
Распечатка результатов.
Лабораторная работа № 1. Создание программы определения характеристик центрального процессора.
Цель работы: изучить методы определения и написать программу определения характеристик центрального процессора.
Определение параметров процессора на аппаратном уровне.
Определение любого существующего intel-совместимого процессора складывается из 3 основных этапов:
Определение поддержки инструкции CPUID.
Если она поддерживается - определение остальных параметров.
Определение тактовой частоты.
Процессоры поддерживают инструкцию 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! |