Информатика и технология программирования

       

Механизм прерываний в архитектуре I


Прерывание в IBM PC представляет собой вызов подпрограммы по длинному (far) адресу с предварительным сохранением в стеке состояния процессора (регистр флагов) и полного текущего адреса (CS:IP). Вектор прерывания - область памяти из 4-х байтов, содержащая начальный адрес подпрограммы обработки прерывания. В терминологии Си вектор прерывания - это указатель на функцию обработки прерывания . Первые 1024 байта оперативной памяти содержат 256 векторов прерывания, имеющих номера от 0 до 255. В терминах Си такой массив векторов прерываний определяется как


void interrupt (*IVEC[256])();

Значение индекса в этом массиве имеет также называние - номер вектора прерывания. Каждому источнику аппаратного прерывания соответствует свой номер вектора прерывания. Команда "INT nn" при выполнении процессором вызывает программное прерывание с номером nn.

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



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



- контроллер прерываний аналогично имеет возможность " разрешить" или " запретить" прерывание по каждой из линий запроса. Сформированный общий запрос на прерывание с выделенным источником максимального приоритета поступает в процессор ;



- процессор также имеет возможность устанавливать собственное " разрешение" и " запрещение" прерывания, которое представлено соответствующим битом в слове состояния процессора. В Си для этой цели существуют стандартные функции enable() и disable().

Процесс вхождения в прерывание по вектору N можно условно проиллюстрировать средствами Си :



void interrupt (*IVEC[256])();

*(--SP) = FLAGS;
*(--SP) = _CS;
*(--SP) = _IP;
_CS = MK_SEG(IVEC[N]);
_IP = MK_OFFS(IVEC[N]);

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


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


- выполнить команду для контроллера прерываний
outportb(0x20,0x20), разрешающую ему продолжить процесс обслуживания последующих запросов на прерывания;




- поскольку при входе в прерывание процессор устанавливается в состояние запрещения прерывания, то реально обработка следующего прерывания может произойти только после выхода из текущего. Этим самым исключается возможность появления
ВЛОЖЕННЫХ ПРЕРЫВАНИЙ (см.ниже).

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

_IP = *SP++;
_CS = *SP++;
FLAGS = *SP++;


Содержание раздела