Архітектура центрального процесора

ПРОГРАММИРОВАНИЕ ПРЕРЫВАНИЙ

Механизм прерываний

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

Возможны самые разнообразные прерывания по самым различным причинам. С каждым прерыванием связывают число, называемое номером прерывания. С каждым номером прерывания связывается то или иное событие. Система умеет распознавать, какое прерывание с каким номером произошло и запускает соответствующую этому номеру процедуру-обработчик прерывания.

Программы могут вызывать прерывания с заданным номером. Для этого они используют команду int в разных модификациях. Это так называемые синхронные (программные) прерывания. Программные прерывания являются синхронными, так как вызываются из программы (а она знает, когда вызывает прерывание!).

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

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

Некоторые прерывания (первые пять в порядке номеров) зарезервированы для использования самим центральным процессором для особых событий вроде попытки деления на ноль, переполнения и т.п.

Использование прерываний при работе с медленными внешними устройствами позволяет совместить ввод/вывод с обработкой данных в центральном процессоре и в результате повышает общую производительность системы.

Обработчики прерываний могут сами вызывать программные прерывания, например, для получения доступа к сервису BIOS или MS-DOS.

Составление собственных программ обработки прерываний и замена стандартных обработчиков DOS и BIOS является ответственной и сложной работой. Необходимо учитывать все тонкости работы аппаратуры и взаимодействия программного и аппаратного обеспечения. При отладке возможно разрушение операционной системы с непредсказуемыми последствиями, поэтому надо очень внимательно следить за тем, что делает Ваша программа.

Таблица векторов прерываний

Для того чтобы связать адрес обработчика прерывания с номером прерывания, используется таблица векторов прерываний, занимающая первый килобайт оперативной памяти - адресá от 0000:0000 до 0000:03FF. Таблица состоит из 256 четырехбайтовых элементов – FAR-адресов обработчиков прерываний. Эти элементы называются векторами прерываний. В старшем слове вектора прерывания записан адрес сегмента обработчика прерывания, в младшем слове записано смещение.

Расположение векторов прерываний в ОП и их связь с обработчиками прерываний BIOS и MS-DOS:

архітектура центрального процесора - student2.ru
0 1 2 3

Номера прерываний

Прерыванию с номером 0 соответствует адрес 0000:0000, прерыванию с номером 1 - 0000:0004 и т.д. Для программиста, использующего язык Си, таблицу можно описать следующим образом:

void (* interrupt_table[256])();

Заполнение таблицы происходит частично из BIOS после тестирования аппаратуры и перед началом загрузки операционной системы, частично – при загрузке MS-DOS. DOS может заменить некоторые прерывания BIOS.

Назначение некоторых наиболее важных векторов и, соответственно, прерываний:

