Прерывания и особые ситуации: Типы прерываний. Обработка прерываний, векторы прерываний, программные прерывания, IRQ Вектор прерывания

Операционная система в значительной степени управляется с помощью системы прерываний. В реальном режиме имеются 2 типа прерываний: аппаратные и программные. Программные прерывания инициализируются командой int. Аппаратные – внешними событиями, асинхронными по отношению к выполняемой программе. Обычно аппаратные прерывания инициализируются аппаратурой ввода/вывода после завершения выполнения текущей операции.

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

Таблица векторов прерываний располагается в самом начале ОП, т.е. её физический адрес = 0. Таблица векторов прерываний состоит из 256 элементов по 4 байта. Вектора состоят из 16 битового сегментного адреса и 16 битового смещения (сначала идет смещение, а потом сегмент). Каждый вектор прерываний имеет свой номер, называемый номером прерывания, который указывает на его место в таблице. Этот номер, умноженный на 4, дает абсолютный адрес вектора памяти.

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

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

Перед входом в процедуру обработки прерываний принудительно сьрасывется флаг трассировки TF и флаг разрешения прерываний IF. Завершив обработку прерывания, процедура должна выдать команду IRET, по которой из стека будут извлечены значения регистров CS:IP и регистра флагов. Далее продолжается выполнение прерванной программы.

Процедура обработки прерывания обязательно должна закончится процедурой IRET, после которой считываются значения flags, CS, IP.

Прерывание (interrupt) – событие, требующие немедленной реакции со стороны процессора. Реакция состоит в том, что процессор прерывает обработку текущей программы (прерываемой программы ) и переходит к выполнению некоторой другой программы (прерывающей программы ), специально предназначенной для данного события. По завершении этой программы процессор возвращается к выполнению прерванной программы.

Каждое событие, требующее прерывания, сопровождается сигналом прерывания , оповещающим об этом вычислительную машину, и называемым запросом прерывания .

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

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

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

Как правило, управление запоминанием и возвратом возложено на обработчик прерывания. В этом случае обработчик состоит из трех частей – подготовительной (пролог ) и заключительной (эпилог ), обеспечивающих переключение программ, и собственно прерывающей программы, выполняющей затребованные запросом операции. Время реакции определяется как временной интервал от момента поступления запроса прерывания до начала выполнения прерывающей программы.


t p – время реакции системы на прерывание;
t з – время запоминания состояния прерываемой программы;
t ппр – время собственно прерывающей программы;
t в – время восстановления состояния прерванной программы

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

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

Характеристиками системы прерывания являются:

  • общее количество запросов прерыванияколичество источников запросов прерывания;
  • тип представления прерывания – как правило, запрос прерывания представлен логическим уровнем сигнала;
  • приоритет прерывания – определяет очередность обработки каждого запроса прерывания, чем выше приоритет, тем меньше задержка в исполнении прерывающей программы для него;
  • время реакции – временной интервал между появлением запроса прерывания и началом выполнения прерывающей программы;
  • задержка прерывания – определяется суммарным временем на запоминание и восстановление программы;
  • глубина, обычно совпадает с числом уровней приоритетов в системе прерывания;
  • насыщение системы прерывания;
  • допустимые моменты прерывания программ (как правило, окончание выполнения следующей команды).

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

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

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

Кажется очевидным, что возможны самые разнообразные прерывания по самым различным причинам. Поэтому с прерыванием связывают число - так называемый номер прерывания.

Этот номер однозначно соответствует тому или иному событию. Система умеет распознавать прерывания и при их возникновении запускает процедуру, соответствующую номеру прерывания.

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

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

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

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

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

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

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

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

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

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

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

Элементы таблицы векторов прерываний называются векторами прерываний. В первом слове элемента таблицы записана компонента смещения, а во втором - сегментная компонента адреса обработчика прерывания.

Вектор прерывания с номером 0 находится по адресу 0000:0000, с номером 1 - по адресу 0000:0004 и т. д.

Для программиста, использующего язык С, таблицу векторов прерываний можно описать следующим образом:

void (far* interrupt_table)();

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

