
- •7. Ввод-вывод
- •7.1. Доступ к устройствам ввода-вывода
- •7.2. Прерывания
- •7.2.1. Аппаратное обеспечение для поддержки прерываний
- •7.2.2. Запрет и разрешение прерываний
- •7.2.3. Обслуживание нескольких устройств
- •7.2.4. Управление запросами устройств
- •7.2.5. Исключения
- •7.2.6. Прерывания в операционных системах
- •7.3. Механизм прерываний процессора Pentium
- •7.4. Прямой доступ к памяти
7.2.3. Обслуживание нескольких устройств
Рассмотрим случай, когда с процессором соединено несколько устройств, способных инициировать прерывания. Поскольку эти устройства функционально независимы, они генерируют прерывания без какой-либо определенной последовательности. Например, устройство Х может запросить прерывание во время обслуживания прерывания от устройства Y или несколько устройств могут запросить прерывания одновременно. В связи с этим возникает ряд вопросов:
1. Как процессор распознает устройство, запросившее прерывание?
2. Если разным устройствам требуются различные программы обработки прерываний, как процессор в каждом случае будет получать начальный адрес соответствующей программы?
3. Можно ли устройствам прерывать процессор, пока обслуживается другое прерывание?
4. Как должны обрабатываться два или несколько одновременно поступивших запросов на прерывания?
Существуют разные способы решения этих вопросов, и при выборе компьютера для определенных задач обычно учитывают, какая стратегия в нем используется.
Итак, когда процессор получает запрос прерывания по общей линии (рис. 7.6), ему требуется дополнительная информация, для того чтобы определить, какое из устройств активизировало эту линию. Далее, если два устройства активизировали линию одновременно, нужно выбрать одно из них для обслуживания. Когда первое устройство будет обслужено, наступит очередь второго.
Информация, необходимая для идентификации устройства, запросившего данное прерывание, имеется в его регистре состояния. Когда устройство генерирует запрос прерывания, оно устанавливает в 1 один из разрядов в регистре состояния, называемый разрядом IRQ. Например, сигналы запросов на прерывания от клавиатуры и дисплея устанавливают в 1 биты KIRQ DIRQ (см. рис. 7.3). Простейший способ определения устройства, запросившего прерывание, заключается в опросе всех присоединенных к шине устройств ввода-вывода. Сначала обслуживается устройство, у которого разряд IRQ был установлен первым. Для обработки запроса вызывается соответствующая программа.
Реализовать описанную схему достаточно легко. Ее главным недостатком является время, уходящее на проверку IRQ-разрядов тех устройств, которые не запрашивали прерывание. В качестве альтернативы могут использоваться векторные прерывания, о которых рассказывается в следующем разделе.
Векторные прерывания
Для сокращения времени, уходящего на опрос устройств, можно реализовать схему, обратную описанной выше: устройство само будет идентифицировать себя для процессора. Это позволит процессору начинать выполнение программы обработки прерывания сразу же после поступления запроса. Термин векторные прерывания относится ко всем схемам обработки прерываний, основанным на таком подходе.
Устройство, запросившее прерывание, может идентифицировать себя с помощью специального кода, пересылаемого процессору по шине, что позволяет ему, процессору, идентифицировать отдельные устройства даже в том случае, если они используют одну линию запроса прерывания. Этот код способен определять начальный адрес программы обработки прерывания, предназначенной для данного устройства. Длина адреса обычно составляет от 4 до 8 разрядов. Оставшаяся часть адреса формируется процессором на основе данных, хранящихся в специально выделенной области памяти с адресами программ обработки прерываний.
При этом предполагается, что программа обработки прерываний от конкретного устройства должна всегда располагаться по одному и тому же адресу. Для обеспечения большей ее гибкости программист может поместить по этому адресу команду, выполняющую переход к соответствующей подпрограмме. Во многих компьютерах такой переход автоматически выполняется механизмом обработки прерываний. То место в памяти, на которое указывает вызвавшее прерывание устройство, используется для хранения начального адреса программы обработки прерывания. Процессор считывает этот адрес, называемый вектором прерывания, и загружает его в регистр PC. Кроме адреса вектор прерывания может содержать новое значение регистра состояния процессора.
В большинстве компьютеров устройства ввода-вывода направляют код вектора прерывания по шине данных с использованием управляющих сигналов шины, и это является гарантией того, что устройства не будут мешать друг другу. Когда устройство направляет процессору запрос прерывания, тот, возможно, еще не готов немедленно его получить. Не исключено, что ему, к примеру, сначала нужно завершить выполнение текущей команды, для чего, может быть, потребуется использовать шину. Если в момент запроса прерывания запрещены, возможны еще большие задержки. В таком случае устройство должно дождаться готовности процессора и лишь после этого поместить данные на шину. Когда процессор готов получить код вектора прерывания, он активизирует линию подтверждения прерывания INTA. Устройство ввода-вывода отвечает на это отправкой кода вектора прерывания и выдачей сигнала INTR.
Вложенные прерывания
В разделе 7.2.1 было сделано предположение, что на время выполнения программы обработки прерывания все прерывания должны быть запрещены. При этом условии запрос одного устройства не сможет вызвать более одного прерывания. Этот принцип часто используется и в тех случаях, когда в системе имеется несколько устройств. В результате их прерывания обрабатываются по очереди, а начатая программа обработки прерывания выполняется до конца, до того как процессор получает запрос прерывания от другого устройства. Программы обработки прерываний в большинстве своем достаточно коротки, и вызываемая ими задержка для преобладающей части простых устройств обычно бывает вполне приемлемой.
Однако в некоторых случаях большая задержка с ответом на запрос прерывания может привести к неверному функционированию устройств. В качестве примера рассмотрим работу компьютера, отслеживающего время с помощью таймера реального времени — устройства, которое направляет процессору запросы прерываний через фиксированные промежутки времени. По каждому из таких запросов процессор выполняет короткую программу обработки прерывания, увеличивающую хранящийся в памяти набор значений счетчиков, содержащих количество секунд, минут и т. д. Правильное функционирование таймера возможно при условии, что время задержки перед обработкой запроса прерывания значительно меньше временного интервала между запросами. Это требование будет выполняться лишь в том случае, если запрос прерывания от таймера будет приниматься во время выполнения программы обработки прерывания, вызванного другим устройством.
Последний пример показывает, что для правильной организации ввода-вывода должна использоваться система приоритетов устройств. Во время обслуживания процессором прерывания от устройства им должны приниматься запросы прерываний от устройств с более высоким приоритетом.
Многоуровневая система приоритетов означает, что в ходе выполнения программы обработки прерываний запросы на прерывания от одних устройств будут приниматься, а от других — нет. Для того чтобы реализовать такую схему обработки прерываний, необходимо процессору присвоить уровень приоритета, который будет меняться в зависимости от выполняемой программы. Уровень приоритета процессора — это уровень приоритета текущей выполняемой программы. Процессор принимает прерывания от устройств, имеющих более высокий приоритет, чем его собственный. Когда начинается выполнение программы обработки прерываний некоторого устройства, процессору назначается приоритет этого устройства. Тем самым запрещаются прерывания от любых устройств с тем же или более низким приоритетом.
Приоритет процессора обычно задается несколькими разрядами в слове, определяющем его состояние. Он может быть изменен при помощи программных команд, записывающих данные в регистр FX. Эти привилегированные команды выполняются лишь при условии, что процессор работает в режиме супервизора. (В данном режиме могут выполняться только программы операционной системы.) Перед началом реализации прикладных программ процессор переключается в пользовательский режим. Таким образом, пользовательская программа не может случайно или намеренно изменить приоритет процессора и нарушить работу системы. Попытка выполнить привилегированную команду в пользовательском режиме вызывает прерывание особого типа, которое называется исключением защиты (privilege exception) и описано в разделе 7.2.5.
Многоуровневая схема приоритетов может быть реализована с помощью отдельных линий запроса и подтверждения прерываний для каждого устройства, как показано на рис. 7.7. Каждой линии запроса прерывания присваивается свой уровень приоритета. Запросы прерываний, получаемые по этим линиям, направляются на арбитражную схему процессора. Запрос принимается только в том случае, если у него более высокий уровень приоритета, чем у процессора в данный момент.
Рис. 7.7. Реализация приоритетов прерываний с использованием индивидуальных линий подтверждения прерывания
Одновременные запросы
Теперь давайте рассмотрим проблему одновременного поступления запросов прерываний от двух или более устройств. Процессор должен располагать средствами для выбора между этими запросами. При использовании схемы приоритетов, показанной на рис. 7.7, решение получается довольно простым: процессор выбирает запрос с наивысшим приоритетом. Но если несколько устройств используют одну линию запроса прерывания, как на рис. 7.6, то необходим иной механизм.
В таком случае проще всего опрашивать регистры состояния устройств ввода-вывода. Причем приоритеты этих устройств будут определяться порядком их опроса. При использовании векторных прерываний выбирается только одно устройство, которое должно отправить свой код вектора прерывания. Широко распространена схема соединения устройств в виде гирляндной цепи (рис. 7.8, а). При такой схеме линия запроса прерывания INTR является общей для всех устройств, а линия подтверждения прерывания INTA соединяет устройства в гарляндную цепь, так что сигнал по очереди проходит через каждое из них. Когда несколько устройств одновременно генерируют запрос прерывания и активизируется линия INTR, процессор отвечает установкой сигнала на линии INTA в значение 1. Первым этот сигнал получает устройство 1. Если обслуживание ему не требуется, оно пересылает сигнал устройству 2. Если же устройство отправило запрос прерывания и ждет ответа, оно блокирует сигнал INTA и помещает свой идентификационный код на линии данных. Таким образом, в гирляндной схеме наивысший приоритет имеет устройство, которое ближе всего с точки зрения схемы подключения расположено к процессору.
Для реализации схемы, приведенной на рис. 7.8, а, требуется значительно меньше проводов, чем для отдельных соединений, показанных на рис. 7.7. Главным преимуществом схемы на рис. 4.7 является то обстоятельство, что процессор может выбирать устройства с учетом их приоритетов. Эти схемы можно объединить и в более универсальную структуру. На рис. 7.8, б устройства объединены в группы, каждой из которых назначен свой приоритет. Внутри группы устройства соединены в гирляндную цепь. Такая структура используется во многих компьютерных системах.
Рис. 7.8. Схемы приоритетов прерываний: гирляндная цепь (а); группы с приоритетами (б);