Алгоритм обработки прерываний по вводу выводу кратко

Обновлено: 04.07.2024

Операционная система с помощью прерываний по таймеру организует опрос устройств – периодический анализ состояния каждого внешнего устройства . В процессе работы в состоянии устройств могли произойти изменения, например, пользователь установил флэшку в USB - порт , включил или выключил принтер и т.д. При опросе устройств ОС определяет состояние каждого устройства, которое может быть следующим:

  • command- ready – готово к выполнению команд;
  • busy – занято;
  • error – ошибка.

При выполнении ввода-вывода аппаратура организует цикл busy-wait ожидания ввода-вывода с устройством: если устройство занято, процесс ждет его освобождения.

Прерывания

Линия запросов на прерывания (interrupt request – IRQ) переключается устройством ввода-вывода , которое сигнализирует с помощью запроса на прерывание о начале или окончании ввода-вывода.

Обработчик прерываний получает сигнал о прерывании. Сигнал может быть замаскирован (maskable),чтобы игнорировать или задержать прерывание – например, если прерывание произошло в обработчике другого прерывания.

Вектор прерываний – резидентный массив , содержащий адреса обработчиков прерываний в операционной системе, - используется с целью переадресовки прерывания для обработки соответствующим обработчиком (handler).

Работа с вектором прерываний основана на приоритетах внешних устройств , инициировавших прерывания.

На рис. 21.2 приведена схема ввода-вывода, управляемого прерываниями.

Ввод-вывод, управляемый прерываниями.

В таблица 2 приведены номера прерываний в процессоре Intel Pentium .

Ввод-вывод с прямым доступом к памяти (DMA)

Как уже отмечалось ранее, при традиционной организации ввода-вывода контроллер устройства использует собственную буферную память , что приводит к необходимости двойной пересылке данных – сначала процессор пересылает данные в буфер , созданный ОС, затем ОС пересылает данные в буфер устройства. Ввод-вывод с прямым доступом к памяти (Direct Memory Access – DMA) - более эффективная схема организации ввода-вывода, основанная на использовании фрагмента основной памяти в качестве буфера устройства для выполнения ввода-вывода. Схема .используется с целью избежать программируемого ввода-вывода для больших пересылок данных. Схема требует специальной аппаратуры – DMA -контроллера – в настоящее время такие контроллеры приобретают все более широкое распространение. DMA позволяет избежать участия процессора в пересылках больших объемов данных непосредственно между устройством ввода-вывода и памятью.

Как уже отмечалось, основным недостатком программно управляемого ввода-вывода являются простои процессора в ожидании, пока контроллер ПУ выполнит очередную операцию. Альтернативой может быть вариант, когда процессор выдает команду ввода-вывода, а затем продолжает делать другую полезную работу. Когда ПУ го­тово к обмену данными, контроллер ПУ извещает об этом процессор с помощью запроса на прерывание. Процессор осуществляет передачу очередного элемента данных, после чего возобновляет выполнение прерванной программы. Алгоритм обработки прерывания в процессоре приведен на рис. 25.2.

Рис. 25.2. Алгоритм обработки прерывания в процессоре

Рассмотрим процесс ввода блока данных с использованием ввода-вывода по прерыва­ниям. При этом оставим без внимания такие подробности, как сохранение и восстановления контекста, действия, выполняемые при завершении пересылки бло­ка данных, а также в случае возникновения ошибок.

Процессор в конце выполнения каждой команды (за исключением некоторых команд, после выполнения которых запрещены прерывания) проверяет наличие запросов прерывания. Когда от контроллера ПУ приходит такой сигнал, процессор сохра­няет контекст текущей программы и обрабатывает прерывание. В рассматривае­мом случае процессор читает очередную порцию данных из ПУ, записывает ее в оперативную память и выдает контроллеру ПУ команду на считывание очередной порции данных. Далее процессор восстанавливает контекст прерванной программы и возобновляет ее выполнение.

Алгоритм операции обмена по прерываниям приведен на рис. 25.3.

Рис. 25.3. Алгоритм операции обмена по прерываниям

Ввод-вывод по прерываниям эффективнее программно управляемого ввода-вывода, поскольку устра­няет ненужные ожидания, однако обработка прерывания занимает достаточно много времени процессора. Кроме того, каждая порция данных, пересылаемая из оперативной памяти в контроллер ПУ или в противоположном направлении, как и при программно управляемом вводе-выводе, проходит через процессор.

Как уже отмечалось, основным недостатком программно управляемого ввода-вывода являются простои процессора в ожидании, пока контроллер ПУ выполнит очередную операцию. Альтернативой может быть вариант, когда процессор выдает команду ввода-вывода, а затем продолжает делать другую полезную работу. Когда ПУ го­тово к обмену данными, контроллер ПУ извещает об этом процессор с помощью запроса на прерывание. Процессор осуществляет передачу очередного элемента данных, после чего возобновляет выполнение прерванной программы. Алгоритм обработки прерывания в процессоре приведен на рис. 25.2.

