![]() |
Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | |
|
Система прерываний любого компьютера является его важнейшей частью, позволяющей быстро реагировать на события, обработка которых должна выполнятся немедленно: сигналы от машинных таймеров, нажатия клавиш клавиатуры или мыши, сбои памяти и пр. Рассмотрим в общих чертах компоненты этой системы.
Сигналы аппаратных прерываний, возникающие в устройствах, входящих в состав компьютера или подключенных к нему, поступают в процессор не непосредственно, а через два контроллера прерываний, один из которых называется ведущим, а второй - ведомым (рис. 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) непосредственно обратившись к таблице векторов и изменив содержимое соответствующих ячеек.
Дата публикования: 2014-11-28; Прочитано: 454 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!