Расскажем о назначении наиболее важных векторов прерываний.

Номер Описание
0 Ошибка деления.Вызывается автоматически после выполнения команд DIV или IDIV, если в результате деления происходит переполнение (например, при делении на 0). Обычно при обработке этого прерывания MS-DOS выводит сообщение об ошибке и останавливает выполнение программы. При этом для процессора i8086 адрес возврата указывает на команду, следующую после команды деления, а для процессора i80286 и более старших моделей - на первый байт команды, вызвавшей прерывание
1 Прерывание пошагового режима.Вырабатывается после выполнения каждой машинной команды, если в слове флагов установлен бит пошаговой трассировки TF. Используется для отладки программ. Это прерывание не вырабатывается после пересылки данных в сегментные регистры командами MOV и POP
2 Аппаратное немаскируемое прерывание.Это прерывание может использоваться по-разному в разных машинах. Обычно оно вырабатывается при ошибке четности в оперативной памяти и при запросе прерывания от сопроцессора
3 Прерывание для трассировки.Генерируется при выполнении однобайтовой машинной команды с кодом CCh и обычно используется отладчиками для установки точки прерывания
4 Переполнение. Генерируется машинной командой INTO , если установлен флаг переполнения OF. Если флаг не установлен, команда INTO выполняется как NOP. Это прерывание используется для обработки ошибок при выполнении арифметических операций
5 Печать копии экрана. Генерируется, если пользователь нажал клавишу В программах MS-DOS обычно используется для печати образа экрана. Для процессора i80286 и более старших моделей генерируется при выполнении машинной команды BOUND, если проверяемое значение вышло за пределы заданного диапазона
6 Неопределенный код операции или длина команды больше 10 байт
7 Особый случай отсутствия арифметического сопроцессора
8
9 IRQ1 - прерывание от клавиатуры. Генерируется, когда пользователь нажимает и отжимает клавиши. Используется для чтения данных из клавиатуры
A
B
C
D IRQ5 - прерывание от контроллера жесткого диска (только для компьютеров IBM PC/XT)
E IRQ6 - прерывание генерируется контроллером НГМД после завершения операции ввода/вывода
F IRQ7 - прерывание от параллельного адаптера. Генерируется, когда подключенный к адаптеру принтер готов к выполнению очередной операции. Обычно не используется
10 Обслуживание видеоадаптера
11 Определение конфигурации устройств в системе
12 Определение размера оперативной памяти
13 Обслуживание дисковой системы
14 Работа с асинхронным последовательным адаптером
15 Расширенный сервис
16 Обслуживание клавиатуры
17 Обслуживание принтера
18 Запуск BASIC в ПЗУ, если он есть
1A Обслуживание часов
1B Обработчик прерывания, возникающего, если пользователь нажал комбинацию клавиш
1C Программное прерывание, вызывается 18,2 раза в секунду обработчиком аппаратного прерывания таймера
1D Адрес видеотаблицы для контроллера видеоадаптера 6845
1E Указатель на таблицу параметров дискеты
1F Указатель на графическую таблицу для символов с кодами ASCII 128-255
20-5F Используется MS-DOS или зарезервировано для MS-DOS
60-67 Прерывания, зарезервированные для программ пользователя
68-6F Не используются
70
71
72 IRQ10 - зарезервировано
73 IRQ11 - зарезервировано
74 IRQ12 - зарезервировано
75
76
77 IRQ15 - зарезервировано
78 - 7F Не используются
80-85 Зарезервировано для BASIC
86-F0 Используются интерпретатором BASIC
F1-FF Не используются

Прерывания, обозначенные как IRQ0 - IRQ15 являются аппаратными прерываниями.

4.2. Маскирование прерываний

Часто при выполнении критических участков программ приходится запрещать прерывания для того чтобы гарантировать непрерываемое выполнение определенной последовательности команд. Это можно сделать командой CLI. Ее нужно поместить в начало критической последовательности команд, а в конце расположить команду STI, разрешающую процессору воспринимать прерывания. Команда CLI запрещает только маскируемые прерывания, на обработку немаскируемого прерывания эта команда никакого влияния не оказывает.

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

