Контроллер прерываний и микропроцессоры 80х86.

Сигналы внешних аппаратных прерываний поступают в микропроцессор не непосредственно, а через контроллер прерываний. В качестве него используется микросхема Intel8259a, которая имеет 8 входных линий, называемых линиями запроса прерывания (Interrupt Request, IRQ). Обычно в системе бывает 2 таких микросхемы, одна из которых (ведущая) подключается непосредственно к микропроцессору, а вторая (ведомая) – к входу IRQ2 ведущей микросхемы. Таким образом, всего рассматривается 15 входных линий запросов прерываний от внешних устройств. Иногда этого не хватает, и на одной линии запроса «висят» несколько устройств, вследствие чего операционной системе приходится прилагать дополнительные усилия, чтобы разобраться, откуда пришёл сигнал.

Выходами микросхемы контроллера являются сигнал INT, идущий на вход микропроцессора (CPU), и номер вектора прерывания. Обратная связь микропроцессора с контроллером осуществляется с помощью сигнала INTA. Схема сопряжения контроллера (CIED, Controller Interrupts of External Units, назовём его так) и CPU (Central Processing Unit, центрального процессора) приводится на следующей схеме функционирования (рис. V.5.1)

 

 

Сигнал прерывания, поступая в контроллер, доходит до микропроцессора не сразу.

Во-первых, в схеме контроллера присутствует регистр маски, биты которого могут быть установлены программно через порт 21h (A1h для ведомого контроллера). Наличие 1 в соответствующем бите этого 8-битного регистра запрещает прохождение сигнала от соответствующего устройства, 0 – разрешает.

Во-вторых, поступивший в контроллер запрос на обработку прерывания блокирует в нём прохождение сигналов от устройств текущего и более низкого приоритета до тех пор, пока микропроцессор не разблокирует их сигналом INTA, возникающим при подаче команды EOI (END OF INTERRUPT). Эта команда реализуется засылкой специального кода (20h) в порты 20h ведущего и A0h ведомого контроллера. Сигналы, поступившие на неразблокированные линии контроллера некоторое время могут ожидать обслуживания на входе, но до процессора не дойдут.

Приоритеты устройств стандартно расположены в порядке «сверху вниз» на рис1. (IRQ0 имеет наивысший приоритет, IRQ7 – наинизший, приоритеты IRQ8 – IRQ15 расположены между приоритетами IRQ1 и IRQ3. Однако контроллер прерываний ­– программируемое устройство, и все его регистры (маски, приоритеты, номера векторов прерываний от внешних устройств) могут быть изменены при загрузке операционной системы, и даже во время работы.

В третьих, сигнал прерывания на выходе из контроллера возбуждает линию INT, и одновременно формирует на другой линии номер вектора прерывания. Этот номер формируется из номера IRQ и так называемого «базового вектора», который равен 8 для ведущей и 70h для ведомой микросхемы (в реальном режиме; в защищённом режиме WINDOWS перепрограммирует эти номера.) По номеру прерывания CPU определяет вектор прерывания из таблицы векторов прерываний (ТВП, или IDT – Interrupt Data Table), расположенной в первом килобайте основной памяти (реальный режим). Структура ТВП следующая:

Табл. 1

IP255 CS255
. . .
IP1 CS1
IP0 CS0

 

Каждая строка таблицы содержит два слова (4 байта) – новое содержимое регистров IP и CS при входе в программу – обработчик, то есть её косвенный адрес. Эти значения автоматически загружаются в названные регистры при поступлении запроса на обработку прерывания. Старое содержимое регистров FLAGS, CS и IP сохраняется в стеке. В новом регистре FLAGS аппаратно обнуляется бит IF, что вызывает запрет на поступление прерываний от любых внешних устройств. Программа-обработчик прерывания (ПОП), допускающая обработку вложенных прерываний (т.е. если её можно прервать для выполнения обработки более приоритетного события) должна сама установить флаг IF в 1 в той точке своего исполнения, начиная с которой её можно прерывать.

В конце своего исполнения обработчик события должен разблокировать контроллер для данного и более низких приоритетов, послав в него сигнал EOI, и вернуть управление в прерванную программу командой IRET, восстанавливающей из стека регистры FLAGS, CS и IP.

 

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

 

MOV DX,inportnum

MOV AL,eoicode

OUT DX,AL

 

Номер порта inportnum и код конца прерывания eoicode зависят от особенностей конкретных схем и режима работы контроллера прерываний. А что произойдет, если прерывание от устройства возникает в середине процедуры прерывания? Если йовоё прерывание имеет приоритет меньший или равный приоритету обслуживаемого прерывания, контроллер задержит новое прерывание до завершения процедуры прерывания.

 

Если же новое прерывание имеет более высокий приоритет, чем обслуживаемое, то возможны два случая: IV Если прерывания разрешены (IF = 1), процедура прерывания будет сама прервана и вызывается процедура прерывания с более высоким приоритетом.

 

Такая ситуация называется вложением прерываний и ее правильно обрабатывают и процессор, и контроллер прерываний. 2. Если прерывания запрещены (IF = 0), новое прерывание задерживается до возврата из текущей процедуры прерывания, несмотря на то, что новое прерывание имеет более высокий приоритет. По умолчанию процессор 80286 (в реальном режиме) при входе в процедуру прерывания запрещает прерывания.

 

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

 

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

 

1. ТВП может быть расположена в любом месте ОП. Указателем на неё является регистр IDTR;

2. Строками ТВП являются 8-байтные записи, содержащие более подробную информацию (вместо нового IP там задается EIP, а также ряд индикаторов);

3. Сами события делятся на сбои (ошибки), ловушки и аварии;

4. В некоторых случаях в вершине стека сохраняется код ошибки.

5. При входе в обработчик учитываются так называемые «уровни привилегий» прерванной задачи и обработчика события.

 

Детально работу в расширенном режиме мы не рассматриваем.

 

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