Автор работы: Пользователь скрыл имя, 27 Февраля 2013 в 12:53, лекция
Прерыванием называют сигнал, генерируемый источником, таким как устройство ввода/вывода или программа системного программного обеспечения, который вызывает прерывание выполнения текущей программы. Управление передается другой программе таким образом, что выполнение первоначальной программы после обработки прерывания может быть возобновлено.
Программные прерывания.
Прерыванием называют сигнал, генерируемый источником, таким как устройство ввода/вывода или программа системного программного обеспечения, который вызывает прерывание выполнения текущей программы. Управление передается другой программе таким образом, что выполнение первоначальной программы после обработки прерывания может быть возобновлено.
Это позволяет периферийным устройствам работать независимо, показывая операционной системе через механизм прерываний, когда им необходимо связываться с центральным процессором. Примером может служить клавиатура, которая посылает информацию в CPU после нажатия клавиши. Процессор продолжает решать другие задачи до тех пор, пока, получив прерывание, он не опросит периферийные устройства, чтобы установить причину прерывания. Если прерывание происходит от клавиатуры, CPU получает от нее код клавиши, которая была нажата, и запоминает его в буфере клавиатуры, прежде чем продолжить свою работу.
Некоторые операционные системы используют механизм прерываний не только для обслуживания внешних устройств, но и для предоставления "своих" услуг. Например, ОС MS-DOS взаимодействует с системными и прикладными программами преимущественно через систему прерываний.
Термин прерывание (interrupt) имеет два разных значения: внешнее прерывание (или аппаратное - hardware interrupt) и внутреннее прерывание.
Аппаратное прерывание вызывается внешними по отношению к микропроцессору событиями. У CPU есть два входа INTR (маскируемое прерывание) и NMI (немаскируемое прерывание, вызываемое катастрофической ситуацией), на которые поступают запросы от внешних устройств. Естественно, эти прерывания относятся к непланируемым.
Внутренние прерывания возникают внутри микропроцессора во время вычислительного процесса. К их возникновению приводит одна из следующих причин:
В общем случае система прерываний – это совокупность аппаратных и программных средств, реализующих механизм прерываний.
К аппаратным средствам системы прерываний относятся:
К программным средствам системы прерываний реального режима относятся:
Обработка прерываний.
Сигналы внешних аппаратных прерываний, возникающие в устройствах, входящих в состав компьютера (таймер, клавиатура, диски и пр.), поступают в процессор не непосредственно, а через контроллер прерываний, в качестве которого используется микросхема 8259А. Обработка аппаратного прерывания обязательно включает в себя процедуры управления контроллером прерываний. При этом методика программирования контроллера прерываний определяется не только его внутренним устройством и возможностями, но и местом в архитектуре компьютера.
К восьми входным выводам контроллера прерываний IRQ0 – IRQ7 подключаются выводы устройств, на которых возникают сигналы прерываний. Выход INT контроллера подключается к одноименному входу микропроцессора. Т.о., основное назначение контроллера прерываний – направление сигналов запросов прерываний от 8-ми (15-ти для PC/AT) устройств на единственный вход прерываний микропроцессора. При этом, кроме сигнала INT, инициирующего процедуру прерывания в микропроцессоре, контроллер передает в микропроцессор по линиям данных номер вектора, через который должна быть вызвана программа обработки поступившего прерывания. Передаваемый номер вектора образуется в контроллере прерываний путем сложения базового номера, записанного в одном из его регистров, с номером входной линии, по которой поступил запрос прерывания. Номер базового вектора заносится в контроллер автоматически в процессе начальной загрузки компьютера. Контроллер программируется через порты 20h и 21h. Очевидно, что номера векторов аппаратных прерываний однозначно связаны с номерами линий или уровнями IRQ, а через них с конкретными устройствами компьютера.
В машинах PC/AT устанавливают два контроллера, увеличивая тем самым возможное число для входных устройств до 15-ти (по сравнению с 8-ю у PC/XT): 7 у ведущего и 8 у ведомого контроллеров.
Выход INT ведомого контроллера подсоединяется к входу IRQ2 ведущего, а выход INT ведущего – к входу INT микропроцессора. Для ведущего контроллера базовый вектор 08h, порты – 20h и 21h. Ведомому контроллеру назначаются порты A0h и A1h, базовый вектор 70h. Т.о., векторы аппаратных прерываний в компьютерах PC/AT лежат в диапазонах 08h..Fh и 70h..77h.
Рассмотрим внутреннюю структуру контроллера. Логически в ней можно выделить 4 основных узла:
Все узлы контроллера восьмибитовые, по одному биту на каждый входной сигнал.
Рис. Логическая структура контроллера прерываний.
IRQ0 ® IRQ1 IRQ2 ® IRQ3 ® IRQ4 ® IRQ5 ® IRQ6 ® IRQ7 ® |
0 1-0 0 0 0 0 0 0 |
0 1 0 0 0 0 0 0 |
x |
0 0 0 0 0 0 0 |
EOI | |||
Регистр запросов IRR Порт 20h |
Регистр маски IMR Порт 21h |
Схема анализа приоритетов Порт 20h |
Регистр обслуживаемых запросов ISR Порт 20h |
Сигнал запроса прерываний IRQ от устройства IRQ1, т.е. сигнал от клавиатуры, поступает на вход регистра запросов и устанавливает в 1 соответствующий бит этого регистра. Далее по пути сигнала стоит регистр маски, программируемый через порт 21h. Значение 0 в бите маски разрешает прохождение сигнала, значение 1 – запрещает. Пройдя через маску, сигнал поступает на схему анализа приоритетов. При стандартной настройке схемы анализа приоритетов (она программируется посылкой определенных команд через порт 20h) приоритеты сигналов IRQ снижаются по мере роста номера сигнала, т.е. максимальным приоритетом обладает сигнал IRQ0, минимальным – сигнал IRQ7. В компьютерах AT, где ведомый контроллер подключается к входу IRQ2 ведущего, все приоритеты ведомого контролера располагаются между приоритетами уровней IRQ1 и IRQ3 ведущего, т.е. образуется такая цепочка приоритетов: IRQ0 – IRQ1 – (ведомый) IRQ8 … IRQ15 (ведомый) – IRQ3…IRQ7.
Приоритеты уровней прерываний не имеют никакого значения, пока прерывания поступают редко и не накладываются друг на друга. Вопрос о приоритетах становится важным только в том случае, если очередной сигнал прерывания приходит в тот момент, когда еще не закончено выполнение программы обработки предыдущего прерывания.
Пройдя через схему анализа приоритетов, сигнал запроса прерывания поступает на вход регистра обслуживаемых запросов и дает разрешение на установку в 1 его бита (однако не устанавливает его). Одновременно сигнал поступает на вход INT CPU. Микропроцессор регистрирует поступление сигнала INT лишь в том случае, если установлен флаг разрешения прерываний IF в регистре флагов. Т.о., сброс флага IF командой CLI запрещает все аппаратные прерывания. CPU, получив сигнал INT, отзывается на него выходным сигналом INTA, который поступает в контроллер прерываний и выполняет там два действия:
Т.о., поступивший запрос, для которого началась процедура обслуживания его микропроцессором, переводится в разряд обслуживаемых. Начиная с этого момента, на тот же вход контроллера прерываний может придти следующий сигнал прерывания от устройства. Он какое-то время не будет обслуживаться, но запомнится в регистре запросов, и будет ждать своей очереди на обслуживание.
CPU, одновременно с посылкой в контроллер прерываний сигнала INTA, сбрасывает флаг IF в регистре флагов, запрещая все аппаратные прерывания. Прерывания останутся запрещенными до выполнения пользователем команды STI или до установки флага IF каким-либо другим способом.
Установка 1 в бите регистра обслуживаемых запросов воздействует на схему анализа приоритетов. Установленный бит блокирует в схеме анализа приоритетов все уровни прерываний, начиная с текущего, и ниже. Т.о., если не принять специальных мер, даже после завершения обработчика прерывания, все прерывания от данного и более низких приоритетов, останутся заблокированными. Сброс бита регистра обслуживаемых запросов осуществляется засылкой кода 20h в порт 20h для ведущего контроллера и в порт A0h – для ведомого. Этот код получил название команды или приказа E0I (End Of Interrupt – конец прерывания). Приказ конца прерывания должен возбуждаться в любом обработчике прерываний.
Исходя из изложенного, в программе обработки прерывания можно выделить три участка:
(CLI) IRQ1 |
STI
EOI
IRET |
Запрещены все вложенные прерывания, независимо от их приоритетов (IRQ0 – IRQ7)
Разрешены только вложенные прерывания с более высоким приоритетом (IRQ0)
Разрешены все вложенные прерывания, независимо от их приоритетов (IRQ0 – IRQ7) |
Рис. Обобщенная структура программы обработки прерывания.
Поскольку CPU, получив сигнал INT, сбрасывает флаг IF, при входе в обработчик все прерывания оказываются запрещенными, и программа не может быть прервана внешними сигналами. Команда STI, выполненная в программе, устанавливает флаг IF и разрешает прохождение запросов прерываний в процессор. Однако, все уровни прерываний, начиная с текущего, остаются заблокированными в контроллере. В результате работа обработчика может быть прервана только при поступлении запроса прерывания более высокого приоритета (в рассматриваемом примере IRQ0). Такая ситуация называется вложенным прерыванием.
Выполнение в обработчике команд, реализующих приказ конца прерывания EOI, снимает блокировку в контроллере, и, начиная с этого момента, запрос прерывания любого уровня прервет выполнение обработчика. Особенно неприятной может оказаться ситуация, когда обработчик прерывается сигналом запроса прерывания того же уровня. Это приводит к тому, что программа обработчика, не дойдя до конца, опять начинает выполняться с самого начала, т.е. происходит повторный вход в программу. Для того, чтобы такое явление не нарушило работоспособность системы, обработчик прерывания должен быть написан по определенным правилам, обеспечивающим его реентерабельность.
Практически структуру программы обработки прерывания выбирают, исходя из конкретных условий. Часто в самом начале программы выполняют команду STI, чтобы не задерживать обработку прерываний от более приоритетных устройств (в частности таймера). Приказ конца прерывания EOI посылается в контроллер в самом конце программы, перед завершающей командой IRET с тем, чтобы полностью исключить вложенное прерывание от запросов того же уровня.
IRQ → |
STI
CLI MOV AL, 20h OUT 20h, AL IRET |
IRQ →
Команды EOI |
MOV AL, 20h OUT 20h, AL IRET |
Команда EOI |
а) |
б) |
Рис. Типичные структуры программы обработки прерываний: при разрешенных вложенных прерываниях (а) и при запрещенных вложенных прерываниях (б).
рис………………………