Если вам надо запретить не все прерывания, а только некоторые, например, от клавиатуры, то для этого надо воспользоваться услугами контроллера прерываний. Записывая в этот контроллер определенную управляющую информацию, можно замаскировать прерывания от отдельных устройств.

4.3. Изменение таблицы векторов прерываний

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

Очень важно не забыть перед завершением работы восстановить содержимое измененных векторов в таблице прерываний.

Дело в том, что память, которая была распределена программе, после завершения работы программы освобождается. Она может быть использована, например, для загрузки другой программы. Если вы забыли восстановить вектор и пришло прерывание, то система может разрушиться - вектор теперь указывает на область, которая может содержать что угодно.

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

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

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

Функции MS-DOS для работы с таблицей прерываний

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

Для чтения вектора используйте функцию 35h прерывания INT 21h . Перед ее вызовом регистр AL должен содержать номер вектора в таблице. После выполнения функции в регистрах ES:BX будет искомый адрес обработчика прерывания.

Для вектора с номером, находящимся в регистре AL, функция 25h прерывания INT 21h устанавливает новый обработчик прерывания. Адрес обработчика прерываний следует передать через регистры DS:DX.

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

Пользователям языка С доступны функции _dos_getvect и _dos_setvect . Первая функция получает адрес из таблицы векторов прерываний, вторая устанавливает новый адрес. Обе эти функции обращаются к описанным выше функциям 35h и 25h прерывания INT 21h .

Какие требования предъявляются к программе обработки прерывания?

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

Цепочки обработчиков прерываний

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

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

Можно сделать и по-другому: ваш обработчик вызывает старый обработчик как подпрограмму, а затем после возврата из старого обработчика выполняет дополнительные действия. Иными словами, вы можете вставить дополнительную обработку как до вызова старого обработчика, так и после его вызова.

В библиотеке транслятора C имеется функция для организации цепочки прерываний с именем _chain_intr .

Для описания функции, выполняющей роль обработчика прерывания, следует использовать ключевое слово interrupt.

Такая функция завершается командой возврата из обработки прерывания IRET. Для нее автоматически генерируются команды сохранения регистров на входе и их восстановления при выходе из обработчика прерывания. Пример использования ключевого слова interrupt для определения функции обработки прерывания:

void interrupt far int_funct(...) { // Тело обработчика прерывания }

Функция обработки прерывания должна быть дальней функцией, так как таблица векторов прерываний содержит полные адреса в формате <сегмент:смещение>.

Ключевое слово interrupt используется также для описания переменных, предназначенных для хранения векторов прерываний:

void (interrupt (far *oldvect)(...);

Для установки своего обработчика прерываний используйте функцию _dos_setvec . Эта функция имеет два параметра - номер прерывания и указатель на новую функцию обработки прерывания.

Например:

_dos_setvect (0x16, my_key_intr);

В этом примере для прерывания с номером 16h (программное прерывание, предназначенное для чтения данных из клавиатуры) устанавливается новый обработчик прерывания my_key_intr.

Если вам надо узнать адрес старого обработчика прерывания по его номеру, лучше всего воспользоваться функцией _dos_getvect , которая принимает в качестве параметра номер прерывания и возвращает указатель на соответствующий этому номеру обработчик.

Например:

old_vector = _dos_getvect (0x16);

Для организации цепочки прерываний используйте функцию _chain_intr . В качестве параметра эта функция принимает адрес старого обработчика прерываний.

Программа BEEPER

Программа BEEPER (листинг 4.1) - простой пример, который иллюстрирует применение всех трех перечисленных выше функций, предназначенных для работы с прерываниями.

Листинг 4.1. Файл beeper\beeper.cpp

#include #include #include void main(void); void interrupt far timer(...); void interrupt (far *oldvect)(...); // Переменная для подсчета прерываний таймера volatile long ticks; void main(void) { // Сбрасываем счетчик ticks = 0L; // Запоминаем адрес старого обработчика // прерывания oldvect = _dos_getvect (0x1c); // Устанавливаем новый обработчик прерывания _dos_setvect (0x1c, timer); printf("\nТаймер установлен. Нажмите любую" " клавишу...\n"); getch(); // Восстанавливаем старый обработчик прерывания _dos_setvect (0x1c,oldvect); } void interrupt far timer(...) { // Увеличиваем счетчик прерываний таймера ticks++; // Если значение счетчика кратно 20, // выдаем сигнал на громкоговоритель компьютера if((ticks % 20) == 0) { asm mov bx,0 asm mov ax, 0E07h asm int 10h } // Вызываем старый обработчик прерывания _chain_intr (oldvect); }

Эта программа встраивает собственный обработчик прерывания таймера, который будет вызываться примерно 18,2 раза в секунду. Встраиваемый обработчик прерывания подсчитывает прерывания таймера и, если значение соответствующего счетчика кратно 20, громкоговоритель компьютера издает звуковой сигнал.

В конце работы новая программа обработки прерывания таймера вызывает старый обработчик с помощью функции _chain_intr .

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

4.4. Особенности обработки аппаратных прерываний

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

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

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

Система приоритетов реализована на двух микросхемах Intel 8259 (или аналогичных). Каждая микросхема является контроллером прерывания и обслуживает до восьми приоритетов. Микросхемы можно объединять (каскадировать) для увеличения количества уровней приоритетов в системе.

Уровни приоритетов обозначаются сокращенно IRQ0 - IRQ15 .

В компьютере типа IBM PC/XT была установлена только одна микросхема контроллера прерывания. Приоритеты линейно зависели от номера уровня прерывания. Прерывание IRQ0 соответствовало самому высокому приоритету, за ним шли прерывания IRQ1 , IRQ2 , IRQ3 и так далее.

Прерывание IRQ2 в компьютерах IBM PC/XT было зарезервировано для дальнейшего расширения системы. В компьютерах IBM PC/AT прерывание IRQ2 стало использоваться для каскадирования двух контроллеров прерывания 8259. Добавленные приоритетные уровни прерываний IRQ8 - IRQ15 в этих компьютерах располагаются по приоритету между прерываниями IRQ1 и IRQ3 .

Приведем список аппаратных прерываний, расположенных в порядке убывания приоритета:

Номер Описание
8 IRQ0 - прерывание интервального таймера, возникает 18,2 раза в секунду
9 IRQ1 - прерывание от клавиатуры
A IRQ2 - используется для каскадирования аппаратных прерываний
70 IRQ8 - прерывание от часов реального времени
71 IRQ9 - прерывание от контроллера EGA
72 IRQ10 - зарезервировано
73 IRQ11 - зарезервировано
74 IRQ12 - зарезервировано
75 IRQ13 - прерывание от арифметического сопроцессора
76 IRQ14 - прерывание от контроллера жесткого диска
77 IRQ15 - зарезервировано
B IRQ3 - прерывание асинхронного порта COM2
C IRQ4 - прерывание асинхронного порта COM1
D IRQ5 - прерывание от контроллера жесткого диска (только в компьютерах IBM PC/XT)
E IRQ6 - прерывание генерируется контроллером НГМД
F IRQ7 - прерывание принтера

Из этого списка видно, что самый высокий приоритет у прерываний от интервального таймера, затем идет прерывание от клавиатуры. Наименьший приоритет имеет прерывание принтера.

Для управления схемами приоритетов необходимо знать внутреннее устройство контроллера прерываний 8259.

Поступающие прерывания запоминаются в регистре запроса на прерывание IRR. Каждый бит из восьми в этом регистре соответствует своему прерыванию.

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

Наиболее интересными с точки зрения программирования контроллера прерываний являются регистры маски прерываний IMR и управляющий регистр прерываний.

В компьютерах IBM PC/XT регистр маски прерываний имеет адрес 21h, управляющий регистр прерываний - 20h. В компьютерах IBM PC/AT первый контроллер 8259 имеет такие же адреса, что и в IBM PC/XT. Регистр маски прерываний второго контроллера имеет адрес A1h, управляющий регистр прерываний - адрес A0h.

Разряды регистра маски прерываний соответствуют номерам IRQ. Для того чтобы замаскировать аппаратное прерывание какого-либо уровня, надо записать в регистр маски байт масок. В этом байте следует установить в 1 те биты, которые соответствуют маскируемым прерываниям. Например, для маскирования прерываний от НГМД в порт 21h надо записать двоичное число 01000000.

Приведем строку программы, маскирующей прерывание от флоппи-диска:

outp(0x21, 0x40);

Чтобы "оживить" прерывания от НГМД, используйте следующую строку (которая размаскирует все прерывания):

outp(0x21, 0);

Заметьте, что в приведенном выше примере мы замаскировали прерывание именно от НГМД, все остальные устройства продолжали нормально работать. Если бы мы выдали машинную команду CLI, то отключились бы все аппаратные прерывания. Это привело бы, например, к тому, что клавиатура была бы заблокирована.

Еще одно замечание, касающееся обработки аппаратных прерываний.

Если вы полностью заменяете стандартный обработчик аппаратного прерывания, не забудьте в конце программы записать байт 20h в порт с адресом 20h (A0h для второго контроллера 8259). Эти действия необходимы для очистки регистра обслуживания прерывания ISR. При этом разрешается обработка прерываний с более низким приоритетом чем то, которое только что обрабатывалось.

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

Перед тем как завершить изучение прерываний, зададимся вопросом - можно ли замаскировать немаскируемое прерывание? Оказывается можно!

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

Для компьютера IBM PC/XT маскированием немаскируемого прерывания управляет порт с адресом 0A0h. Если записать в него 0, немаскируемое прерывание будет запрещено, если 80h - разрешено.

Аналогично для IBM PC/AT маскированием немаскируемого прерывания управляет бит 7 порта 70h. Запись байта 0ADh в порт 70h запретит немаскируемое прерывание, а байта 2Dh - разрешит прохождение прерывания.

Заметим, что мы не запрещаем немаскируемое прерывание "внутри" процессора - это невозможно по определению, мы "не пускаем" сигнал прерывания на вход NMI.

Лекция№12

Система прерываний 32-разрядных микропроцессоров i 80 x 86.

Работа системы прерываний в реальном режиме

Вопросы

1. Понятие прерывания

2. Классификация прерываний

3. Система прерываний.

· Аппаратные средства

· Программные средства системы прерываний

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

4. Обработка прерывания в реальном режиме

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

Т.е. это процесс, временно переключающий микропроцессор на выполнение другой программы с последующим возвратом к прерванной программе.

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

Адрес программы-обработчика прерывания вычисляется по таблице векторов прерываний.

Механизм прерываний поддерживается на аппаратном уровне.

Классификация прерываний

В зависимости от источника, прерывания делятся на

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

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

· исключения - являются реакцией микропроцессора на нестандартную ситуацию, возникшую внутри микропроцессора во время выполнения некоторой команды программы (деление на ноль, прерывание по флагу TF (трассировка)).

Общая классификация прерываний

· внешние - вызываются внешними по отношению к микропроцессору событиями

(по существу - это группа аппаратных прерываний) Вложенных прерываний нет!

· внутренние - возникают внутри микропроцессора во время вычислительного процесса (по существу - это исключительные ситуации и программные прерывания).

Внешние прерывания возникают по сигналу какого-нибудь внешнего устройства.

Внешние прерывания подразделяются на не­маскируемые и маскируемые.

В связи с тем, что существуют два специальных внешних сигнала среди входных сигналов процес­сора, при помощи которых можно прервать выполнение текущей программы и тем самым переключить работу центрального процессора. Это сигналы NMI (no mask interrupt , немаскируемое прерывание) и INTR (interrupt request , запрос на прерывание).

Маскируемые прерывания генерируются контроллером прерываний по заявке определенных периферийных устройств. Контроллер прерываний (выполнен в виде специальной микросхемы i8259A) поддерживает восемь уровней (линий) приоритета; к каждому уровню “привязано” одно периферийное устройство. Именно маскируемые прерывания часто называют аппаратными прерываниями .

В ПК, начиная с IBM PC AT, построенных на базе микропроцессора i80286, используются два контроллера прерываний i8259A; они соединяются последователь­но каскадным образом, что увеличивает количество внешних источников прерываний до 15 (каждая по 8).

Обратим внимание . Микросхема i 8259А является программируемой.

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

!

В реальном и защищенном режиме работы микропроцессора обработка прерываний осуществляется принципиально разными методами.

Система прерываний. Аппаратные и программные средства системы прерываний

Система прерываний - это совокупность программных и аппаратных средств, реализующих механизм прерываний.

К аппаратным средствам системы прерываний относятся:

· выводы микропроцессора - на них формируются сигналы, извещающие микропроцессор либо о том, что некоторое внешнее устройство «проситуделить ему внимание» (INTR) , либо о том, что требуется безотлагательная обработка некоторого события или катастрофическая ошибка (NMI)

· INTR - вывод для входного сигнала запроса на прерывание ,

· NMI - вывод для входного сигнала немаскируемого прерывания

· INTA - вывод для выходного сигнала подтверждения получения сигнала прерывания микропроцессором (этот сигнал поступает на одноименный вход микросхемы конроллера 8259А;

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

· внешние устройства (таймер, клавиатура, магнитные диски и т.п.)

К программным средствам системы прерываний Реального режима относятся:

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

Занимает первый килобайт ОП (адреса 00000 h-003FFh) .

Она содержит адреса (векторы - «векторы», т.к. два значения для указания адреса) обработчиков прерываний и состоит из 256 (0..255) элементов по 4 байта каждый:

2 байта - новое значение для регистра IP

2 байта - новое значение для регистра CS .

Расположение таблицы векторов прерываний в процессорах i80286 и старше определяется значением регистра IDTR .

Таблица векторов прерываний инициализируется при запуске системы, но в принципе может быть изменена и перемещена.

Каждый вектор имеет свой номер и называется номером прерывания.

· два флага в регистре флагов flags/eflags :

· IF (Interrupt Flag) - флаг прерывания. Предназначен для маскирования (запрещения) аппаратных прерываний. Если IF=1 , микропроцессор обрабатывает внешние прерывания, если = 0, то игнорирует;

· TF(Trace Flag) - флаг трассировки. Если он=1, то микропроцессор переходит в режим покомандной работы. В этом режиме в микропроцессоре генерируется внутреннее прерывание с номером 1;

· машинные команды микропроцессора: int, into (прерывание по переполнению) , iret, cli, sti

Обработка прерывания в реальном режиме

производится в три этапа:

1) прекращение выполнения текущей программы;

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

Обязательными для сохранения являются регистры cs, ip, flags (пара CS:IP содержит адрес команды, с которой необходимо начать выполнение после возврата, flags - состояние флагов после выполнения последней команды прерванной программы).

!!! Эти регистры сохраняются микропроцессором автоматически. Сохранение остальных регистров - должно обеспечиваться программистом!!!

Наиболее удобным местом хранения регистров является стек.

После сохранения регистров в стеке микропроцессор сбрасывает бит флага IF (т.е.=0)(!!! В стеке при этом записан регистр flags с еще установленным IF !!!)Этим предотвращается возможность возникновения вложенных внешних прерываний и порча регистров исходной программы вследствие неконтролируемых действий со стороны программы - обработчика вложенного прерывания. После того как необходимые действия по сохранению контекста завершены, обработчик аппаратного прерывания может разрешить вложенные прерывания командой sti .

2) переход к выполнению и выполнение программы обработки прерывания;

Здесь определяется источник прерывания и вызывается соответствующий обработчик прерывания.

В реальном режиме микропроцессора допускается 256 источников - по кол-ву элементов таблицы векторов прерываний.

Структура элемента:

· 2 байта - значение смещения начала программы-обработчика прерывания от начала кодового сегмента

· 2 байта - значение базового адреса сегмента, в котором находится программа-обработчик.

Как определить адрес, по которому находится вектор прерывания с номером N ?

смещение эл-та таблицы векторов прерываний= N * 4

Полный размер таблицы?4*256=1024

Итак на втором этапе микропроцессор

1. По номеру источника прерывания определяет смещение в таблице векторов прерываний

2. Помещает первые два байта в регистр IP

3. Помещает вторые два байта в регистр CS

4. Передыет управление по адресу CS:IP

(Она тоже может быть прервана поступлением запроса от более приоритетного источника. Все источники прерывания имеют приоритеты.)

3) возврат управления прерванной программе.

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