Рис. 25.2. Алгоритм обработки прерывания в процессоре

Рассмотрим процесс ввода блока данных с использованием ввода-вывода по прерыва­ниям. При этом оставим без внимания такие подробности, как сохранение и восстановления контекста, действия, выполняемые при завершении пересылки бло­ка данных, а также в случае возникновения ошибок.




Процессор в конце выполнения каждой команды (за исключением некоторых команд, после выполнения которых запрещены прерывания) проверяет наличие запросов прерывания. Когда от контроллера ПУ приходит такой сигнал, процессор сохра­няет контекст текущей программы и обрабатывает прерывание. В рассматривае­мом случае процессор читает очередную порцию данных из ПУ, записывает ее в оперативную память и выдает контроллеру ПУ команду на считывание очередной порции данных. Далее процессор восстанавливает контекст прерванной программы и возобновляет ее выполнение.

Алгоритм операции обмена по прерываниям приведен на рис. 25.3.

Рис. 25.3. Алгоритм операции обмена по прерываниям

Ввод-вывод по прерываниям эффективнее программно управляемого ввода-вывода, поскольку устра­няет ненужные ожидания, однако обработка прерывания занимает достаточно много времени процессора. Кроме того, каждая порция данных, пересылаемая из оперативной памяти в контроллер ПУ или в противоположном направлении, как и при программно управляемом вводе-выводе, проходит через процессор.

Прерывания

Прерывание

Исходя из вышеприведенных рассуждений, можно сказать, что прерывания могут быть внешними и внутренними.
Внешние прерывания вызываются внешними по отношению к микропроцессору событиями. На рис. ниже схематически изображена подсистема прерываний компьютера на базе микропроцессора Intel.


  • ненормальное внутреннее состояние микропроцессора, возникшее при обработке некоторой команды программы. Такие события принято называть исключительными ситуациями, или просто исключениями. Этот вид прерываний отчасти также можно отнести к непланируемым;
  • обработка машинной команды int xx. Этот тип прерываний называется программным. Это — планируемые прерывания, так как с их помощью программист обращается в нужное для него время за обслуживанием своих запросов либо к операционной системе, либо к BIOS, либо к собственным программам обработки прерываний.