Номер Описание
0h Ошибка деления. Вызывается автоматически после выполнения команд DIV или IDIV, если в результате деления происходит переполнение (например, при делении на 0). DOS обычно при обработке этого прерывания выводит сообщение об ошибке и останавливает выполнение программы. Для процессора 8086 при этом адрес возврата указывает на следующую после команды деления команду, а в процессоре 80286 - на первый байт команды, вызвавшей прерывание.
1h Прерывание пошагового режима. Вырабатывается после выполнения каждой машинной команды, если в слове флагов установлен бит пошаговой трассировки TF. Используется для отладки программ. Это прерывание не вырабатывается после выполнения команды MOV в сегментные регистры или после загрузки сегментных регистров командой POP.
2h Аппаратное немаскируемое прерывание. Это прерывание может использоваться по-разному в разных машинах. Обычно вырабатывается при ошибке четности в оперативной памяти и при запросе прерывания от сопроцессора.
3h Прерывание для трассировки. Это прерывание генерируется при выполнении однобайтовой машинной команды с кодом CCh и обычно используется отладчиками для установки точки прерывания.
4h Переполнение. Генерируется машинной командой INTO, если установлен флаг OF. Если флаг не установлен, то команда INTO выполняется как NOP. Это прерывание используется для обработки ошибок при выполнении арифметических операций.
5h Печать копии экрана. Генерируется при нажатии на клавиатуре клавиши PrtScr. Обычно используется для печати образа экрана. Для процессора 80286 генерируется при выполнении машинной команды BOUND, если проверяемое значение вышло за пределы заданного диапазона.
6h Неопределенный код операции или длина команды больше 10 байт (для процессора 80286).
7h Особый случай отсутствия математического сопроцессора (процессор 80286).
8h IRQ0 - прерывание интервального таймера, возникает 18,2 раза в секунду.
9h IRQ1 - прерывание от клавиатуры. Генерируется при нажатии и при отпускании клавиши. Используется для чтения данных от клавиатуры.
Ah IRQ2 - используется для каскадирования аппаратных прерываний в машинах класса AT.
Bh 28.11IRQ3 - прерывание асинхронного порта COM2.
Ch IRQ4 - прерывание асинхронного порта COM1.
Dh IRQ5 - прерывание от контроллера жесткого диска для XT.
Eh IRQ6 - прерывание генерируется контроллером флоппи-диска после завершения операции.
Fh IRQ7 - прерывание принтера. Генерируется принтером, когда он готов к выполнению очередной операции. Многие адаптеры принтера не используют это прерывание.
10h Обслуживание видеоадаптера.
11h Определение конфигурации устройств в системе.
12h Определение размера оперативной памяти в системе.
13h Обслуживание дисковой системы.
14h Последовательный ввод/вывод.
15h Расширенный сервис для AT-компьютеров.
16h Обслуживание клавиатуры.
17h Обслуживание принтера.
18h Запуск BASIC в ПЗУ, если он есть.
19h Загрузка операционной системы.
1Ah Обслуживание часов.
1Bh Обработчик прерывания Ctrl-Break.
1Ch Прерывание возникает 18.2 раза в секунду, вызывается программно обработчиком прерывания таймера.
1D Адрес видеотаблицы для контроллера видеоадаптера 6845.
1E Указатель на таблицу параметров дискеты.
1F Указатель на графическую таблицу для символов с кодами ASCII 128-255.
20h-5Fh Используется DOS или зарезервировано для DOS.
60h-67h Прерывания, зарезервированные для пользователя.
68h-6Fh Не используются.
70h IRQ8 - прерывание от часов реального времени.
71h IRQ9 - прерывание от контроллера EGA.
72h IRQ10 - зарезервировано.
73h IRQ11 - зарезервировано.
74h IRQ12 - зарезервировано.
75h IRQ13 - прерывание от математического сопроцессора.
76h IRQ14 - прерывание от контроллера жесткого диска.
77h IRQ15 - зарезервировано.
78h - 7Fh Не используются.
80h-85h Зарезервированы для BASIC.
86h-F0h Используются интерпретатором BASIC.
F1h-FFh Не используются.

IRQ0-IRQ15 – это аппаратные прерывания с номерами, соответствующими важности прерываний (их приоритету). Наиважнейшее, обрабатываемое в первую очередь, прерывание имеет номер IRQ0.

Вызов прерываний из программ В языке Си есть 4 основных функции для вызова прерываний: int86 – выполняет прерывания процессоров i80x86 (и старших моделей);int86x – выполняет прерывания процессоров i80x86 с указанием значения сегментного регистра;intdos – выполняет прерывание MS-DOS INT21h;intdosx – выполняет прерывание MS-DOS INT21h с указанием значения сегментного регистра. #include <DOS.H> // Для работы с // прерываниями требуется // заголовочный файл dos.h. int int86 (int intno, union REGS *inregs, union REGS *outregs);int int86x (int intno, union REGS *inregs, union REGS *outregs, struct SREGS *segregs);здесь intno – номер прерывания, union REGS *inregs, union REGS *outregs – указатели на объединения (союзы); inregs позволяет заносить значения в регистры, outregs – получать возвращаемые в регистрах значения после выполнения прерывания. union REGS{ struct WORDREGS x; struct BYTEREGS h;};где struct WORDREGS // двухбайтовые // регистры{ unsigned int ax; unsigned int bx; unsigned int cx; unsigned int dx; unsigned int si; unsigned int di; unsigned int cflag;};struct BYTEREGS // однобайтовые // регистры{ unsigned char al, ah; unsigned char bl, bh; unsigned char cl, ch; unsigned char dl, dh;};struct SREGS // сегментные регистры{ unsigned int es; unsigned int cs; unsigned int ss; unsigned int ds;}; Многочисленные функции прерывания INT21h выполняются с помощью функций Си: int intdos (union REGS *inregs, union REGS *outregs);int intdosx (union REGS *inregs, union REGS *outregs, struct SREGS *segregs); Все 4 функции Си возвращают данные, которые остаются после их выполнения в регистре AX.

АРХІТЕКТУРА ЦЕНТРАЛЬНОГО ПРОЦЕСОРА

Intel8086/88

Наши рекомендации