Последние команды в в обработчике прерывания - sti, iret

sti - разрешить аппаратные прерывания (устанавливает флаг IF=1 , не имеет операндов) .

iret - извлечь последовательно три слова из стека и поместить их соответственно в регистры ip, cs, flags.

Во время выполнения ЭВМ текущей программы внутри машины и в связанной с ней внешней среде (например, в технологическом процессе, управляемом ЭВМ) могут возникать события, требующие немедленной реакции на них со стороны машины.

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

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

Каждое событие, требующее прерывания, сопровождается сигналом, оповещающим ЭВМ – запросами прерывания. Программу, затребованную запросом прерывания, называют прерывающей программой, противопоставляя ее прерываемой программе, выполнявшейся машиной до появления запроса.

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

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

Основными функциями системы прерывания являются:

    запоминание состояния прерываемой программы и осуществление перехода к прерывающей программе

    восстановление состояния прерванной программы и возврат к ней.

Вектором прерывания называется вектор «начального состояния прерывающей программы». Вектор прерывания содержит всю необходимую информацию для перехода к прерывающей программе, в том числе ее начальный адрес. Каждому запросу (номеру) прерывания соответствует свой вектор прерывания, способный инициировать выполнение соответствующей прерывающей программы. Векторы прерывания находятся в специально выделенных фиксированных ячейках памяти – таблице векторов прерываний.

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

