Прерывания
Альтернатива опросу, применяемая практически во всех
современных процессорах, называется прерываниями
(interrupt), и состоит в значительном усложнении логики обработки
команд процессором.
Процессор имеет один или несколько входов, называемых сигналами
или линиями запроса прерывания. При появлении
сигнала на одном из входов, Процессор дожидается завершения исполнения
текущей команды и, вместо перехода к исполнению следующей команды, инициирует
обработку прерывания.
Обработка состоит в сохранении счетчика команд и, возможно, некоторм других
регистров (практически всегда сохраняется также слово состояния процессора.
В процессорах с виртуальной памятью иногда сохраняются и регистры диспетчера
памяти), и в передаче управления на адрес, определяемый типом прерывания.
По этому адресу размещается программа, обработчик
прерывания, которая и осуществляет реакцию на соответствующее прерыванию
событие. Перед завершением обработчик восстанавливает регистры, и исполнение
основной программы возобновляется с той точки, где она была прервана.
Как правило, адреса программ, соответствующих различным прерываниям собраны
в таблицу, называемую таблицей векторов прерываний, размещаемую в определенном
месте адресного пространства. У микроконтроллеров каждому возможному сигналу
прерывания обычно соответствует свой вектор. Процессоры общего назначения
часто используют более сложную схему, в которой устройство, запрашивающее
прерывание, передает процессору номер прерывания или сразу адрес обработчика.
Прерывания в PDP-11
Для примера рассмотрим организацию прерываний в машинах семейства PDP-11.
Процессоры данной архитектуры сейчас практически не используются в машинах
общего назначения, но производятся и применяются в качестве микроконтроллеров.
Ряд архитектурных решений PDP-11, разработанной в начале 70-х годов, не
потерял актуальности и поныне. В частности, подход к реализации прерываний
считается классическим [Кейслер 1986].
Процессоры семейства PDP-11 различают 128 типов прерываний и исключений
(чем прерывание отличается от исключения, см. далее). Каждому типу соответствует
процедура-обработчик. Адреса точек входа всех процедур собраны в таблицу
векторов прерываний. Эта таблица занимает 256 слов физической памяти,
начиная с нулевого адреса. Каждый элемент таблицы (вектор) содержит адрес
обработчика и новое слово состояния процессора. Позже будет объяснено,
для чего это сделано.
Процессор узнает о возникновении прерывания, если на один из входов запроса
подан сигнал. Обычно этот сигнал генерируется одним из внешних устройств.
Например, прерывание может сигнализировать о завершении операции перемещения
головки дисковода или передачи данных в режиме ПДП.
Каждый вход соответствует определенному уровню приоритета. PDP-11 имеет
восемь уровней приоритета прерывания. Прерывание происходит только когда
уровень приоритета процессора ниже приоритета запрашиваемого прерывания.
Если у процессора установлен приоритет, равный 7, внешние прерывания запрещены.
Приоритет процессора задается его словом состояния. Получив запрос, процессор
завершает исполнение текущей команды и выставляет
сигнал готовности к прерыванию. После этого внешнее устройство выставляет
на шине данных номер вектора прерывания.
Процессор считывает номер и вызывает соответствующую процедуру из таблицы.
При этом вызов обработчика прерывания отличается от вызова обычной процедуры:
при обычном вызове в стеке сохраняется только адрес команды, на которую
следует возвратить управление. При прерывании же в стеке сохраняются два
значения: адреса команды и слова состояния процессора. Новое слово состояния
берется из таблицы векторов.
При этом приоритет процессора автоматически устанавливается равным тому
значению, которое разработчик программы обработки считает правильным.
Обратите внимание: не равным приоритету обрабатываемого прерывания, а
тому, которое требует разработчик.
При завершении процедуры обработки вызывается команда RTI (ReTurn from
Interrupt— возврат из прерывания). Эта команда выталкивает из стека адрес
прерванной команды и старое слово состояния, тем самым и продолжая исполнение
прерванной программы, и восстанавливая приоритет процессора. [Кичев/Некрасов
1988].
Для сравнения: в процессорах семейства 180x86 вектор прерывания содержит
только адрес программы-обработчика, а приоритет процессора задается не
словом состояния процессора, а регистром внешнего устройства— контроллера
прерываний. Контроллер прерываний обычно устанавливает приоритет, равным
приоритету прерывания, обрабатываемого в данный момент. Чтобы повысить
или понизить этот уровень, обработчик прерывания должен программировать
контроллер. Перед завершением обработчика необходимо вернуть контроллер
прерываний в исходное состояние, выполнив над ним серию магических команд
— эпилог прерывания.
Обработка прерываний в системах с виртуальной памятью несколько усложняется:
ведь кроме адреса обработчика нам надо еще задать адресное пространство,
в котором этот адрес определен. В моделях PDP-11, имеющих диспетчер памяти,
эта проблема решается просто: для процессора в каждый момент времени заданы
два адресных пространства: пользовательское и системное. Все прерывания
обрабатываются в системном адресном пространстве. Для реализации этого
процессор имеет два набора регистров диспетчера памяти. Их наличие, с
одной стороны, снимает с обработчика прерывания обязанность переключать
адресные пространства, а с другой позволяет ядру при обработке системных
вызовов обращаться к сегменту данных пользовательского процесса.
В защищенном режиме процессоров 180x86 использован более гибкий механизм
установки адресного пространства для обработчика. По существу, с каждым
обработчиком может быть ассоциировано свое виртуальное адресное пространство.
О способе, которым это достигается, лучше прочитать в литературе по соответствующим
процессорам, например [Паппас/Марри 1993].
Прерывания лишены недостатков, которые мы указали и выше
для обработки событий при помощи опроса: ожидая события, процессор может
заниматься какой-либо другой полезной работой, а когда событие произойдет,
он приступит к обработке, не дожидаясь полного завершения этой работы.
Однако этот механизм имеет и собственные недостатки. В частности, обработка
прерывания сопряжена с гораздо большими накладными расходами чем проверка
флага и условный переход в режиме ожидания. У оптимизированных для обработки
событий микроконтроллеров разница невелика или даже может быть в пользу
механизма прерываний: приведенный в примере 6.1 цикл опроса занимает 5
циклов процессора, а обработчик прерывания у PIC вызывается в течение
3—4 циклов ([www.microchip.com PICMicro] утверждает,
что средняя задержка прерывания составляет 3,75 цикла). Таким образом,
среднее время реакции на событие в режиме опроса составляет 2,5 цикла
(по среднему времени опрос в выигрыше), а максимальное -5 циклов (в данном
случае преимущество на стороне прерываний).
Однако у процессоров общего назначения, которые при обработке прерывания
вынуждены сохранять несколько регистров и осуществлять относительно сложный
диалог с вызвавшим прерывание устройством, задержка между установкой сигнала
прерывания и исполнением первой команды его обработчика — этот интервал
и называется задержкой прерывания (interrupt latency)
— составляет десятки тактов.
Современные суперскалярные процессоры при обработке прерываний вынуждены
сбрасывать очередь предварительной выборки команд и, по крайней мере,
часть кэшей команд и данных, поэтому у .них накладные расходы еще больше.
Задержка прерывания у современных реализаций архитектуры х86 лишь ненамного
лучше, чем у 80386 хотя по скорости исполнения последовательных программ
современные процессоры превосходят 80386 на несколько порядков. Поэтому
младшие модели процессоров с архитектурой х86, 8086 и даже 8085, хотя
и не находят применения в персональных компьютерах, но продолжают выпускаться
для использования во встраиваемых приложениях или в качестве периферийных
процессоров.
Так, например, "марсоход" Sojoumer использовал в качестве управляющего
процессора 8085 на сапфировой подложке (для обеспечения радиационной устойчивости).
Это же обстоятельство является дополнительным доводом в пользу включения
в систему канальных процессоров, в данном случае с целью освобождения
центрального процессора не от опроса, а от обработки прерываний. Разработчики
больших компьютеров часто реализовывали канальные процессоры старших моделей
на основе центральных процессоров младших моделей той же серии.
|