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

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

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

Рис. 1.11.Аппаратная организация прерываний.

Два контроллера используются для увеличения допустимого количества внешних устройств. Дело в том, что каждый контроллер прерываний может обслуживать сигналы лишь от 8 устройств. Для обслуживания большего количества устройств контроллеры можно объединять, образуя из них веерообразную структуру. В современных машинах устанавливают два контроллера, увеличивая тем самым возможное число входных устройств до 15 (7 у ведущего и 8 у ведомого контроллеров).

На рис. 1.11 указаны некоторые из стандартных устройств компьютера, работающих в режиме прерываний.

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

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

Рис. 1.12. Процедура обслуживания прерывания.

Самое начало оперативной памяти от адреса 0000h до 03FFh отводится под векторы прерываний - четырехбайтовые области, в которых хранятся адреса обработчиков прерываний. В два старшие байта каждого вектора записывается сегментный адрес обработчика, в два младшие - смещение (относительный адрес) точки входа в обработчик. Векторы, как и соответствующие им прерывания, имеют номера, причем вектор с номером 0 располагается, начиная с адреса 0, вектор 1 - с адреса 4, вектор 2 - с адреса 8 и т.д. Вектор с номером п занимает, таким образом, байты памяти от n*4 до n*4+3. Всего в выделенной под векторы области памяти помещается 256 векторов.

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

Обработчик прерываний всегда заканчивается командой iret (interrupt return, возврат из прерывания), выполняющей обратные действия - извлечение из стека сохраненных там слов и помещение их назад в регистры IP и CS, а также в регистр флагов. Это приводит к возврату в основную программу в ту самую точку, где она была прервана.

Прерываниепо своему смыслу есть временное прекращение какого-то процесса.

Команды INT и CALL реализуют программные прерывания. Они выполняются, когда приходит время выполнить соответствующую команду. После их выполнения программа продолжает работать с команды, стоящей за командой вызова прерывания. Существуют и аппаратные прерывания, которые происходят, когда наступает некоторое событие, внешнее по отношению к программе. Это может быть сигнал по прошествию определенного промежутка времени, нажатие клавиши, переход принтера в состояние готовности, наступление некоторого события в микропроцессоре (деление на нуль, переполнение и т.п.) и т.д. Соответственно, аппаратные прерывания, происходящие от внешних устройств, будем называть внешними, а аппаратные прерывания, происходящие от события в микропроцессоре - внутренними. Есть еще немаскируемое прерывание – NMI. Это прерывание невозможно запретить командой CLI.

Рис. 9.1. Возможные схемы перехвата прерываний.

Вызвать старую процедуру прерывания можно двумя способами

а. Пусть старый

вектор прерывания хранится в двух смежных словах: OJTNT и S_INT:

O_INT - смещение, находится в младшем слове,

S_INT - сегмент, старшее слово; предполагается, что слова расположены в сегменте данных.

Первый способ:

JMP DWORD PTR DS:[0_INT]

передаст управление старой процедуре прерывания, причем возврата в Вашу процедуру не произойдет.

Второй способ:

PUSHF

CALL DWORD PTR DS:[O_INT]

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

Перенаправить вектор можно также двумя способами:

1) используя функции DOS 25H и 35Н;

2) непосредственно обратившись к таблице векторов и изменив содержимое соответствующих ячеек.