Классификация прерываний

Запросы на прерывания могут возникать внутри самой ЭВМ и в ее внешней среде. К первым относятся, например, запросы при возникновении в ЭВМ таких событий, как появление ошибки в работе ее аппаратуры, переполнение разрядной сетки, попытка деления на 0, выход из установленной для данной программы области памяти, затребование периферийным устройством операции ввода-вывода, завершение операции ввода-вывода периферийным устройством или возникновение при этой операции особой ситуации и др. Хотя некоторые из указанных событий порождаются самой программой, моменты их появления, как правило, невозможно предусмотреть. Запросы во внешней среде могут возникать от других ЭВМ, от аварийных и некоторых других датчиков технологического процесса и т. п.

Семейство микропроцессоров Intel 80x86 поддерживает 256 уровней приоритетных прерываний, вызываемых событиями трех типов:

    внутренние аппаратные прерывания

    внешние аппаратные прерывания

    программные прерывания

Внутренние аппаратные прерывания , иногда называемые отказами (faults), генерируются определенными событиями, возникающими в процессе выполнения программы, например попыткой деления на 0. Закрепление за такими событиями определенных номеров прерываний зашито в процессоре и не может быть изменено.

Внешние аппаратные прерывания инициируются контроллерами периферийного оборудования или сопроцессорами (например, 8087/80287). Источники сигналов прерываний подключаются либо к выводу немаскируемых прерываний процессора (NMI) либо к выводу маскируемых прерываний (INTR). Линия NMI обычно предназначает для прерываний, вызываемых катастрофическими событиями, такими, как ошибки четности памяти или авария питания.

Программные прерывания . Любая программа может инициировать синхронное программное прерывание путем выполнения команды int . MS-DOS использует для взаимодействия со своими модулями и прикладными программами прерывания от 20Н до 3FH (например, доступ к диспетчеру функций MS-DOS осуществляется выполнением команды i nt 21 h ). Программы BIOS, хранящиеся в ПЗУ, и прикладные программы IBM PC используют другие прерывания, с большими или меньшими номерами. Это распределение номеров прерываний условно и никаким образом не закреплено аппаратно.

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

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

Элементы таблицы векторов прерываний называются векторами прерываний. В первом слове элемента таблицы записана компонента смещения, а во втором – сегментная компонента адреса обработчика прерывания.

Вектор прерывания с номером 0 находится по адресу 0000:0000, с номером 1 - по адресу 0000:0004 и т. д. В общем случае адрес вектора прерывания находится путем умножения номера прерывания на 4.

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

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

Номер

Описание

Ошибка деления. Вызывается автоматически после выполнения команд DIV или IDIV, если в результате деления происходит переполнение (например, при делении на 0). Обычно при обработке этого прерывания MS-DOS выводит сообщение об ошибке и останавливает выполнение программы. При этом для процессора i8086 адрес возврата указывает на команду, следующую после команды деления, а для процессора i80286 и более поздних моделей - на первый байт команды, вызвавшей прерывание

