Организация системы прерываний
Назначение системы прерываний – это быстрая реакция на события, происходящие как внутри ЭВМ, так и за ее пределами. Прерывания, вызванные вне ЭВМ, вызываются внешними устройствами, периферийными устройствами. Под операцией прерывания понимается прекращение процесса выполнения текущей программы и переключение процессора на выполнение другой программы, обслуживающей причину прерывания. Основное назначение прерываний – это реагирование на критические события. По завершению обслуживания прерывания, прерванный процесс необходимо восстановить и продолжить (с того места, на котором он был прерван). С целью запоминания процесса необходимо собрать всю информацию о текущем состоянии. Данную информацию обычно называют вектор состояния процесса. Он включает слово состояния процессора (ССП), которое включает адрес следующей команды и признаки состояния (различные флаги, значения переменных, значение регистров общего назначения (РОН) и т.д.). Сам вектор состояния процесса располагается в области оперативной памяти, которая обычно организована как стек. Операция прерывания сводится к выполнению следующих действий: 1) выполнение текущей программы прерывается. Прерывание осуществляется по завершении i-той команды программы. Выполнение команды i+1 не начинается. 2) запоминается информация о состоянии процессора в виде ССП (адрес следующей команды i+1, признаки результата, различные флаги, маски и т.д.). 3) управление передается специальной программе (обработчику), обслуживающей данную причину прерывания. Данная программа выполняет все действия, необходимые для данного прерывания. Обработчик прерываний. Типовая структура обработчика прерываний состоит в следующем: 1) сохранение используемых в регистре общего назначения данных в ОП. 2) обработка прерывания. 3) восстановление регистров общего назначения (из ОП в РОН). Причины формирования прерываний. Все причины делят на внутренние и внешние. К внутренним причинам относят два типа: 1) это события, при возникновении которых нормальное продолжение выполняемого процесса невозможно (или бессмысленно). 2) причины, естественные для выполняемого процесса. К внешним причинам (события которые возникают вне вычислительной системы) относят: 1) от неких внешних устройств ввода/вывода (напр. клавиатурное прерывание). 2) от различных таймеров. 3) другие вычислительные системы (ПК, микро ЭВМ и т.д.). Прерывание от УВВ. Данные прерывания запускаются в момент готовности устройства к обмену информацией. Данный способ ВВ используется для обслуживания медленнодействующих периферийных устройств (напр. клавиатура). Бессмысленное выполнение программы. Это могут быть сигналы с различных схем контроля, систем локализации неисправностей и т.д. Иногда обработчиком прерываний может быть человек (некий оператор, ремонтник и т.д.). |
Прерывания и исключения - это события, которые указывают на возникновение в системе или в выполняемой в данный момент задаче определенных условий, требующих вмешательства процессора. Возникновение таких событий вынуждает процессор прервать выполнение текущей задачи и передать управление специальной процедуре либо задаче, называемой обработчиком прерывания или обработчиком исключения.
Различные синхронные и асинхронные события в системе на основе ЦП IA-32 можно классифицировать следующим образом:
Прерывания обычно возникают в произвольный момент времени. Прерывания бывают аппаратные (или внешние) и программные.
Внешние прерывания генерируются по аппаратному сигналу, поступающему от периферийного оборудования, когда оно требует обслуживания. Процессор определяет необходимость обработки внешнего прерывания по наличию сигнала на одном из контактов INTR# или NMI#. При появлении сигнала на линии INTR# внешний контроллер прерываний (например, 8259A) должен предоставить процессору вектор (номер) прерывания. С линией NMI# всегда связано прерывание #2.
В процессорах Pentium, P6 и Pentium 4 эти линии могут быть сконфигурированы на использование встроенным контроллером прерываний - APIC (Advanced Programmable Interrupt Controller), тогда они называются LINT0 и LINT1 и их назначение определяется настройками APIC.
Прерывания, которые генерируются при поступлении сигнала на вход INTR#, называют маскируемыми аппаратными прерываниями. Бит IF в регистре флагов позволяет заблокировать (замаскировать) обработку таких прерываний.
Прерывания, генерируемые сигналом NMI#, называют немаскируемыми аппаратными прерываниями. Немаскируемые прерывания не блокируются флагом IF. Пока выполняется обработчик немаскируемого прерывания, процессор блокирует получение немаскируемых прерываний до выполнения инструкции IRET, чтобы исключить одновременную обработку нескольких немаскируемых прерываний.
Прерывания всегда обрабатываются на границе инструкций, т.е. при появлении сигнала на контакте INTR# или NMI# процессор сначала завершит выполняемую в данный момент инструкцию (или итерацию при наличии префикса повторения), а только потом начнет обрабатывать прерывание. Помещаемый в стек обработчика адрес очередной инструкции позволяет корректно возобновить выполнение прерванной программы.
С помощью инструкции INT n (n - номер прерывания) можно сгенерировать прерывание с любым номером 0...255. Такие прерывания называют программными. Состояние бита IF в регистре флагов не влияет на возможность генерации программных прерываний. Программные прерывания могут использоваться для доступа к сервисам операционной системы (например, INT $21 - сервисы DOS, INT $80 - сервисы Linux), функциям драйверов устройств (например, INT $33 - драйвер мыши) или специальным сервисам (INT $10 - видео-сервис BIOS, INT $31 - DPMI-сервис), INT $67 - сервис EMS).
Хотя номер прерывания в этой инструкции может быть любым, следует отметить, что, например, при использовании вектора #2 для вызова обработчика немаскируемого прерывания внутреннее состояние процессора будет отличаться от того, которое бывает при обработке аппаратного немаскируемого прерывания. Аналогично, попытка вызвать обработчик исключения с помощью этой инструкции может оказаться неудачной, т.к. при возникновении большинства исключений в стек включается код ошибки, а при генерации программного прерывания этого не происходит. Обработчик исключения извлекает из стека код ошибки, а в случае программного прерывания из стека будет ошибочно извлечен адрес возврата, что нарушит целостность стека и, в конечном итоге, скорее всего, приведет к исключению #13 или более тяжелому.
Исключения являются для процессора внутренними событиями и сигнализируют о каких-либо ошибочных условиях при выполнении той или иной инструкции. Источниками исключений являются три типа событий:
генерируемые программой исключения, позволяющие программе контролировать определенные условия в заданных точках программы (INTO - проверка на переполнение, INT3 - контрольная точка, BOUND - проверка границ массива);
исключения машинного контроля (#18), возникающие в процессе контроля операций внутри чипа и транзакций на шине процессора (Pentium, P6 и Pentium 4);
обнаруженные процессором ошибки в программе (деление на ноль, нарушение правил защиты, отсутствие страницы и т.п.)
Исключения процессора, в зависимости от способа генерации и возможности рестарта вызвавшей исключение команды, подразделяются на нарушения, ловушки и аварии.
n Нарушение (отказ) - это исключение, которое обнаруживается либо перед исполнением, либо во время исполнения команды. При этом процессор переходит в состояние, позволяющее осуществить рестарт команды. В качестве адреса возврата в стек обработчика заносится адрес вызвавшей исключение команды.
n Ловушка возникает на границе команд сразу же после команды, вызвавшей это исключение. Значения регистров CS и EIP, заносимые в стек обработчика, указывают на очередную команду. Например, если ловушка сработала на команде JMP, то в стеке запоминаются значения регистров CS и EIP, указывающие на ссылку команды JMP.
Авария не позволяет осуществить рестарт программы, и зачастую нельзя точно локализовать команду, вызвавшую это исключение. Исключения типа "авария" генерируются при обнаружении серьезных ошибок, таких как неразрешенные или несовместимые значения в системных таблицах или аппаратные сбои.
Архитектура IA-32 предоставляет механизм обработки прерываний и исключений, прозрачный для прикладного и системного программного обеспечения. При возникновении прерывания или исключения текущая выполняемая задача автоматически приостанавливается на время действий обработчика, после чего ее выполнение возобновляется без потери непрерывности, кроме случаев, когда обработка прерывания или исключения вынуждает завершить программу.
Все прерывания и исключения имеют номер (иногда именуемый вектором) в диапазоне от 0 до 255. Номера 0...31 зарезервированы фирмой Intel для исключений.