Как верно было замечено: «Прерывания названы так весьма удачно, поскольку они прерывают нормальную работу системы»1. Другими словами, система прерываний переводит процессор на выполнение потока команд, отличного от того, который выполнялся до сих пор, с последующим возвратом к исходному коду. Из сказанного можно сделать вывод о том, что механизм прерываний очень похож на механизм выполнения процедур. Это на самом деле так, хотя между этими механизмами имеется важное отличие.
тема 1 вопрос 23
назначение и характеристики системы прерываний. порядок обработки прерывания
Назначение и типы прерываний Прерывания являются основной движущей силой любой
операционной системы. Отключите систему прерываний — и «жизнь» в операционной
системе немедленно остановится. Периодические прерывания от таймера вызывают смену
процессов в мультипрограммной ОС, а прерывания от устройств вводавывода управляют
потоками данных, которыми вычислительная система обменивается с внешним миром. Как
верно было замечено: «Прерывания названы так весьма удачно, поскольку они прерывают
нормальную работу системы»1. Другими словами, система прерываний переводит
процессор на выполнение потока команд, отличного от того, который выполнялся до сих
пор, с последующим возвратом к исходному коду. Из сказанного можно сделать вывод о
том, что механизм прерываний очень похож на механизм выполнения процедур. Это на
самом деле так, хотя между этими механизмами имеется важное отличие. Переключение
по прерыванию отличается от переключения, которое происходит по команде
безусловного или условного перехода, предусмотренной программистом в потоке команд
приложения. Переход по команде происходит в заранее определенных программистом
точках программы в зависимости от исходных данных, обрабатываемых программой.
Прерывание же происходит в произвольной точке потока команд программы, которую
программист не может прогнозировать. Прерывание возникает либо в зависимости от
внешних по отношению к процессу выполнения программы событий, либо при появлении
непредвиденных аварийных ситуаций в процессе выполнения данной программы. Сходство
же прерываний с процедурами состоит в том, что в обоих случаях выполняется некоторая
подпрограмма, обрабатывающая специальную ситуацию, а затем продолжается
выполнение основной ветви программы. 1 Скотт Максвелл. Ядро Linux в комментариях.
— К. ДиаСофт, 2000. В зависимости от источника прерывания делятся на три больших
класса: внешние; внутренние; программные. Внешние прерывания могут возникать в
результате действий пользователя или оператора за терминалом, или же в результате
поступления сигналов от аппаратных устройств — сигналов завершения операций ввода
вывода, вырабатываемых контроллерами внешних устройств компьютера, такими как
принтер или накопитель на жестких дисках, или же сигналов от датчиков управляемых
компьютером технических объектов. Внешние прерывания называют также аппаратными,
отражая тот факт, что прерывание возникает вследствие подачи некоторой аппаратурой
(например, контроллером принтера) электрического сигнала, который передается
(возможно, проходя через другие блоки компьютера, например контроллер прерываний) на
специальный вход прерывания процессора. Данный класс прерываний является
асинхронным по отношению к потоку инструкций прерываемой программы. Аппаратура
процессора работает так, что асинхронные прерывания возникают между выполнением
двух соседних инструкций, при этом система после обработки прерывания продолжает
выполнение процесса, уже начиная со следующей инструкции. Внутренние прерывания,
называемые также исключениями (exeption), происходят синхронно выполнению
программы при появлении аварийной ситуации в ходе исполнения некоторой инструкции
программы. Примерами исключений являются деление на нуль, ошибки защиты памяти,
обращения по несуществующему адресу, попытка выполнить привилегированную
инструкцию в пользовательском режиме и т. п. Исключения возникают непосредственно в
ходе выполнения тактов команды («внутри» выполнения). Программные прерывания
отличаются от предыдущих двух классов тем, что они по своей сути не являются
«истинными» прерываниями. Программное прерывание возникает при выполнении особой
команды процессора, выполнение которой имитирует прерывание, то есть переход на
новую последовательность инструкций. Причины использования программных прерываний
вместо обычных инструкций вызова процедур будут изложены ниже, после рассмотрения
механизма прерываний. Прерываниям приписывается приоритет, с помощью которого ониранжируются по степени важности и срочности. О прерываниях, имеющих одинаковое
значение приоритета, говорят, что они относятся к одному уровню приоритета
прерываний. Прерывания обычно обрабатываются модулями операционной системы, так
как действия, выполняемые по прерыванию, относятся к управлению разделяемыми
ресурсами вычислительной системы — принтером, диском, таймером, процессором и т. п.
Процедуры, вызываемые по прерываниям, обычно называют обработчиками прерываний,
или процедурами обслуживания прерываний (Interrupt Service Routine, /57?). Аппаратные
прерывания обрабатываются драйверами соответствующих внешних устройств,
исключения — специальными модулями ядра, а программные прерывания — процедурами
ОС, обслуживающими системные вызовы. Кроме этих модулей в операционной системе
может находиться так называемый диспетчер прерываний, который координирует работу
отдельных обработчиков прерываний. Механизм прерываний Механизм прерываний
поддерживается аппаратными средствами компьютера и программными средствами
операционной системы. Аппаратная поддержка прерываний имеет свои особенности,
зависящие от типа процессора и других аппаратных компонентов, передающих сигнал
запроса прерывания от внешнего устройства к процессору (таких, как контроллер
внешнего устройства, шины подключения внешних устройств, контроллер прерываний,
являющийся посредником между сигналами шины и сигналами процессора). Особенности
аппаратной peaлизации прерываний оказывают влияние на средства программной
поддержки прерываний, работающие в составе ОС. Существуют два основных способа, с
помощью которых шины выполняют прерывания: векторный (vectored) и опрашиваемый
(polled). В обоих способах процессору предоставляется информация об уровне приоритета
прерывания на шине подключения внешних устройств. В случае векторных прерываний в
процессор передается также информация о начальном адресе программы обработки
возникшего прерывания — обработчика прерываний. Устройствам, которые используют
векторные прерывания, назначается вектор прерываний. Он представляет собой
электрический сигнал, выставляемый на соответствующие шины процессора и несущий в
себе информацию об определенном, закрепленном за данным устройством номере,
который идентифицирует соответствующий обработчик прерываний. Этот вектор может
быть фиксированным, конфигурируемым (например, с использованием переключателей)
или программируемым. Операционная система может предусматривать процедуру
регистрации вектора обработки прерываний для определенного устройства, которая
связывает некоторую подпрограмму обработки прерываний с определенным вектором.
При получении сигнала запроса прерывания процессор выполняет специальный цикл
подтверждения прерывания, в котором устройство должно идентифицировать себя. В
течение этого цикла устройство отвечает, выставляя на шину вектор прерываний. Затем
процессор использует этот вектор для нахождения обработчика данного прерывания.
Примером шины подключения внешних устройств, которая поддерживает векторные
прерывания, является шина VMEbus. При использовании опрашиваемых прерываний
процессор получает от запросившего прерывание устройства только информацию об
уровне приоритета прерывания (например, номере IRQ на шине ISA или номере IPL на
шине SBus компьютеров SPARC). С каждым уровнем прерываний может быть связано
несколько устройств и соответственно несколько программ — обработчиков прерываний.
При возникновении прерывания процессор должен определить, какое устройство из тех,
которые связаны с данным уровнем прерываний, действительно запросило прерывание.
Это достигается вызовом всех обработчиков прерываний для данного уровня приоритета,
пока один из обработчиков не подтвердит, что прерывание пришло от обслуживаемого им
устройства. Если же с каждым уровнем прерываний связано только одно устройство, то
определение нужной программы обработки прерывания происходит немедленно, как и при
векторном прерывании. Опрашиваемые прерывания поддерживают шины ISA, EISA, MCA,
PCI и Sbus. Механизм прерываний некоторой аппаратной платформы может сочетать
векторный и опрашиваемый типы прерываний. Типичным примером такой реализацииявляется платформа персональных компьютеров на основе процессоров Intel Pentium.
Шины PCI, ISA, EISA или MCA, используемые в этой платформе в качестве шин
подключения внешних устройств, поддерживают механизм опрашиваемых прерываний.
Контроллеры периферийных устройств выставляют на шину не вектор, а сигнал запроса
прерывания определенного уровня IRQ. Однако в процессоре Pentium система прерываний
является векторной. Вектор прерываний в процессор Pentium поставляет контроллер
прерываний, который отображает поступающий от шины сигнал IRQ на определенный
номер вектора. Вектор прерываний, передаваемый в процессор, представляет собой целое
число в диапазоне от 0 до 255, указывающее на одну из 256 программ обработки
прерываний, адреса которых хранятся в таблице обработчиков прерываний. В том случае,
когда к каждой линии IRQ подключается только одно устройство, процедура обработки
прерываний работает так, как если бы система прерываний была чисто векторной, то есть
процедура не выполняет никаких дополнительных опросов для выяснения того, какое
именно устройство запросило прерывание. Однако при совместном использовании одного
уровня IRQ несколькими устройствами программа обработки прерываний должна
работать в соответствии со схемой опрашиваемых прерываний, то есть дополнительно
выполнить опрос всех устройств, подключенных к данному уровню IRQ. Механизм
прерываний чаще всего поддерживает приоритезацию и маскирование прерываний.
Приоритезация означает, что все источники прерываний делятся на классы и каждому
классу назначается свой уровень приоритета запроса на прерывание. Приоритеты могут
обслуживаться как относительные и абсолютные. Обслуживание запросов прерываний по
схеме с относительными приоритетами заключается в том, что при одновременном
поступлении запросов прерываний из разных классов выбирается запрос, имеющий высший
приоритет. Однако в дальнейшем при обслуживании этого запроса процедура обработки
прерывания уже не откладывается даже в том случае, когда появляются более
приоритетные запросы — решение о выборе нового запроса принимается только в момент
завершения обслуживания очередного прерывания. Если же более приоритетным
прерываниям разрешается приостанавливать работу процедур обслуживания менее
приоритетных прерываний, то это означает, что работает схема приоритезации с
абсолютными приоритетами. Если процессор (или компьютер, когда поддержка
приоритезации прерываний вынесена во внешний по отношению к процессору блок)
работает по схеме с абсолютными приоритетами, то он поддерживает в одном из своих
внутренних регистров переменную, фиксирующую уровень приоритета обслуживаемого в
данный момент прерывания. При поступлении запроса из определенного класса его
приоритет сравнивается с текущим приоритетом процессора, и если приоритет запроса
выше, то текущая процедура обработки прерываний вытесняется, а по завершении
обслуживания нового прерывания происходит возврат к прерванной процедуре.
Упорядоченное обслуживание запросов прерываний наряду со схемами приоритетной
обработки запросов может выполняться механизмом маскирования запросов. Собственно
говоря, в описанной схеме абсолютных приоритетов выполняется маскирование — при
обслуживании некоторого запроса все запросы с равным или более низким приоритетом
маскируются, то есть не обслуживаются. Схема маскирования предполагает возможность
временного маскирования прерываний любого класса независимо от уровня приоритета.
Обобщенно последовательность действий аппаратных и программных средств по
обработке прерывания можно описать следующим образом. 1. При возникновении сигнала
(для аппаратных прерываний) или условия (для внутренних прерываний) прерывания
происходит первичное аппаратное распознавание типа прерывания. Если прерывания
данного типа в настоящий момент запрещены (приоритетной схемой или механизмом
маскирования), то процессор продолжает поддерживать естественный ход выполнения
команд. В противном случае в зависимости от поступившей в процессор информации
(уровень прерывания, вектор прерывания или тип условия внутреннего прерывания)
происходит автоматический вызов процедуры обработки прерывания, адрес которойнаходится в специальной таблице операционной системы, размещаемой либо в регистрах
процессора, либо в определенном месте оперативной памяти. 2. Автоматически
сохраняется некоторая часть контекста прерванного потока, которая позволит ядру
возобновить исполнение потока процесса после обработки прерывания. В это
подмножество обычно включаются значения счетчика команд, слова состояния машины,
хранящего признаки основных режимов работы процессора (пример такого слова —
регистр EFLA6S в Intel Pentium), а также нескольких регистров общего назначения,
которые требуются программе обработки прерывания. Может быть сохранен и полный
контекст процесса, если ОС обслуживает данное прерывание со сменой процесса. Однако
в общем случае это не обязательно, часто обработка прерываний выполняется без
вытеснения текущего процесса1. 1 Решение о перепланировании процессов может быть
принято в ходе обработки прерывания, например, если это прерывание от таймера и после
наращивания значения системных часов выясняется, что процесс исчерпал выделенный
ему квант времени. Однако это совсем не обязательно — прерывание может выполняться
и без смены процесса, например прием очередной порции данных от контроллера внешнего
устройства чаще всего происходит в рамках текущего процесса, хотя данные, скорее
всего, предназначены другому процессу. 3. Одновременно с загрузкой адреса процедуры
обработки прерываний в счетчик команд может автоматически выполняться загрузка
нового значения слова состояния машины (или другой системной структуры, например
селектора кодового сегмента в процессоре Pentium), которое определяет режимы работы
процессора при обработке прерывания, в том числе работу в привилегированном режиме.
В некоторых моделях процессоров переход в привилегированный режим за счет смены
состояния машины при обработке прерывания является единственным способом смены
режима. Прерывания практически во всех мультипрограммных ОС обрабатываются в
привилегированном режиме модулями ядра, так как при этом обычно нужно выполнить
ряд критических операций, от которых зависит жизнеспособность системы, — управлять
внешними устройствами, перепланировать потоки и т. п. 4. Временно запрещаются
прерывания данного типа, чтобы не образовалась очередь вложенных друг в друга потоков
одной и той же процедуры. Детали выполнения этой операции зависят от особенностей
аппаратной платформы, например может использоваться механизм маскирования
прерываний. Многие процессоры автоматически устанавливают признак запрета
прерываний в начале цикла обработки прерывания, в противном случае это делает
программа обработки прерываний. 5. После того как прерывание обработано ядром
операционной системы, прерванный контекст восстанавливается и работа потока
возобновляется с прерванного места. Часть контекста восстанавливается аппаратно по
команде возврата из прерываний (например, адрес следующей команды и слово состояния
машины), а часть — программным способом, с помощью явных команд извлечения данных
из стека. При возврате из прерывания блокировка повторных прерываний данного типа
снимается.
Обработка прерываний, векторы прерываний, программные прерывания, IRQ
Сб, 01/29/2011 16:58
IRQ
Интерфейс
Многозадачность
Особенности ОС
прерывания
Прерывание (interrupt) – это сигнал, заставляющий ЭВМ менять обычный порядок
выполнения команд процессором.
Возникновение подобных сигналов обусловлено такими событиями, как:
завершение операций вводавывода.
истечение заранее заданного интервала времени.
попытка деления на нуль.
сбой в работе аппаратного устройства и др.
Обработка прерывания
С каждым прерыванием связывают число, называемое номером типа прерывания или
просто номером прерывания. Система умеет распознавать, какое прерывание, с каким
номером оно произошло, и запускает соответствующую этому номеру программу
обработки прерывания. Таким образом, при поступлении сигнала на прерывание
происходит принудительная передача управления от выполняемой программы к системе, а
через нее к обработчику прерываний.
Например прерывание с номером 9 прерывание от клавиатуры, которое генерируется
при нажатии и при отжатии клавиши. Используется для чтения данных с клавиатуры.
Обозначается в ОС как IRQ1, где IRQ – обозначение прерывания, а 1 – приоритет
прерывания. Данные о запросах на прерывание можно проанализировать в диспетчере
устройств:
Обработчик прерываний – программа обработки прерывания, являющаяся частью ОС,
предназначенная для выполнения ответных действий на условие, вызвавшее прерывание.
Предположим, что в момент поступления сигнала прерывания от некоторого источника
программа А находится в решении. В результате управление автоматически передается
обработчику прерываний. После завершения обработки управление может быть снова
передано в ту точку программы А, где ее выполнение было прервано:
Порядок обработки прерываний
Прерывания и особые случаи распознаются на границах команд, и программист может не
заботиться о состоянии внутренних рабочих регистров и устройств конвейера.
Реагируя на запросы прерываний, микропроцессор должен идентифицировать его
источник, сохранить минимальный контекст текущей программы и переключиться на
специальную программу обработчик прерывания. После обслуживания прерывания МП
возвращается к прерванной программе, и она должна возобновиться так, как будто
прерывания не было.
Обработка запросов прерываний состоит из:
"рефлекторных" действий процессора, которые одинаковы для всех прерываний и
особых случаев и которыми программист управлять не может;
выполнения созданного программистом обработчика.Для того чтобы микропроцессор мог идентифицировать источник прерывания и найти
обработчик, соответствующий полученному запросу, каждому запросу прерывания
присвоен свой номер ( тип прерывания ).
Тип прерывания для программных прерываний вводится изнутри микропроцессора;
например, прерывание по отсутствию страницы в памяти имеет тип 14. Для прерываний,
вызываемых командой INT n, тип содержится в самой команде. Для маскируемых
аппаратных прерываний тип вводится из контроллера приоритетных прерываний по
шине данных. Немаскируемому прерыванию назначен тип 2.
Всего микропроцессор различает 256 типов прерываний. Таким образом, все они могут
быть закодированы в 1 байте.
"Рефлекторные" действия микропроцессора по обработке запроса прерывания
выполняются аппаратными средствами МП и включают в себя:
определение типа прерывания ;
сохранение контекста прерываемой программы (некоторой информации, которая
позволит вернуться к прерванной программе и продолжить ее выполнение). Всегда
автоматически сохраняются как минимум регистры EIP и CS, определяющие точку
возврата в прерванную программу, и регистр флагов EFLAGS. Если вызов
обработчика прерывания проводится с использованием шлюза задачи, то в памяти
полностью сохраняется сегмент состояния TSS прерываемой задачи;
определение адреса обработчика прерывания и передача управления первой
команде этого обработчика.
После этого выполняется программа обработчик прерывания, соответствующая
поступившему запросу. Эта программа пишется и размещается в памяти прикладным или
системным программистом. Обработчик прерывания должен завершаться командой I RET,
по которой автоматически происходит переход к продолжению выполнения прерванной
программы с восстановлением ее контекста.
Для вызова обработчика прерывания микропроцессор при работе в реальном режиме
использует таблицу векторов прерываний, а в защищенном режиме таблицу
дескрипторов прерываний.
Таблица векторов прерываний (рис. 7.2) располагается в самых младших адресах
оперативной памяти, имеет объем 1 Кбайт и содержит 4байтные элементы ( векторы
прерываний ) для 256 обработчиков прерываний. Старшие 2 байта вектора загружаются в
сегментный регистр команд CS, а младшие 2 байта в регистр указателя команд IP.
Обращение к элементам таблицы осуществляется по 8разрядному коду типу
прерывания. Так как таблица всегда имеет нулевой начальный адрес и длину вектора в 4
байта, чтобы определить адрес вектора для прерывания типа i, достаточно просто
умножить это значение на 4.
В защищенном режиме для вызова обработчика прерывания используется таблица
дескрипторов прерываний IDT. Элементами таблицы являются 8байтные дескрипторы
типа шлюз пециальные программные структуры, через которые происходит передача
управления обработчику.Рис. 7.2. Таблица векторов прерываний
Обращение к IDT аналогично обращению к глобальной таблице дескрипторов, где вместо
системного регистра GDT R используется регистр IDTR, который определяет размер и
базовый адрес таблицы в памяти.
Физический адрес дескриптора шлюза, находящегося в IDT, определяется как сумма
базового адреса таблицы и умноженного на 8 типа прерывания (рис. 7.3).
Рис. 7.3. Порядок обращения к таблице дескрипторов прерываний
Содержимое регистра IDTr не сохраняется в сегментах TSS и не изменяется при
переключении задачи. Программы не могут обратиться к IDT, так как единственный бит TI
индикатора таблицы в селекторе сегмента обеспечивает выбор только между таблицами
GDT и LDT.
Максимальный предел таблицы дескрипторов прерываний составляет 256*8 1 = 2047.
Можно определить предел меньшим, но это не рекомендуется. Если происходит обращение
к дескриптору вне пределов IDT, процессор переходит в режим отключения до получения
сигнала по входу NMI или сброса.
В IDT могут храниться только дескрипторы следующих типов:
шлюз ловушки,
шлюз прерывания, шлюз задачи.
Шлюзы ловушки и прерывания сходны со шлюзом вызова, только в них отсутствует поле
счетчика WC (рис. 7.4). Так как прерывание является неожиданным событием и не связано
с текущей программой, говорить о передаче параметров их обработчику не приходится.
Рис. 7.4. Формат шлюзов ловушки и прерыванияБит S = 0 в байте доступа определяет этот дескриптор как системный объект. Если поле
ТИП в байте доступа равно 1110, то это шлюз прерывания, если 1111 то шлюз
ловушки.
Поле уровня привилегий дескриптора DPL, как правило, устанавливается равным 3 с тем,
чтобы к обработчику прерываний могли обращаться программы с любого уровня
привилегий.
Бит присутствия P может быть равен как 0, так и 1.
При входе в обработчик через шлюз прерывания в регистре флагов сбрасывается бит
разрешения прерываний IF. В этом случае микропроцессор блокирует все маскируемые
аппаратные прерывания. Поэтому в обработчике прерываний этот бит должен быть
установлен в 1 как можно раньше с тем, чтобы не блокировать работу программ, которые
вызываются, например, при обработке прерываний от системного таймера.
При входе в обработчик через шлюз ловушки флаг IF не меняется.
Вызов обработчика через шлюз ловушки, а не шлюз прерывания, чаще реализуют при
обработке исключений, так как на период обслуживания прерывания нежелательно
выключать механизм разделения времени, использующий прерывания таймера.
Вызов обработчика через шлюз задачи обычно осуществляется при обработке аппаратных
прерываний, так как такая обработка не связана с текущей выполняемой задачей. При этом
возможен механизм вложенных прерываний, если прерывания в задаче разрешены. Вызов
обработчика прерывания через шлюз задачи осуществляется и при обработке исключений,
например, "неразрешенный TSS ", когда поврежденная задача не может вызвать процедуру
прерывания. Переключение задач требует примерно в 5 раз больше времени, чем вызов
процедуры. Поэтому, если приоритет запроса высок, а программа обслуживания короткая,
ее оформляют в виде процедуры.