Лучшие цены в Новосибирске на липосакцию на сайте центра пластической хирургии "АвисМед".
Один из возможных подходов к обслуживанию устройств — создание системной очереди на обслуживание. Этот подход предполагает некую очередь, в которую «выстраиваются» запросы на обслуживание от устройств. Микропроцессор периодически просматривает эту очередь и выполняет обслуживание запросов в ней. Этот вариант, хотя и лучше предыдущего, но тоже не оптимальный. В современных микропроцессорах, каковыми являются микропроцессоры фирмы Intel, принят подход, основанный на понятии прерывания. Прерывание — инициируемый определенным образом процесс, временно переключающий микропроцессор на выполнение другой программы с последующим возобновлением выполнения прерванной программы. Что дает использование механизма прерываний? Он позволяет обеспечить наиболее эффективное управление не только внешними устройствами, но, как мы увидим далее, и программами. Нажимая клавишу на клавиатуре, вы фактически инициируете посредством прерывания немедленный вызов программы, которая распознает нажатую клавишу, заносит ее код в буфер клавиатуры, откуда он в дальнейшем считывается некоторой другой программой или операционной системой. На время такой обработки микропроцессор прекращает выполнение некоторой программы и переключается на так называемую процедуру обработки прерывания. После того как данная процедура выполнит необходимые действия, прерванная программа продолжит выполнение с точки, где было приостановлено ее выполнение. Некоторые операционные системы используют механизм прерываний не только для обслуживания внешних устройств, но и для предоставления своих «услуг». Так, хорошо известная и до сих пор достаточно широко используемая операционная система MS-DOS взаимодействует с системными и прикладными программами преимущественно через систему прерываний.
Исходя из вышеприведенных рассуждений, можно сказать, что прерывания могут быть внешними и внутренними.
Внешние прерывания вызываются внешними по отношению к микропроцессору событиями. На рис. ниже схематически изображена подсистема прерываний компьютера на базе микропроцессора Intel.
На рисунке видно, что у микропроцессора есть два физических контакта — INTR и NMI. На них и формируются внешние по отношению к микропроцессору сигналы, возрастающие фронты которых извещают микропроцессор о том, что некоторое внешнее устройство просит уделить ему внимание. Вход INTR (INTerrupt Request) предназначен для фиксации запросов от различных периферийных устройств, например таких, как системные часы, клавиатура, жесткий диск и т. д. Вход NMI (NonMaskable Interrupt) — немаскируемое прерывание. Этот вход используют для того, чтобы сообщить микропроцессору о некотором событии, требующем безотлагательной обработки, или катастрофической ошибке. Внешние прерывания относятся, естественно, к непланируемым прерываниям. Внутренние прерывания возникают внутри микропроцессора во время вычислительного процесса. К их возбуждению приводит одна из двух причин:
Далее мы рассмотрим особенности обработки прерываний. Как уже отмечалось, микропроцессоры Intel имеют два режима работы — реальный и защищенный. В этих режимах обработка прерываний осуществляется принципиально разными методами. Поэтому на данном уроке мы дадим характеристику реального режима и рассмотрим обработку прерываний в этом режиме. На следующем уроке будет рассмотрен защищенный режим работы микропроцессора, и на последнем уроке мы рассмотрим обработку прерываний в этом режиме. Для глубокого понимания процессов, происходящих в компьютере при осуществлении прерывания, необходимо узнать о том, какие ресурсы компьютера при этом задействуются, каковы их характеристики и принципы функционирования.
В общем случае система прерываний — это совокупность программных и аппаратных средств, реализующих механизм прерываний.
К аппаратным средствам системы прерываний относятся:
К программным средствам системы прерываний реального режима относятся:
При возникновении события, на которое надо отреагировать (запроса на прерывание), обычно процессор автоматически (без участия программиста) выполняет следующие действия:
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) дает возможность программно разрешать/запрещать прерывания отдельно для каждого источника, а также выбирать фрагмент входного сигнала, инициирующий запрос (уровень или фронт, активная полярность).
В любой реальной вычислительной системе далеко не все векторы прерываний и даже не все входы запросов аппаратных прерываний бывают использованы. Разработчик программы или программно- аппаратного комплекса может использовать свободные ресурсы системы прерываний ля собственных нужд, например, для обеспечения реакции на события в "своем" (может быть, нестандартном) периферийном устройстве.