Прерывание пошагового режима. Вырабатывается после выполнения каждой машинной команды, если в слове флагов установлен бит пошаговой трассировки TF. Используется для отладки программ. Это прерывание не вырабатывается после пересылки данных в сегментные регистры командами MOV и POP

Аппаратное немаскируемое прерывание. Это прерывание может использоваться по-разному в разных машинах. Обычно оно вырабатывается при ошибке четности в оперативной памяти и при запросе прерывания от сопроцессора

Прерывание для трассировки. Генерируется при выполнении однобайтовой машинной команды с кодом CCh и обычно используется отладчиками для установки точки прерывания

Переполнение. Генерируется машинной командой INTO , если установлен флаг переполнения OF. Если флаг не установлен, команда INTO выполняется как NOP. Это прерывание используется для обработки ошибок при выполнении арифметических операций

Печать копии экрана. Генерируется, если пользователь нажал клавишу В программах MS-DOS обычно используется для печати образа экрана. Для процессора i80286 и более старших моделей генерируется при выполнении машинной команды BOUND, если проверяемое значение вышло за пределы заданного диапазона

Неопределенный код операции или длина команды больше 10 байт

Особый случай отсутствия арифметического сопроцессора

IRQ0 – прерывание интервального таймера, возникает 18,2 раза в секунду

IRQ1 – прерывание от клавиатуры. Генерируется, когда пользователь нажимает и отжимает клавиши. Используется для чтения данных из клавиатуры

IRQ2 – используется для каскадирования аппаратных прерываний

IRQ3 – прерывание асинхронного порта COM2

IRQ4 – прерывание асинхронного порта COM1

IRQ5 – прерывание от контроллера жесткого диска (только для компьютеров IBM PC/XT)

IRQ6 – прерывание генерируется контроллером НГМД после завершения операции ввода/вывода

IRQ7 – прерывание от параллельного адаптера. Генерируется, когда подключенный к адаптеру принтер готов к выполнению очередной операции. Обычно не используется

Обслуживание видеоадаптера

Определение конфигурации устройств в системе

Определение размера оперативной памяти

Обслуживание дисковой системы

Работа с асинхронным последовательным адаптером

Расширенный сервис

Обслуживание клавиатуры

Обслуживание принтера

Запуск BASIC в ПЗУ, если он есть

Обслуживание часов

Обработчик прерывания, возникающего, если пользователь нажал комбинацию клавиш

Программное прерывание, вызывается 18,2 раза в секунду обработчиком аппаратного прерывания таймера

Адрес видеотаблицы для контроллера видеоадаптера 6845

Указатель на таблицу параметров дискеты

Указатель на графическую таблицу для символов с кодами ASCII 128-255

Используется MS-DOS или зарезервировано для MS-DOS

Прерывания, зарезервированные для программ пользователя

Не используются

IRQ8 – прерывание от часов реального времени

IRQ9 – прерывание от контроллера EGA

IRQ10 – зарезервировано

IRQ11 – зарезервировано

IRQ12 – зарезервировано

IRQ13 – прерывание от арифметического сопроцессора

IRQ14 – прерывание от контроллера жесткого диска

IRQ15 – зарезервировано

Не используются

Зарезервировано для BASIC

Используются интерпретатором BASIC

Не используются

Прерывания, обозначенные как IRQ0 – IRQ15 являются внешними аппаратными.

Публикации по теме