Далее мы рассмотрим особенности обработки прерываний. Как уже отмечалось, микропроцессоры Intel имеют два режима работы — реальный и защищенный. В этих режимах обработка прерываний осуществляется принципиально разными методами. Поэтому на данном уроке мы дадим характеристику реального режима и рассмотрим обработку прерываний в этом режиме. На следующем уроке будет рассмотрен защищенный режим работы микропроцессора, и на последнем уроке мы рассмотрим обработку прерываний в этом режиме. Для глубокого понимания процессов, происходящих в компьютере при осуществлении прерывания, необходимо узнать о том, какие ресурсы компьютера при этом задействуются, каковы их характеристики и принципы функционирования.
В общем случае система прерываний — это совокупность программных и аппаратных средств, реализующих механизм прерываний.
К аппаратным средствам системы прерываний относятся:

  • выводы микропроцессора:
    • INTR - вывод для входного сигнала внешнего прерывания. На этот вход поступает выходной сигнал от микросхемы контроллера прерываний 8259А;
    • INTA - вывод микропроцессора для выходного сигнала подтверждения получения сигнала прерывания микропроцессором. Этот выходной сигнал поступает на одноименный вход INTA микросхемы контроллера прерываний 8259А;
    • NMI - вывод микропроцессора для входного сигнала немаскируемого прерывания;

    К программным средствам системы прерываний реального режима относятся:

    • таблица векторов прерываний. В этой таблице в определенном формате, который зависит от режима работы микропроцессора, содержатся указатели на процедуры обработки соответствующих прерываний;
    • следующие флаги в регистре флагов flags\eflags:
      • IF (Interrupt Flag) — флаг прерывания. Предназначен для так называемого маскирования (запрещения) аппаратных прерываний, то есть прерываний по входу INTR. На обработку прерываний остальных типов флаг IF влияния не оказывает. Если IF = 1, микропроцессор обрабатывает внешние прерывания, если IF = 0, микропроцессор игнорирует сигналы на входе INTR;
      • TF (Trace Flag) — флаг трассировки. Единичное состояние флага TF переводит микропроцессор в режим покомандной работы. В режиме покомандной работы после выполнения каждой машинной команды в микропроцессоре генерируется внутреннее прерывание с номером 1, и далее следуют действия в соответствии с алгоритмом обработки данного прерывания;

      Механизм прерывания, его общие свойства (как это обычно делается)

      При возникновении события, на которое надо отреагировать (запроса на прерывание), обычно процессор автоматически (без участия программиста) выполняет следующие действия:

      1. Заканчивается выполнение текущей команды (иногда прерывается, если команда длинная, а иногда выполняется еще одна или несколько команд).

      2. Анализируется, разрешено ли прерывание. Если нет, то осуществляется переход к выполнению следующей команды.

      3. Если запросов несколько, принимается решение, какой запрос обслуживать (разрешение приоритета, priority resolving). Если система запросов радиальная или источник запроса — внутреннее событие процессора (exception), то переход к .п.6.

      4. При магистральной схеме запросов:
      Процессор передает источникам запросов подтверждение приема запроса (этот сигнал должен достигнуть только того источника запроса, который имеет наивысший приоритет).

      5. Источник запроса передает процессору идентифицирующую его информацию (каждый источник запроса может иметь собственную программу обработки, и процессор должен узнать, какой обработчик использовать).

      6. Процессор сохраняет информацию о текущем контексте (текущий вектор состояния — почти всегда неполностью).

      7. Адрес перехода на программу обработки прерывания хранится в определенной для каждого источника запроса прерывания области памяти, называемой вектором прерывания. Процессор загружает начальный адрес программы обработки прерывания из вектора прерывания в счетчика команд.

      8. Для возврата из прерывания в системе команд обычно есть специальная команда "возврат из прерывания" (мнемоника iret, retiили rti). По этой команде восстанавливается контекст прерванной программы в том объеме, в котором он быь сохранен при входе в перывание (п.6). Эта команда должна быть последней исполняемой командой обработчика.

      Приведенное описание соответствует обработке внешнего аппаратного прерывания. В случае, если причина прерывания — внутреннее событие процессора (исключительная ситуация — exception), то этапы 4 и 5 отсутствуют, как в случае радиальных прерываний.

      Опишем перечисленные этапы более детально.

      1. Внешний запрос прерывания приходит асинхронно (без какой-либо привязки во времени) по отношению к выполняемому потоку команд. Произвести переход на обработчик в большинстве процессоров можно только в промежутке между выполнением соседних команд, поэтому обычно выполнение текущей команды заканчивается.
      В некоторых процессорах, если время выполнения текущей команды велико, ее выполнение прерывается, а после выхода из прерывания команда начинает выполняться сначала (это, например, типично для команд плавающей точки в процессорах, где они реализованы микропрограммно). В процессорах х86 прерываются команды строковых операций, но после выхода из прерывания они не начинаются сначала, а продолжают работу с того места, где были прерваны. Некоторые комбинации команд используются совместно, и прерывание между ними может привести к фатальным результатам. Такова в х86 пара команд, переустанавливающих положение стека: для этого надо поменять содержимое регистра сегмента стека и затем содержимое указателя стека. Поскольку в х86 для сохранения контекста используется стек, то прерывание между указанными двумя командами вызовет сохранение контекста (якобы в стеке) в неверном месте памяти. Для исключения такой ситуации команда загрузки в регистр сегмента стека автоматически запрещает прерывание до окончания следующей команды.

      2. В некоторых ситуациях прерывание недопустимо (например, при выполнении участков программы, критичных ко времени выполнения), поэтому во всех процессорах имеется возможность запретить прерывания (по крайней мере, некоторые). Возникшие в этот период запросы могут быть потеряны, либо могут ждать обслуживания, которое произойдет, когда прерывания будут разрешены. Это зависит от устройства конкретного процессора и от свойств входов запроса прерываний. В некоторых процессорах можно программно управлять свойствами входа: запоминается или теряется запрос, который приходит в период, когда прерывания процессору запрещены. В системе команд обычно есть команды, запрещающие и разрешающие прерывание. Кроме того, внешние устройства-источники запросов нередко позволяют программно разрешить/запретить прерывание от данного устройства (прерывания от других устройств при этом будут обрабатываться).

      3. При нескольких источниках запроса возможна ситуация, когда в процессор поступают одновременно несколько запросов. Это вовсе не значит, что запросы одновременно возникают, это крайне маловероятно. Однако нередка ситуация, когда в течение некоторого времени прерывание запрещено и в этот период (не одновременно) возникает несколько запросов. Когда выполнится команда "разрешить прерывание", запросы поступают в процессор равноправно. Надо каким-нибудь способом определить порядок, в котором запросы будут обрабатываться (их приоритеты). Используется несколько способов:

      •а) приоритеты фиксированы и не могут быть изменены;
      •б) приоритеты определяются электрической схемой, и для их изменения надо произвести переключения в схеме;
      •в) приоритеты изменяются циклически: последнему обслуженному устройству присваивается самый низкий приоритет;
      •г) приоритеты могут быть программно заданы в произвольной комбинации;
      •. и множество других и вариантов.

      4. Далее происходит обмен сигналами между источником запроса и процессором. Сначала процессор посылает сигнал подтверждения приема запроса. В частном случае сигнал подтверждения распространяется только до устройства, наиболее близкого к процессору из всех, выставивших запрос прерывания.

      5. Используется несколько способов идентификации источника прерывания. В случае магистральной архитектуры устройство обычно передает процессору по магистрали информацию о себе. Эта информация обычно содержит условный код (номер) источника запроса, по которому процессор способен определить адрес памяти, содержащий информацию о местонахождении в памяти обработчика. В качестве условного кода может использоваться адрес вектора прерывания, стартовый адрес обработчика или даже полный код команды call перехода на обработчик (так было сделано в процессоре i8080).
      Термин “вектор прерывания” используют в двух разных значениях:

      •а) контекст (вектор состояния) обработчика, автоматически загружаемый при выполнении прерывания,
      •б) участок памяти, где хранится этот контекст. Обычно для хранения контекстов обработчиков разработчики процессора выделяют в адресном пространстве специальную область векторов прерывания.

      Для некоторых из прерываний разработчики процессора могут предопределить положение векторов и значения адресов перехода, в то время как другие программист может задавать по своему усмотрению программно.

      6. Сохранение текущего контекста процессор чаще всего делает в стеке. В простейшем случае сохраняется содержимое счетчика команд и содержимое регистра состояния. Во многих процессорах в регистре состояния отдельные биты имеют отношение к управлению прерываниями и автоматическое сохранение слова состояния предоставляет ряд дополнительных возможностей, а иногда является просто необходимым (см. например далее "пошаговую отладку" для процессоров х86).

      7. Загрузка контекста обработчика (вектора прерывания). Результат этого действия — переход на первую команду обработчика. Используются различные способы указания того, в каком адресе памяти расположена эта первая команда. Чаще всего адрес обработчика содержится в соответствующем векторе прерывания. Существенным является вопрос о том, разрешено ли прерывание после перехода на обработчик. В большинстве процессоров при входе в прерывание повторное (вложенное) прерывание автоматически запрещается. Обработчик может разрешить прерывание соответствующей командой (например, в процессорах х86 это команда sti). В этом случае возможно "вложенное" прерывание, в том числе, и от этого же источника, но для этого обработчик прерывания должен быть реентерабельным, т.е. допускать рекурсивный вызов. Кроме того, это может привести к нарушению приоритетов: менее приоритетное событие будет обслужено раньше, чем более приоритетное.

      8. Возврат из прерывания восстанавливает контекст прерванной программы. Существенно, что восстанавливается состояние "разрешено/запрещено прерывание": после возврата из прерывания возможно следующее прерывание, если есть запрос.

      Аппаратные прерывания и проблема приоритетов

      Термином “аппаратное прерывание” называют ситуацию, когда источник прерывания — устройство, внешнее по отношению к вычислительному ядру, а событие, вызвавшее прерывание, не синхронизировано с процессом выполнения программы. Иногда источник запроса может быть интегрирован в одну микросхему с процессором (например, таймер в однокристальном микроконтроллере), но логически процессор и таймер независимы (и даже могут тактироваться от разных генераторов).

      Типичный пример использования внешнего прерывания: по сигналу готовности принтера (говорящему о том, что предыдущая порция текста напечатана) выдать на него следующую порцию текстовой информации.

      Используются две основные схемы подключения источников запросов к процессору: радиальная и магистральная.

      При магистральной схеме запросы от всех источников поступают на одну и ту же линию запроса. После приема запроса процессор проводит с устройствами обмен сигналами с целью выяснить источник запроса. При этом усложняются схемы обслуживания прерываний и увеличивается время реакции на запрос, что в некоторых случаях оказывается нежелательным.

      При радиальной схеме каждый источник запроса использует индивидуальный вход запроса, в результате чего процессор может определить источник запроса и осуществить переход на соответствующую подпрограму обработки.

      В том случае, когда несколько запросов требуют обработки одновременно, может оказаться, что некоторые из запросов более важны и должны быть обработаны в первую очередь. Для этого система управления прерываниями должна давать программисту возможность определять приоритеты, т.е. порядок реакции на запросы.

      Время реакции на запрос. Способы задания точек входа

      Время реакции на запрос прерывания

      Это время определяется двумя независимыми факторами:

      1) Время входа в прерывание для одиночного запроса.

      2) Интенсивность потока запросов — при значительном количестве источников и при интенсивном потоке запросов часто оказывается, что очередной запрос приходит еще до того, как обслужен предыдущий. В этом случае среднее время реакции на запрос (время от момента возникновения запроса до начала выполнения первой команды обработчика) может оказаться значительным

      Способы задания точек входа в обработчик прерывания

      •Короткое прерывание — по прерыванию происходит выход на первую исполняемую команду. Адрес команды может быть фиксирован (TMS 320C10) или задаваться номером прерывания (ADSP 2181).

      •Длинное прерывание — выход в обработчик через команду JMP или через вектор прерывания:

      •Фиксированное расположение векторов в памяти (каждый вектор определяет адрес обработчика прерываний) (Intel 80x86);

      •Программно задаваемое / перемещаемое расположение векторов (MC 68060).

      Источники прерываний: внешние и внутренние события. Радиальная схема прерывания

      Источники прерываний: внешние и внутренние события

      До сих пор речь шла о событиях, внешних по отношению к
      вычислительному ядру (процессор + память).

      В ходе выполнения программы могут произойти внутренние события, которые заранее трудно предсказуемы, например:

      •деление на нуль;

      •появление в программе недопустимой команды (из-за ошибки программиста, из-за сбоя, из-за того, что программа разрабатывалась для "старших" моделей семействапроцессоров и использует команды, отсутствующие в младшей модели);

      •обращение к несуществующему адресу памяти;

      • и многие другие подобные.

      Такие внутренние события, делающие нормальное продолжение основного алгоритма невозможным, принято называть прерываниями по внутренним причинам, исключительными ситуациями или исключениями (exceptions).

      Почти все их можно выявить, вставляя в программу в подходящих местах соответствующие анализирующие фрагменты, Например, после выполнения действий по модификации адресов проверять результат на нахождение в заданных границах, но это требует затрат дополнительного процессорного времени, иногда весьма значительных, а также дополнительных усилий программиста. Поэтому разработчики процессора могут предусматривать автоматическое выявление подобных ситуаций и генерацию запроса прерывания.

      Радиальная схема и управление прерываниями. Контроллер прерываний

      Схемы организации прерываний представлены на рисунке (см. рисунок ниже). Для реализации радиальной схемы подключения источников аппаратных запросов надо иметь отдельный вход запроса для каждого источника запроса. Большинство процессоров имеет малое количество входов запроса (1. 3). Этого может быть достаточно в очень маленьких системах, однако весьма часто в системе требуется иметь больше входов запроса прерывания, чем имеет процессор. Это позволяет сделать дополнительный узел, называемый программируемым контроллером прерываний (ПКП). Обычно ПКП имеет несколько входов для подключения источников запросов и один выход, подключаемый ко входу запроса прерывания процессора.


      ПКП выполняет несколько функций:

      1) преобразовывает радиальную схему подключения периферийных устрой в векторную;
      2) обеспечивает обмен сигналами с процессором для идентификации источника прерываний;
      3) позволяет управлять приоритетами отдельных запросов;
      4) дает возможность программно разрешать/запрещать прерывания отдельно для каждого источника, а также выбирать фрагмент входного сигнала, инициирующий запрос (уровень или фронт, активная полярность).

      В любой реальной вычислительной системе далеко не все векторы прерываний и даже не все входы запросов аппаратных прерываний бывают использованы. Разработчик программы или программно- аппаратного комплекса может использовать свободные ресурсы системы прерываний ля собственных нужд, например, для обеспечения реакции на события в "своем" (может быть, нестандартном) периферийном устройстве.

      Здесь мы разберем такие важные темы, как: обработка прерываний, векторы прерываний, программные прерывания, IRQ, в общем поговорим на темы прерывания.

      Идея прерывания была предложена в середине 50-х годов и основная цель введения прерываний – реализация синхронного режима работы и реализация параллельной работы отдельных устройств ЭВМ.

      Прерывания и обработка прерываний зависят от типа ЭВМ, поэтому их реализацию относят к машинно-зависимым свойствам операционных систем.

      Прерывание (interrupt) – это сигнал, заставляющий ЭВМ менять обычный порядок выполнения команд процессором.

      Возникновение подобных сигналов обусловлено такими событиями, как:

      • завершение операций ввода-вывода.
      • истечение заранее заданного интервала времени.
      • попытка деления на нуль.
      • сбой в работе аппаратного устройства и др.

      Обработка прерывания

      С каждым прерыванием связывают число, называемое номером типа прерывания или просто номером прерывания. Система умеет распознавать, какое прерывание, с каким номером оно произошло, и запускает соответствующую этому номеру программу обработки прерывания. Таким образом, при поступлении сигнала на прерывание происходит принудительная передача управления от выполняемой программы к системе, а через нее — к обработчику прерываний.

      Например прерывание с номером 9 — прерывание от клавиатуры, которое генерируется при нажатии и при отжатии клавиши. Используется для чтения данных с клавиатуры. Обозначается в ОС как IRQ1, где IRQ – обозначение прерывания, а 1 – приоритет прерывания. Данные о запросах на прерывание можно проанализировать в диспетчере устройств:


      Обработчик прерываний – программа обработки прерывания, являющаяся частью ОС, предназначенная для выполнения ответных действий на условие, вызвавшее прерывание.

      Предположим, что в момент поступления сигнала прерывания от некоторого источника программа А находится в решении. В результате управление автоматически передается обработчику прерываний. После завершения обработки управление может быть снова передано в ту точку программы А, где ее выполнение было прервано:


      Векторы прерываний

      Адреса программ, соответствующих различным прерываниям, собраны в таблицу, которая называется таблицей векторов прерываний.

      Для микропроцессора требуется простой способ определения местоположения программы обработки прерывания и это осуществляется путем использования таблицы векторов прерываний.

      Таблица векторов прерываний занимает первый килобайт оперативной памяти — адреса от 0000:0000 до 0000:03FF. Таблица состоит из 256 элементов — FAR-адресов обработчиков прерываний. Эти элементы называются векторами прерываний. В первом слове элемента таблицы записано смещение, а во втором — адрес сегмента обработчика прерывания. Векторами являются просто полные адреса памяти программы (в сегментированной форме), которая должна быть активизирована в случае возникновения прерывания.

      Прерыванию с номером 0 соответствует адрес 0000:0000, прерыванию с номером 1 — 0000:0004 и т.д. Адрес такой состоит из пары 2-байтовых слов, поэтому каждый из векторов занимает четыре байта.

      Можно просмотреть таблицу векторов прерываний в компьютере, если воспользоваться программой DEBUG. Используйте команду D для вывода содержимого начала памяти: D 0:0. Программа DEBUG покажет вам первые 128 байтов или 32 вектора, которые могут иметь вид наподобие следующего:

      0000:0000 E8 4E 9A 01 00 00 00 00-C3 E2 00 F0 00 00 00 00
      0000:0010 F0 01 70 00 54 FF 00 F0-05 18 00 F0 05 18 00 F0
      0000:0020 2C 08 51 17 D0 0A 51 17-AD 08 54 08 E8 05 01 2F
      0000:0030 FA 05 01 2F 05 18 00 F0-57 EF 00 F0 F0 01 70 00
      0000:0040 90 13 C7 13 4D F8 00 F0-41 F8 00 F0 3E 0A 51 17
      0000:0050 5C 00 B7 25 59 F8 00 F0-E2 0A 51 17 9C 00 B7 25
      0000:0060 00 00 00 F6 8E 00 DE 09-6E FE 00 F0 F2 00 7B 09
      0000:0070 27 08 51 17 A4 F0 00 F0-22 05 00 00 00 00 00 F0

      Можно встретить три вида адресов в таблице векторов. Это могут быть адреса, указывающие на ROM-BIOS, которые можно идентифицировать шестнадцатеричной цифрой F, которая предшествует номеру сегмента. Это могут быть адреса, которые указывают на главную память (как в примере: 019A:4EE8). Эти адреса могут указывать на подпрограммы ДОС или на резидентную программу (например, SideKick или Prokey), либо они могут указывать на саму программу DEBUG (поскольку DEBUG должна временно управлять прерыванием). Также векторы могут состоять из одних нулей, когда прерывание с данным номером не обрабатывается в текущий момент.

      Инициализация таблицы происходит частично BIOS после тестирования аппаратуры и перед началом загрузки операционной системой, частично при загрузке операционной системы.

      Ниже приведено назначение некоторых векторов:

      Описание
      0 Ошибка деления. Вызывается автоматически после выполнения команд DIV или IDIV, если в результате деления происходит переполнение (например, при делении на 0).
      2 Аппаратное немаскируемое прерывание. Это прерывание может использоваться по-разному в разных машинах. Обычно вырабатывается при ошибке четности в оперативной памяти и при запросе прерывания от сопроцессора.
      5 Печать копии экрана. Генерируется при нажатии на клавиатуре клавиши PrtScr. Обычно используется для печати образа экрана.
      8 IRQ0 — прерывание интервального таймера, возникает 18,2 раза в секунду.
      9 IRQ1 — прерывание от клавиатуры. Генерируется при нажатии и при отжатии клавиши. Используется для чтения данных от клавиатуры.
      A IRQ2 — используется для каскадирования аппаратных прерываний в машинах класса AT
      B IRQ3 — прерывание асинхронного порта COM2.
      C IRQ4 — прерывание асинхронного порта COM1.
      D IRQ5 — прерывание от контроллера жесткого диска для XT.
      E IRQ6 — прерывание генерируется контроллером флоппи-диска после завершения операции.
      F IRQ7 — прерывание принтера. Генерируется принтером, когда он готов к выполнению очередной операции. Многие адаптеры принтера не используют это прерывание.
      10 Обслуживание видеоадаптера.
      11 Определение конфигурации устройств в системе.
      12 Определение размера оперативной памяти в системе.
      13 Обслуживание дисковой системы.
      14 Последовательный ввод/вывод.
      19 Загрузка операционной системы.
      1A Обслуживание часов.
      1B Обработчик прерывания Ctrl-Break.
      70 IRQ8 — прерывание от часов реального времени.
      71 IRQ9 — прерывание от контроллера EGA.
      75 IRQ13 — прерывание от математического сопроцессора.
      76 IRQ14 — прерывание от контроллера жесткого диска.
      77 IRQ15 — зарезервировано.

      IRQ0 — IRQ15 — это аппаратные прерывания.

      Механизм обработки прерываний

      При обработке каждого прерывания должна выполняться следующая последовательность действий:

      • Восприятие запроса на прерывание: прием сигнала и идентификация прерывания.
      • Запоминание состояния прерванного процесса: определяется значением счетчика команд (адресом следующей команды) и содержимым регистров процессора.
      • Передача управления прерывающей программе (в счетчик команд заносится начальный адрес подпрограммы обработки прерываний, а в соответствующие регистры – информация из слова состояния процессора).
      • Обработка прерывания.
      • Восстановление прерванного процесса и возврат в прерванную программу.

      Главные функции механизма прерывания:

      1. распознавание или классификация прерываний.
      2. передача управления соответственно обработчику прерываний.
      3. корректное возвращение к прерванной программе (перед передачей управления обработчику прерываний содержимое регистров процессора запоминается либо в памяти с прямым доступом либо в системном стеке).

      Типы прерываний

      Прерывания, возникающие при работе вычислительной системы, можно разделить на 4 группы:


      Аппаратные прерывания вызываются физическими устройствами и возникают по отношению к программе асинхронно, т.е. в общем случае невозможно предсказать, когда и по какой причине программа будет прервана.

      Аппаратные прерывания не координируются c работой программного обеспечения. Когда вызывается прерывание, то процессор оставляет свою работу, выполняет прерывание, a затем возвращается на прежнее место.

      Внешние прерывания возникают по сигналу какого-либо внешнего устройства например:

      • Прерывание, которое информирует систему о том, что требуемый сектор диска уже прочитан, его содержимое доступно программе.
      • Прерывание, которое информирует систему о том, что завершилась печать символа на принтере и необходимо выдать следующий символ.
      • Прерывания по нарушению питания.
      • Нормальное завершение некоторой операции ввода-вывода (нажатие клавиши на клавиатуре).
      • Прерывание по таймеру.

      Прерывание по таймеру вызывается интервальным таймером. Этот таймер содержит регистр, которому может быть присвоено определенное начальное значение посредством специальной привилегированной команды. Значение этого регистра автоматически уменьшается на 1 по истечении каждой миллисекунды времени. Когда это значение становятся равным нулю, происходит прерывание по таймеру. Подобный интервальный таймер используется операционной системой для определения времени, в течение которого программа пользователя может оставаться под управлением машины.

      Маскируемые и немаскируемые внешние прерывания

      Существуют два специальных внешних сигнала среди входных сигналов процессора, при помощи которых можно прервать выполнение текущей программы и тем самым переключить работу центрального процессора. Это сигналы NMI (Non Mascable Interrupt, немаскируемое прерывани) INTR (interrupt request, запрос на прерывание).

      Соответственно внешние прерывания подразделяются на два вида: немаскируемые и маскируемые.

      Часто при выполнении критических участков программ, для того чтобы гарантировать выполнение определенной последовательности команд целиком, приходится запрещать прерывания (т.е. сделать систему нечувствительной ко всем или отдельным прерываниям). Это можно сделать командой CLI. Ее нужно поместить в начало критической последовательности команд, а в конце расположить команду STI, разрешающую процессору воспринимать прерывания. Команда CLI запрещает только маскируемые прерывания, немаскируемые всегда обрабатываются процессором.

      Таким образом, наличие сигнала прерывания не обязательно должно вызывать прерывание исполняющейся программы. Процессор может обладать средствами защиты от прерываний: отключение системы прерываний, маскирование (запрет) отдельных сигналов прерываний. Прерывания, которые замаскировать нельзя — это немаскируемые прерывания.

      Внутренние прерывания вызываются событиями, которые связаны с работой процессора и являются синхронными с его операциями, а именно прерывание происходит, когда:

      • при нарушении адресации (в адресной части выполняемой команды указан запрещенный или несуществующий адрес, обращение к отсутствующему сегменту или странице при организации механизмов виртуальной памяти);
      • при наличии в поле кода не задействованной двоичной комбинации.
      • при делении на нуль.
      • при переполнении или исчезновении порядка.
      • при обнаружении ошибок четности, ошибок в работе различных устройств аппаратуры средствами контроля.

      Программные прерывания

      Программные прерывания в прямом смысле прерываниями не являются, поскольку представляют собой лишь специфический способ вызова процедур — не по адресу, а по номеру в таблице.

      Механизм программных прерываний был специально введен для того, чтобы:

      1. переключение на системные программные модули происходило не просто как переход в подпрограмму, а точно таким же образом, как и обычные прерывания. Этим обеспечивается автоматическое переключение процессора в привилегированный режим с возможностью исполнения любых команд.
      2. использование программных прерываний приводит к более компактному коду программ по сравнению с использованием стандартных команд выполнения процедур.

      Пример (программные прерывания):

      • привилегированная команда в режиме пользователя.
      • адрес вне диапазона.
      • нарушение защиты памяти.
      • арифметическое переполнение, отсутствует страница.
      • нарушение защиты сегмента.
      • выход за границу сегмента.

      В упрощенном виде схему обработки различных видов прерываний можно представить следующим образом:


      КП – контроллер прерываний, имеет несколько уровней (линий) для подключения контроллеров устройств (на схеме обозначены КУ). Возможно каскадное подключение контролеров, когда на один из его входов подключается еще одни контроллер прерываний. ЦП – центральный процессор.

      Аппаратные прерывания вырабатываются устройствами компьютера, когда возникает необходимость их обслуживания. В отличие от программных прерываний, вызываемых запланировано самой прикладной программой, аппаратные прерывания всегда происходят асинхронно по отношению к выполняющимся программам. Кроме того, может возникнуть одновременно несколько прерываний. Выбор одного из них для обработки осуществляется на основе приоритетов, приписанных каждому типу прерывания.

      Каждому прерыванию назначается свой уникальный приоритет. Если происходит одновременно несколько прерываний, то система отдает предпочтение самому высокоприоритетному, откладывая на время обработку остальных прерываний.

      В случае о прерывании самой программы обработки прерывания говорят о вложенном прерывании. Уровни приоритетов обозначаются сокращенно IRQ0 — IRQ15 или IRQ0 – IRQ23 (в зависимости от микросхемой реализации).

      Пpepывaнию вpeмeни cутoк дан мaкcимaльный пpиopитeт, пocкoльку ecли oнo будет пocтoяннo тepятьcя, то будут нeвepными пoкaзaния cиcтeмныx чacoв. Пpepывaниe от клaвиaтуpы вызывaeтcя при нaжaтии или oтпуcкaнии клавиши; oнo вызывaeт цепь coбытий, кoтopaя oбычнo зaкaнчивaeтcя тем, что код клавиши пoмeщaeтcя в буфep клaвиaтуpы (oткудa он зaтeм мoжeт быть пoлучeн пpoгpaммными пpepывaниями).

      Ну и наконец реализация механизма обработки прерываний

      В машине для каждого класса прерываний имеется соответствующая ему рабочая область прерываний. Например, имеется область, соответствующая прерыванию по таймеру. Когда происходит прерывание по таймеру, содержимое всех регистров сохраняется в этой области (например, пропустив первые несколько слов). Затем из этих пропущенных слов извлекаются заранее занесенные туда значения, которые перезаписываются в счетчик (указатель) команд машины и в слово состояния (или во флаговый регистр). Загрузка и сохранение регистров осуществляется аппаратными средствами машины автоматически.

      Загрузка счетчика команд новым значением адреса автоматически вызывает передачу управления на соответствующую команду. Этот адрес, заранее сохраненный в рабочей области прерывания, представляет собой начальный адрес стандартной программы обработки прерываний по таймеру. Загрузка слова состояния также вызывает определенные изменения в состоянии процессора.

      После выполнения в ответ на запрос на прерывание любого требуемого действия стандартная программа обработки прерываний выполняет команду загрузки состояния процессора, в результате чего управление передается прерванной программе. Происходит это следующим образом: команда загрузки состояния процессора вызывает загрузку сохраненного содержимого слова состояния, счетчика команд и других регистров из соответствующих слов области сохранения, начиная с адреса, указанного в команде. Это приводит к восстановлению содержимого регистров и состояния процессора, которые были в момент прерывания. Управление затем передается на команду, перед выполнением которой произошло прерывание.

      Сохранение и восстановление состояния процессора и содержимого регистров называют операцией контекстного переключения.

      У большинства машин имеется так называемое слово состояния, которое содержит часть информации, используемой при обработке прерываний. Одним из элементов этого слова (например, первый) является признак, определяющий, в каком режиме находится процессор: в пользовательском или супервизора.

      Обычные программы находятся в пользовательском режиме (признак равен нулю). Когда происходит прерывание, новое загружаемое содержимое слово состояния имеет признак, равный 1, что автоматически переводит процессор в режим супервизора. В этом режиме становится возможным использование привилегированных команд. Перед тем, как значение слова состояния будет сохранено, в другом его элементе (например, втором) будет установлено значение, указывающее на причину прерывания:

      • при программном прерывании отражается тип вызвавшего его условия, например деление на нуль.
      • при прерывании по вводу-выводу заносится номер канала, вызвавший прерывание.

      В третьем элементе указывается, выполняет ли процессор команды или простаивает. В четвертом элементе содержится указатель, идентифицирующий текущую выполняемую программу. В пятом элементе содержится маска прерываний, которая используется для контроля за разрешением прерываний (поле MASK).

      Это поле используется, чтобы не допустить наступления прерываний определенного типа, пока первое из них не будет обработано. В MASK каждый бит соответствует некоторому классу прерываний. Если какой-то бит установлен в 1, то прерывания соответствующего класса разрешены, если в 0, то запрещены. В последнем случае говорят, что они маскированы (их также называют запрещеннымиили закрытыми). Однако маскированные прерывания не теряются, потому что сигнал, вызвавший прерывание, сохраняется аппаратурой. Временно задержанное таким способом прерывание называется отложенным. Когда (вследствие того, что значение MASK сброшено) прерывания соответствующего класса вновь разрешаются, сигнал опознается и происходит прерывание.

      Маскирование прерываний находится под контролем операционной системы и зависит от значения MASK в слове состояния, которое заранее сохраняется в рабочей области каждого прерывания. Можно запретить все прерывания, установив все биты MASK в нуль. В действительности поступать подобным образом нет необходимости.

      Читайте также: