Обработка прерывания в IBM PC
Обработка прерываний производится в три этапа:
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.
Аппаратные прерывания могут быть инициированы программно командой микропроцессора:
int n ; где n - номер аппаратного прерывания в соответствии с таблицей векторов прерываний.
Обработка машинной команды int n - это программное прерывание. С помощью программных прерываний программист может обратиться в нужное для него время за обслуживанием своих запросов либо к ОС, либо к BIOS, либо к собственным обработчикам прерываний.