Механизм прерываний
1. Прерывания
Один из важнейших моментов, которые отличают один компьютер от других машин, состоит в том, что компьютеры могут реагировать на непредсказуемое разнообразие выполняемой ими работы. Это достигается с помощью так называемых прерываний.
Отключите систему прерываний – и «жизнь» в операционной системе немедленно остановится. Периодические прерывания от таймера вызывают смену процессов в мультипрограммной операционной системе, а прерывания от устройств ввода-вывода управляют потоками данных, которыми вычислительная система обменивается с внешним миром.
Система прерываний переводит процессор на выполнение потока команд, отличного от того, который выполняется до сих пор, с последующим возвратом к исходному коду.
Переключение по прерыванию отличается от переключения, которое происходит по команде безусловного или условного перехода, предусмотренной программистом в потоке команд приложения. Переход по команде происходит в заранее определенных программистом точках программы в зависимости от исходных данных, обрабатываемых программой. Прерывание же происходит в произвольной точке потока команд программы, которую программист не может прогнозировать. Прерывание возникает либо в зависимости от внешних по отношению к процессу выполнения программы событий, либо при появлении непредвиденных аварийных ситуаций в процессе выполнения данной программы. Сходство прерываний с процедурами состоит в том, что в обоих случаях выполняется некоторая подпрограмма, обрабатывающая специальную ситуацию, а затем продолжается выполнение основной ветви программы.
Без прерываний было бы очень трудно обеспечить эффективную работу компьютера. С одной стороны, желательно, чтобы компьютер был занят возложенной на него работой, с другой стороны, желательна его мгновенная реакция на любой требующий внимания запрос (например, нажатие клавиши).
Прерывание возникает либо в зависимости от внешних по отношению к процессу событий, либо при появлении непредвиденных аварийных ситуаций в процессе выполнения данной программы.
Если бы компьютер мог выполнять только то, что ему сообщено заранее, он не смог бы реагировать на события, не производя постоянного контроля состояния вычислительной системы и устройств. Однако прерывания позволяют процессу реагировать на события даже тогда, когда он занят другой работой.
Идея прерывания оказалась настолько полезной, что сейчас прерывания применяются в компьютере для множества целей.
Прерывания представляют собой механизм, позволяющий координировать параллельное функционирование отдельных устройств вычислительной системы и реагировать на особые состояния, возникающие в работе процессора, то есть прерывание – это принудительная передача управления от выполняемой программы к системе (а через неё - к соответствующей программе обработки прерывания), происходящая при возникновении определённого события.
Итак, главные функции механизма прерываний – это:
q распознавание или классификация прерываний;
q передача управления соответствующему обработчику прерываний;
q корректное возвращение к прерванной программе.
Переход от прерываемой программы к обработчику и обратно должен выполняться как можно быстрей. Одним из самых простых и быстрых методов является использование таблицы, содержащей перечень всех допустимых для компьютера прерываний и адреса соответствующих обработчиков. Для корректного возвращения к прерванной программе перед передачей управления обработчику прерываний содержимое регистров процессора запоминается либо в памяти с прямым доступом, либо в системном стеке (system stack).
Алгоритм обработки прерываний
Механизм обработки прерываний независимо от архитектуры вычислительной системы подразумевает выполнение некоторой последовательности шагов.
1. Установление факта прерывания (приём сигнала запроса на прерывание) и идентификация прерывания.
2. Запоминание состояния прерванного процесса вычислений. Состояние процесса выполнения программы определяется, прежде всего, значением счетчика команд (адресом следующей команды), содержимым регистров процессора, и может включать также спецификацию режима (например, режим пользовательский или привилегированный) и другую информацию.
3. Управление аппаратно передается на подпрограмму обработки прерывания.
4. Сохранение информации о прерванной программе, которую не удалось спасти на шаге 2 с помощью аппаратуры. В некоторых процессорах предусматривается запоминание довольно большого объема информации о состоянии прерванных вычислений.
5. Собственно выполнение программы, связанное с обработкой прерывания. Эта работа может быть выполнена той же подпрограммой, на которую было передано управление на шаге 3, но в операционных системах достаточно часто она реализуется путем последующего вызова соответствующей подпрограммы.
6. Восстановление информации, относящейся к прерванному процессу (этап, обратный шагу 4).
7. Возврат на прерванную программу.
Шаги 1-3 реализуются аппаратно, шаги 4-7 – программно.
На Рис. 1 показано, что при возникновении запроса на прерывание естественных ход вычислений нарушается и управление передается на программу обработки возникшего прерывания. При этом средствами аппаратуры сохраняется (как правило, с помощью механизмов стековой памяти) адрес той команды, с которой следует продолжить выполнение прерванной программы. После выполнения программы обработки прерывания управление возвращается на прерванную ранее программу посредством занесения в указатель команд сохраненного адреса команды, которую нужно было бы выполнить, если бы возникло прерывание. Однако такая схема используется только в самых простых программных средах. В мультипрограммных операционных системах обработки прерываний происходит по более сложным схемам, о чем будет изложено ниже.
Рис. 1. Обработка прерывания
Типы прерываний
В зависимости от источника прерывания делятся на три вида:
- внешние;
- внутренние;
- программные.
Внешние прерывания могут возникать от аппаратных устройств (вне прерываемого процесса), они сообщают о чем-то, требующим внимания процессора. Так же они могут возникать в результате действий пользователя за клавиатурой.
Так же эти прерывания называют аппаратными, так как возникают после подачи устройством электрического сигнала, который подается на специальный вход прерывания процессора.
Например:
q прерывания от таймера;
q прерывания от внешних устройств (прерывания по вводу-выводу);
q прерывания по нарушению питания;
q прерывания с пульта оператора вычислительной системы;
q прерывания от другого процессора или другой вычислительной системы.
Внутренние прерывания вызываются событиями, которые связаны с работой процессора и являются синхронными с его операциями. Могут быть вызваны при обнаружении ошибки при выполнении программы. Это похоже на то, как если бы вы при чтении какого-либо предложения встретили «РБНСС ЗМЙ ЮДЙХМ ЯСМ ЖЯК», т.е. полнейшую бессмыслицу. Аналогичная ситуация может возникнуть и в компьютере. Процессор может встретить команды, не имеющие для него никакого смысла, или данные, которые нельзя обработать. Например, нулевой делитель, ошибки защиты памяти, обращение по несуществующему адресу, попытка выполнить привилегированную инструкцию в пользовательском режиме и т.п.
В подробных ситуациях процессор генерирует прерывание, называемое особым случаем или исключением.
Программные прерывания не возникают непредвиденно. Идея прерываний настолько мощная, что с помощью прерывания программы могут запросить обслуживания, выполняемые другими программами. Программные прерывания возникают при выполнении особой команды процессора и представляют собой удобный способ вызова процедур ОС.
Сигналы, вызывающие прерывания, формируются вне процессора или в самом процессоре, они могут возникать одновременно. Выбор одного из них для обработки осуществляется на основе приоритетов, приписанных каждому типу прерывания. Так, со всей очевидностью, прерывания от схем контроля процессора должны обладать наивысшим приоритетом (действительно, если аппаратура работает неправильно, то не имеет смысла продолжать обработку информации).
На рис. 2 изображен обычный порядок (приоритеты) обработки прерываний в зависимости от типа прерываний. Учет приоритета может быть встроен в технические средства, а также определяться операционной системой.
Рис. 2. Распределение прерываний по уровням приоритета
Наличие сигнала прерывания не обязательно должно вызывать прерывание исполняющейся программы. Процессор может обладать средствами защиты от прерываний. Программное управление этими средствами (существуют специальные команды для управления работой системы прерываний) позволяет операционной системе регулировать обработку сигналов прерывания, заставляя процессор обрабатывать их сразу по приходу, откладывать обработку на некоторое время, полностью игнорировать прерывания. Обычно операция прерывания выполняется только после завершения выполнения текущей команды. Поскольку сигналы прерывания возникают в произвольные моменты времени, то на момент прерывания может существовать несколько сигналов прерывания, которые могут быть обработаны только последовательно. Чтобы обработать сигналы прерывания в разумном порядке, им (как уже отмечалось) присваиваются приоритеты. Сигнал с более высоким приоритетом обрабатывается в первую очередь, обработка остальных сигналов прерывания откладывается.
Управление ходом выполнения задач со стороны операционной системы заключается в организации реакций на прерывания, в организации обмена информацией (данными и программами), в предоставлении необходимых ресурсов, в динамике выполнения задачи и в организации сервиса. Причины прерываний определяет операционная система (модуль, который называют супервизором прерываний), она же и выполняет действия, необходимые при данном прерывании и в данной ситуации. Супервизор прерываний (первые две секции на рис.1) прежде всего сохраняет в дескрипторе текущей задачи рабочие регистры процессора, определяющие контекст прерываемого вычислительного процесса. Далее он определяет ту подпрограмму, которая должна выполнить действия, связанные с обслуживанием настоящего (текущего) запроса на прерывание. Перед тем, как передать управление на эту подпрограмму, супервизор прерываний устанавливает необходимый режим обработки прерывания. После выполнения подпрограммы обработки прерывания управление вновь передается ядру операционной системы. На этот раз уже на тот модуль, который занимается диспетчеризацией задач. И уже диспетчер задач, в свою очередь, восстановит контекст той задачи, которой будет решено выделить процессор. Рассмотренную схему иллюстрирует рис. 3.
Естественно, что это только общий принцип. В конкретных процессорах и в конкретных операционных системах могут существовать некоторые отступления от рассмотренной схемы и/или дополнения. Например, в современных процессорах часто имеются специальные аппаратные возможности для сохранения контекста прерываемого вычислительного процесса непосредственно в его дескрипторе, то есть дескриптор процесса (по крайней мере его часть) становится структурой данных, которую поддерживает аппаратура.
Рис. 3. Обработка прерывания при участии супервизоров ОС
Механизм прерываний
Механизм прерываний поддерживается аппаратными средствами компьютера и программными средствами ОС.
Существуют два основных способа выполнения прерывания:
1. векторный (vectored), когда в процессор передается номер вызываемой процедуры обработки прерывания;
2. опрашиваемый (polled), когда процессор вынужден последовательно опрашивать потенциальные источники запроса прерывания.
Устройствам, которые используют векторные прерывания, назначается вектор прерываний.
Он представляет собой электрический сигнал и несет в себе информацию о закрепленном за данным устройством номере, который идентифицирует соответствующий обработчик прерываний. Процессор использует этот вектор для нахождения обработчика данного прерывания.
Для упорядочивания процессов обработки прерываний все источники прерываний распределяются по нескольким приоритетным уровням. С каждым уровнем прерываний может быть связано несколько устройств и соответственно несколько программ-обработчиков прерываний.
При использовании опрашиваемых прерываний процессор получает от устройства информацию от уровня приоритета прерывания. Процессор должен определить, какое устройство из тех, которые связаны с данным уровнем прерываний, действительно запросило прерывание. Для этого вызываются все обработчики прерываний, для данного уровня приоритета, пока один из уровня обработчика не подтвердит, что прерывание пришло от устройства, обслуживаемого им.
Для некоторых аппаратных платформ могут сочетаться оба типа прерываний.
Вектор прерываний, передаваемый в процессор, представляет собой целое число в диапазоне от 0 до 255, указывающее на одну их 256 программ обработки прерываний, адреса которых хранятся в таблице обработчиков прерываний. В том случае, когда к каждой линии IRQ подключается только одно устройство, процедура обработки прерываний не выполняет никаких дополнительных опросов для выяснения того, какое именно устройство запросило прерывание. Однако при совместном использовании одного уровня IRQ несколькими устройствами программа обработки прерываний должна дополнительно выполнить опрос всех этих устройств.
Обобщенно последовательность действий аппаратных и программных средств по обработке прерывания можно описать следующим образом.
1. При возникновении сигнала (для аппаратных прерываний) или условия (для внутренних прерываний) прерывание происходит первичное аппаратное распознавание типа прерывания. Если прерывания данного типа в настоящий момент запрещены (приоритетной схемой или механизмом маскирования), то процессор продолжает поддерживать естественный ход выполнения команд. Иначе происходит автоматический вызов процедуры обработки прерывания, адрес которой находится в специальной таблице ОС, размещаемой либо в регистрах процессора, либо в определенном месте ОП.
2. Автоматически сохраняется некоторая часть контекста прерванного потока, которая позволяет ядру возобновить исполнение потока процессора после обработки прерывания (это – значение счетчика команд, слова состояния машины, хранящего признаки основных регистров работы процессора, а так же нескольких регистров общего назначения, которые требуются программе обработки прерывания). Может быть сохранен и полный контекст процессора, если ОС обслуживает данное прерывание со сменой процессора.
3. Временно запрещаются прерывания данного типа, чтобы не образовалась очередь вложенных друг в друга потоков одной и той же процедуры.
4. После того как прерывание обработанного ядром операционной системы, прерванный контекст восстанавливается аппаратно по команде возврата из прерываний (например, адрес следующей команды и слово состояния машины), а часть – программным способом, с помощью явных команд извлечения данных из списка. При возврате из прерывания блокировка повторных прерываний данного типа снимается.