Режим пользователя и режим ядра. Прерывания и исключения. Прерывания и исключения в Linux

§ 3.1.Системаобработкипрерываний

Обладая способностью переключаться от одного потока выполнения к другому,

ядро операционной системы должно к тому же реагировать на прерывания (interrupts) и

исключения (exceptions). Речь идет о сигналах, которые возникают в системе и застав-

ляют процессор прерывать свою работу и переключаться на обработку возникшей си-

туации. Рассмотрим эти два механизма более подробно.

Прерывания представляют собой механизм , позволяющий координировать парал-

лельное функционирование отдельных устройств вычислительной системы и реагиро-

вать на особые состояния, возникающие при работе процессора. Таким образом, преры-

вание-этопринудительнаяпередачауправленияотвыполняемойпрограммык

системе (а через нее - к соответствующей программе обработки прерывания), происхо-

дящая при возникновении определенного события.

Идея прерываний была предложена в середине 50-х годов и можно без преувели-

чения сказать, что она внесла наиболее весомый вклад в развитие вычислительной тех-

ники. Основная цель введения прерываний - реализация асинхронного режима работы и

распараллеливание работы отдельных устройств вычислительного комплекса.

Механизм прерываний реализуется аппаратно-программными средствами. Перво-

начально рассмотрим в общих чертах аппаратную часть системы прерываний. Сигналы

аппаратных прерываний, возникающие в устройствах, входящих в состав компьютера

или подключенных к нему, поступают в процессор не непосредственно, а через два кон-

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

(рис.3.1). В прежних моделях машин контроллеры представляли собой отдельные мик-

росхемы; в современных компьютерах они входят в состав многофункциональной мик-

росхемы периферийного контроллера.

Рис.3.1. Аппаратная часть системы прерываний.

Два контроллера используются для увеличения допустимого числа внешних уст-

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

лишь от восьми устройств. Для обслуживания большего количества устройств контрол-

леры можно объединять, образуя из них веерообразную структуру. В современных ма-

шинах устанавливают два контроллера, увеличивая тем самым возможное число вход-

ных устройств до 15 (7 у ведущего и 8 у ведомого контроллера).

К входным выводам IRQ1...IRQ7 и IRQ8...IRQ15 (IRQ - это сокращение от Interrupt

Request, запрос прерывания) подключаются выводы устройств, на которых возникают

сигналы прерываний. Выход ведущего контроллера подключается к входу INT микро-

процессора, а выход ведомого - к входу IRQ2 ведущего. Основная функция контролле-

ров - передача сигналов запросов прерываний от внешних устройств на единственный


вход прерываний процессора. При этом, кроме сигнала INT, контроллеры передают в

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

сложения базового номера, записанного в одном из его регистров, с номером входной

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

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

номера векторов аппаратных прерываний однозначно связаны с номерами линий, или

уровнями IRQ, а через них - с конкретными устройствами компьютера. На рис.3.1 обо-

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

Процессор, получив по линии INT сигнал прерывания, выполняет последователь-

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

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

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

му прерыванию.

Структуры систем прерывания (в зависимости от аппаратной архитектуры) могут

быть самыми разными, но все они имеют одну общую особенность - прерывание непре-

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

Механизм обработки прерываний независимо от архитектуры вычислительной

системы включает следующие элементы :

1. Установление факта прерывания (прием сигнала на прерывание) и идентифика-

ция прерывания (в операционных системах иногда осуществляется повторно, на

2. Запоминание состояния прерванного процесса. Состояние процесса определяется

прежде всего значением счетчика команд (адресом следующей команды, кото-

рый, например, в i80x86 определяется регистрами CS и IP - указателем команды),

содержимым регистров процессора и может включать также спецификацию ре-

жима (например, режим пользовательский или привилегированный) и другую

информацию.

3. Управление аппаратно передается подпрограмме обработки прерывания. В про-

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

работки прерываний, а в соответствующие регистры - информация из слова со-

стояния. В более развитых процессорах, например в том же i80286 и

последующих 32-битовых микропроцессорах, начиная с i80386, осуществляется

достаточно сложная процедура определения начального адреса соответствующей

подпрограммы обработки прерывания и не менее сложная процедура инициали-

зации рабочих регистров процессора.

4. Сохранение информации о прерванной программе, которую не удалось спасти на

шаге 2 с помощью действий аппаратуры. В некоторых вычислительных системах

предусматривается запоминание довольно большого объема информации о со-

стоянии прерванного процесса.

5. Обработка прерывания. Эта работа может быть выполнена той же подпрограм-

мой, которой было передано управление на шаге 3, но в ОС чаще всего она реа-

лизуется путем последующего вызова соответствующей подпрограммы.

6. Восстановление информации, относящейся к прерванному процессу (этап, об-

ратный шагу 4).

7. Возврат в прерванную программу.

Шаги 1-3 реализуются аппаратно, а шаги 4-7 - программно. На рис.3.2 показано,

что при возникновении запроса на прерывание естественный ход вычислений нарушает-

ся и управление передается программе обработки возникшего прерывания. При этом

средствами аппаратуры сохраняется (как правило, с помощью механизмов стековой па-

мяти) адрес той команды, с которой следует продолжить выполнение прерванной про-

граммы. После выполнения программы обработки прерывания управление возвращается


прерванной ранее программе посредством занесения в указатель команд сохраненного

адреса команды. Однако такая схема используется только в самых простых программ-

ных средах. В мультипрограммных операционных системах обработка прерываний про-

исходит по более сложным схемам, о чем будет более подробно написано ниже.

Рис.3.2. Обработка прерывания

Итак, главныефункциимеханизмапрерываний :

Распознавание или классификация прерываний;

Передача управления соответственно обработчику прерываний;

Корректное возвращение к прерванной программе.

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

как можно быстрей. Одним из быстрых методов является использование таблицы, со-

держащей перечень всех допустимых для компьютера прерываний и адреса соответст-

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

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

поминается либо в памяти с прямым доступом, либо в системном стеке - system stack.

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

на два основных класса: внешние (их иногда называют асинхронными) и внутренние

(синхронные).

Внешниепрерывания вызываются асинхронными событиями, которые происходят

вне прерываемого процесса, например:

Прерывания от таймера;

Прерывания от внешних устройств (прерывания по вводу/выводу);

Прерывания по нарушению питания;

Прерывания с пульта оператора вычислительной системы;

Прерывания от другого процессора или другой вычислительной системы.

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

цессора и являются синхронными с его операциями. Примерами являются следующие

запросы на прерывания:


При нарушении адресации (в адресной части выполняемой команды указан запре-

щенный или несуществующий адрес, обращение к отсутствующему сегменту или

странице при организации механизмов виртуальной памяти);

При наличии в поле кода операции незадействованной двоичной комбинации;

При делении на нуль;

При переполнении или исчезновении порядка;

При обнаружении ошибок четности, ошибок в работе различных устройств аппара-

туры средствами контроля.

Могут еще существовать прерывания при обращении к супервизору ОС - в некото-

рых компьютерах часть команд может использовать только ОС, а не пользователи. Со-

ответственно в аппаратуре предусмотрены различные режимы работы, и пользователь-

ские программы выполняются в режиме, в котором эти привилегированные команды не

исполняются. При попытке использовать команду, запрещенную в данном режиме, про-

исходит внутреннее прерывание и управление передается супервизору ОС. К привиле-

гированным командам относятся и команды переключения режима работа центрального

процессора.

Наконец, существуют собственно программныепрерывания . Эти прерывания

происходят по соответствующей команде прерывания, то есть по этой команде процес-

сор осуществляет практически те же действия, что и при обычных внутренних прерыва-

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

темные программные модули происходило не просто как переход в подпрограмму, а

точно таким же образом, как и обычное прерывание. Этим обеспечивается автоматиче-

ское переключение процессора в привилегированный режим с возможностью исполне-

ния любых команд.

Сигналы, вызывающие прерывания, формируются вне процессора или в самом

процессоре; они могут возникать одновременно. Выбор одного из них для обработки

осуществляется на основе приоритетов, приписанных каждому типу прерывания. Оче-

видно, что прерывания от схем контроля процессора должны обладать наивысшим при-

оритетом (если аппаратура работает неправильно, то не имеет смысла продолжать обра-

ботку информации). На рис.3.3 изображен обычный порядок (приоритеты) обработки

прерываний в зависимости от типа прерываний .

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

Учет приоритета может быть встроен в технические средства, а также определяться

операционной системой, то есть кроме аппаратно реализованных приоритетов прерыва-

ния большинство вычислительных машин и комплексов допускают программно-


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

полняя первый, позволяет применять различные дисциплиныобслуживанияпрерыва-

Наличие сигнала прерывания не обязательно должно вызывать прерывание испол-

няющейся программы. Процессор может обладать средствами защиты от прерываний:

отключение системы прерываний, маскирование (запрет) отдельных сигналов прерыва-

ния. Программное управление этими средствами (существуют специальные команда для

управления работой системы прерываний) позволяет операционной системе регулиро-

вать обработку сигналов прерывания, заставляя процессор обрабатывать их сразу по

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

Обычно операция прерывания выполняется только после завершения выполнения теку-

щей команды. Поскольку сигналы прерывания возникают в произвольные моменты вре-

мени, то на момент прерывания может существовать несколько сигналов прерывания,

которые могут быть обработаны только последовательно. Чтобы обработать сигналы

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

ким приоритетом обрабатывается в первую очередь, обработка остальных сигналов пре-

рывания откладывается.

Программное управление специальными регистрами маски (маскирование сигна-

лов прерывания) позволяет реализовать различные дисциплины обслуживания :

С относительнымиприоритетами , то есть обслуживание не прерывается даже

при наличии запросов с более высокими приоритетами. После окончания обслу-

живания данного запроса обслуживается запрос с наивысшим приоритетом. Для

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

запроса наложить маски на все остальные сигналы прерывания или просто от-

ключить систему прерываний;

С абсолютнымиприоритетами , то есть всегда обслуживается прерывание с

наивысшим приоритетом. Для реализации этого режима необходимо на время

обработки прерывания замаскировать все запросы с более низким приоритетом.

При этом возможно многоуровневое прерывание, то есть прерывание программ

обработки прерываний. Число уровней прерывания в этом режиме изменяется и

зависит от приоритета запроса;

По принципустека , или, как иногда говорят, подисциплине LCFS (last come first

served - последним пришел - первым обслужен), то есть запросы с более низким

приоритетом могут прерывать обработку прерывания с более высоким приорите-

том. Дли этого необходимо не накладывать маски ни на один сигнал прерывания

и не выключать систему прерываний.

Следует особо отметить, что для правильной реализации последних двух дисцип-

лин нужно обеспечить полное маскирование системы прерываний при выполнении ша-

гов 1-4 и 6-7. Это необходимо для того, чтобы не потерять запрос и правильно его об-

служить. Многоуровневое прерывание должно происходить на этапе собственно

обработки прерывания, а не на этапе перехода с одного процесса на другой.

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

реакций на прерывания, в организации обмена информацией (данными и программами),

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

сервиса. Причины прерываний определяет ОС (модуль, который называют супервизо-

ром прерываний), она же и выполняет действия, необходимые при данном прерывании и

в данной ситуации. Поэтому в состав любой ОС реального времени прежде всего входят

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

синхронизации задач, средства распределения памяти и управления ею, а уже потом

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

заметить, что современная ОС реального времени должна вносить в аппаратно-


программный комплекс нечто большее, нежели просто обеспечение быстрой реакции на

прерывания.

Как мы уже знаем, при появлении запроса на прерывание система прерываний

идентифицирует сигнал и, если прерывания разрешены, управление передается на соот-

ветствующую подпрограмму обработки. Из рис.3.2 видно, что в подпрограмме обработ-

ки прерывания имеются двеслужебныесекции . Это - первая секция, в которой осуще-

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

2-м шаге, и последняя, заключительная секция, в которой, наоборот, осуществляется

восстановление контекста. Для того чтобы система прерываний не среагировала повтор-

но на сигнал запроса на прерывание, она обычно автоматически «закрывает» (отключа-

ет) прерывания, поэтому необходимо потом в подпрограмме обработки прерываний

вновь включать систему прерываний. Установка рассмотренных режимов обработки

прерываний (с относительными и абсолютными приоритетами, и по правилу LCFS)

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

время выполнения центральной секции (в случае работы в режимах с абсолютными при-

оритетами и по дисциплине LCFS) прерывания разрешены. На время работы заключи-

тельной секции подпрограммы обработки система прерываний должна быть отключена

и после восстановления контекста вновь включена. Поскольку эти действия необходимо

выполнять практически в каждой подпрограмме обработки прерываний, во многих опе-

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

специальный системный программный модуль, называемый супервизоромпрерываний .

Супервизорпрерываний прежде всего сохраняет в дескрипторе текущей задачи

рабочие регистры процессора, определяющие контекст прерываемого вычислительного

связанные с обслуживанием настоящего (текущего) запроса на прерывание. Наконец,

перед тем как передать управление этой подпрограмме, супервизор прерываний уста-

навливает необходимый режим обработки прерывания. После выполнения подпрограм-

мы обработки прерывания управление вновь передается супервизору, на этот раз уже на

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

очередь, в соответствии с принятым режимом распределения процессорного времени

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

решено выделить процессор. Рассмотренная схема проиллюстрирована на рис.3.4 .

Как видно из рис.3.4, здесь нет непосредственного возврата в прерванную ранее

программу непосредственно из самой подпрограммы обработки прерывания. Для прямо-

го непосредственного возврата достаточно адрес возврата сохранить в стеке, что и дела-

ет аппаратура процессора. При этом стек легко обеспечивает возможность возврата в

случае вложенных прерываний, поскольку он всегда реализует дисциплину LCFS (last

come - first served).

Однако если бы контекст процессов сохранялся просто в стеке, как это обычно

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

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

работы подпрограммы обработки прерывания.

Рассмотрим как производится обработка прерываний в ОС Windows . В этой

операционной системе каждому прерыванию назначается определенный приоритет, на-

зываемый уровнемзапросапрерывания (interrupt request level, IRQL). IRQL назначается

источнику прерывания. Например, мышь имеет IRQL, который присваивается посту-

пающим от нее сигналам. Системный таймер также генерирует собственные прерыва-

ния, которым назначается другой IRQL.


Рис.3.4. Обработка прерывания при участии супервизоров ОС

Центральный процессор также имеет свой IRQL, который изменяется по мере ра-

боты системы. Изменение IRQL центрального процессора позволяет системе блокиро-

вать прерывания с более низким приоритетом. Приоритет процессора могут изменить

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

функционирующие на пользовательском уровне, не имеют таких привилегий. Заблоки-

рованным прерываниям внимание не уделяется до тех пор, пока какой-нибудь поток яв-

ным образом не понизит уровень прерывания центрального процессора. Если процессор

работает при самом низком значении IRQL, происходит нормальное выполнение потока

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

служиванияпрерывания (interrupt service routine, ISR), он сначала назначает централь-

ному процессору тот же IRQL, который имеет перехваченный сигнал. На время выпол-

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

данных, блокируются, чтобы не отвлекать систему от выполнения критических опера-

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

IRQL процессора заблокированные прерывания разблокируются и начинают поочередно

обрабатываться обычным образом. Время от времени центральный процессор переклю-

чается на самый низкий IRQL, чтобы возобновить выполнение прерванных потоков.

Прежде чем приступить к обработке прерывания, перехватчик должен найти в сис-

теме соответствующую подпрограмму. Он ищет такие подпрограммы в таблицерас-

пределенияпрерываний (interrupt dispatch table, IDT). Указанная таблица содержит 32

записи, по одной для каждого уровня запроса прерывания. Каждая из таких записей ука-

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

подпрограмм - в том случае, если несколько устройств используют один и тот же IRQL.

При загрузке в систему новый драйвер устройства записывает в IDT собственный

обработчик. Драйверы делают это путем создания и подключения объекта-прерывания ,

т.е. структуры, содержащей всю информацию, необходимую ядру для дополнения IDT.

С помощью объекта-прерывания драйверы получают возможность зарегистрировать

свои обработчики прерываний, ничего не зная ни об аппаратном устройстве, ни о струк-

туре таблицы распределения прерываний.


§ 3.2.Общиепринципыобработкиисключений

По мере выполнения программы ее нормальная работа по различным причинам

может нарушаться. В частности, это может быть связано с тем, что центральный процес-

сор наталкивается на недопустимый адрес памяти, пользователь прерывает выполнение

программы комбинацией "горячих" клавиш , отладчик произвольным образом

останавливает программу и запускает ее вновь; ошибка может быть связана и с вводом

неправильного значения при выполнении операции с плавающей запятой. Эти и другие

исключительные ситуации способны возникать как на пользовательском уровне, так и

на уровне ядра операционной системы, как в RISC-процессорах, так и в процессорах

Intel. О возникновении подобных ситуаций может сигнализировать и аппаратное, и про-

граммное обеспечение. Любой язык программирования должен содержать средства об-

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

ситуациях. Windows включает встроенные низкоуровневые механизмы структурирован-

ной обработки исключений .

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

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

ной части операционной системы. Однако исключения и прерывания - это не одно и то

же. Прерывания происходят асинхронно, часто в результате определенных аппаратных

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

порт. Программа не имеет возможности контролировать такие прерывания, и они могут

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

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

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

водятся путем повторного запуска программы с тем же контекстом.

Исключения часто генерируются в том случае, если какая-то часть программы об-

наруживает ошибку, но не может обработать ее самостоятельно. Так, система генериру-

ет исключение в ответ на ошибки доступа к памяти и ошибки типа деления на ноль. Од-

нако не все исключения порождаются ошибочными ситуациями. Windows генерирует

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

этого исключения ядро передает управление той части операционной системы, которая

предоставляет запрашиваемый сервис.

Любое порожденное исключение должно быть обработано если не самой програм-

мой, то операционной системой, а точнее, должна откликнуться определенная подпро-

грамма, которая обработает и снимет исключение. Следовательно, обработка исключе-

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

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

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

В процессе поиска соответствующего блока программного кода, предназначенного

для конкретной исключительной ситуации, система сначала просматривает текущую

процедуру, затем возвращается назад по стеку вызовов, просматривает другие активные

отложенные процедуры того же процесса и, наконец, переходит к системным обработ-

чикам исключений. Если процесс, породивший исключение, находится под защитой от-

ладчика, последний также получает шанс обработать исключение.

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

несколько отличаются друг от друга. Например, WOW-подсистема (Windows on Win32 -

защищенная подсистема, выполняющаяся внутри процесса виртуальной DOS-машины)

должна обрабатывать все исключения непосредственно, поскольку клиенты Winl6 не

имеют возможности делать это самостоятельно. Кроме того, в различных языках про-


граммирования может сильно различаться синтаксис операторов обработки исключений.

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

определенную управляющую структуру, связанную с исключениями.

Программисты, впервые столкнувшиеся с проблемой структурированной обработ-

ки исключений, часто ошибочно полагают, что больше нет необходимости проверять

код завершения каждой команды. На самом деле, ошибка - это далеко не то же самое,

что исключение. Функция может завершиться без генерации исключения. Рассмотрим в

качестве примера следующие строки программного кода, реализованного на API-

функциях для ОС Windows:

hBrush = CreateSolidBrush(RGB(255, 0, 0)) ;

hOldBrush = SelectObject(hDC, hBrush);

Rectangle (hDC, 0, 0, 100, 100);

Если первая команда выполняется некорректно и возвращает для создаваемой кис-

ти значение NULL, то функция SelectObject() также не может быть выполнена. Третья

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

нужен. Исключения при этом не генерируются. Единственный способ защиты от подоб-

ных ошибок заключается в проверке возвращаемого значения. Вот еще один пример:

hMemory =GlobalAlloc(GHND, 1000);

pData = (char *)GlobalLock(hMemory);

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

hMemory принимает значение NULL, функция GlobalLock() не выполняется и перемен-

ная pData также получает значение NULL. Однако ни одна из этих ошибок не порождает

исключения. Но следующая строка программного кода при попытке произвести запись

по неправильному адресу генерирует исключение:



// порождает исключение, если pData = NULL


Исключение представляет собой разновидность ошибки, которая не может быть

обработана самой командой. Если функция GlobalAlloc не обнаруживает достаточно

места, для своего выполнения, она просто возвращает значение NULL. Но если операто-

ру присваивания некуда передавать значение, он не выполняет никаких действий и даже

не возвращает код ошибки. При этом порождается исключение, и если процесс не может

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

Часто бывает трудно провести черту между ошибками и исключениями. Различие

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

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

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

операции могут их породить. Например, ошибка в операторе присваивания приводит к

исключению типа нарушениеправдоступа . Список возможных исключений обычно

изменяется в зависимости от конкретною компьютера, однако имеется ряд исключений,

которые определяются на уровне ядра Windows :

Несоответствие типов данных (data-type misalignment);

Прерывание отладчика (debugger breakpoint);

Пошаговая отладка (debugger single-step);

Деление на ноль в операции с плавающей запятой (floating-point divide by zero);

Нарушение прав доступа к памяти (memory-access violation);

Ошибка чтения страницы (page-read error);

Превышение квоты страничного файла (paging file quota exceeded);

Привилегированный оператор (privileged instruction).

Тип возникшего исключения можно определить, используя функцию DWORD Ge-

tExceptionCode(void). Функция возвращает код исключения. В таблице 3.1 приведены

наименования основных кодов.

Таблица 3.1


EXCEPTION_ACCESS_VIOLATION

EXCEPTION_FLT_DIVIDE_BY_ZERO

EXCEPTION_INT_DIVIDE_BY_ZERO

EXCEPTION_INT_OVERFLOW

EXCEPTION_PRIV_INSTRUCTION


Попытка обращения к ячейке памяти,

доступ к которой запрещен (например,

память не выделена)

Деление на ноль с плавающей точкой

Деление на ноль с фиксированной точкой

Целочисленное переполнение

Попытка исполнения привилегированной


§ 3.3.Средстваобработкиисключенийв Visual C++

Блок программного кода на языке С++ всегда должен начинаться ключевыми сло-

вами try и catch. Блок try помечает фрагмент программы, который может породить ис-

ключение, а блок catch содержит программу, запускающуюся при наличии исключения.

С точки зрения программиста, подобные синтаксические структуры удобны для отделе-

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

кода, выполняющего обычные задачи. В Visual C++ реализован механизм обработки

исключений, который основан на схеме, предложенной ANSI-комитетом по стандарти-

зации языка C++. В соответствии с этой схемой, перед вызовом функции, которая может

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

обработчик исключений. Если функция приводит к возникновению ненормальной си-

туации, генерируется исключение и управление передается обработчику.

В среде Visual C++ обработка исключений поддерживается с помощью нескольких

механизмов:

Функций, обеспечивающих структурированную обработку исключений;

Классов, отвечающих за обработку определенных типов исключений;

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

приложения;

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

Все эти механизмы позволяют генерировать исключения нужных типов и при не-

обходимости прекращать выполнение программы.

Как уже было сказано выше, основу любого механизма обработки исключений в

среде Visual C++ составляют операторы try и catch. Структура try/catch отделяет подпро-


©2015-2019 сайт
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-04-02

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

$.1. Виды прерываний и исключений, реализация их обслуживания

Прерываниями (interruption) являются штатные ситуации, возникающие при поступлении соответствующих инструкций (программные прерывания) или внешних сигналов (аппаратные прерывания). Исключениями (exception) являются нештатные ситуации (ошибки), возникающие при работе процессора. При выявлении таких ошибок соответствующие блоки, контролирующие работу процессора, вырабатывают внутренние сигналы запроса, обеспечивающие вызов необходимой подпрограммы обслуживания. Процессор способен обеспечить обслуживание 256 различных типов исключений и прерываний. Соответствующая обработка информации при возникновении таких ситуаций выполняется с помощью специальных подпрограмм (обработчиков) обслуживания (interrupthandlers), указатели на обработчики (вектора прерываний) хранятся в таблице, размещаемой в памяти системы.

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

Программные прерывания – это своеобразный способ вызова процедур, как правило, системных. Осуществляется по инструкциямINTn , INTO , INT 3, BOUND .

Запросы на выполнение аппаратных прерываний поступают от внешних устройств на входыLINT 0/ INTR ,LINT 1/ NMI процессора. В мультипроцессорной системе, когда включен внутренний контроллер локальных прерыванийAPIC(см. раздел $.4), сигналыLINT 1-0 на этих входах определяют номер запроса, поступающего от других устройств (процессоров) системы. В однопроцессорной системе, когда функционирование контроллера APIC запрещено, эти входы служат, соответственно, для подачи маскируемыхINTR и немаскируемыхNMI запросов прерывания от различных внешних устройств.

Маскируемые прерывания вызываются активизацией входаINTR (InterruptRequest). Их обслуживание может быть запрещено (замаскировано) путем установке значения признакаIF=1 в регистре состоянийEFLAGS. Обычно такой запрос поступает от внешнего устройства через специальный контроллер прерываний, который собирает запросы от различных внешних устройств и передает их для обработки процессору, указав для них также номерn определяющий вид прерывания (INTRn). На входNMI поступает запрос на немаскируемое прерывание, процедура обслуживания которого имеет фиксированный номерn=2 (см. табл.$.1). Значение признакаIFв регистреEFLAGSне влияет на обслуживание процессором немаскируемого запроса прерывания NMI. При работе процессора в мультипроцессорной системе, когда функционирует контроллер локальных прерыванийAPIC, запросы аппаратных прерывания (маскируемые и немаскируемые) поступают по специальной APIC-шине (см. разд.$.4).

Для исключений зарезервированы первые 32 вектора в таблице прерываний. Каждый тип исключения имеет мнемоническое обозначение. Исключения делятся на ошибки (Faults ), ловушки (Traps ) иотказы (Aborts ). В табл. $.1 указан их список для защищенного режима. В реальном режиме некоторые прерывания (например, #TSили #PF) имеют несколько другой смысл, но эти случаи здесь не рассматриваются. Пояснение столбца «класс» будет дано при описании отказа #DFв разделе $.2.

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

Чтобы обработать запросы от внешних устройств, сообщить об ошибках или исключительных обстоятельствах необходимо прервать выполнение текущей программы и осуществить некоторые необходимые в данной ситуации действия.. Чем отличаются прерывания и исключения. Различия между прерываниями и исключениями состоят в том, что прерывания предназначены для обработки запросов от внешних устройств, а исключения для обработки ошибок, возникающих при выполнении команд. Программные прерывания также относятся к исключениям. С помощью команды INT n (где n - номер прерывания) можно выполнить прерывание с любым номером в диапазоне от 0 до 255. Номера 0...31 зарезервированы фирмой Intel для исключений. Прерывания, произведенные оборудованием, выполняются после выполнения текущей команды и происходят в результате каких-то внешних асинхронных (не связанных с текущим процессом) событий, нажатие клавиши, например. После того, как программа обработки прерываний заканчивает обслуживание прерывания, выполнение прерванной программы продолжается с команды, которая следует сразу за командой, после которой произошло прерывание. Исключения классифицируются как ошибки, ловушки или прекращения (преждевременное прекращение выполнения программы).

Источниками исключений являются три типа событий:

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

исключения машинного контроля, возникающие в процессе контроля операций внутри чипа и транзакций на шине процессора (справедливо для процессора Pentium 4);

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

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

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

Команда INT n в выполняемой программе заставляет процессор выполнять программу обслуживания, на которую указывает вектор n в таблице прерываний. Современные программы оперируют с преобразованными адресами памяти и программы прерывания служат обычно единственным средством для выхода из программы в операционную систему. Программные прерывания могут использоваться для доступа к сервисам операционной системы (например, INT $21 - сервисы DOS, INT $80 - сервисы Linux), функциям драйверов устройств (например, INT $33 - драйвер мыши) или специальным сервисам (INT $10 - видео-сервис BIOS, INT $31 - DPMI-сервис ), INT $67 - сервис EMS ). Особым случаем программного прерывания INT с номером n является прерывание INT 3, или прерывание останова. Путем ввода данной команды в программу, пользователь имеет возможность устанавливать точки останова, как инструмент отладки программы. Еще один тип программного прерывания, применяемого при отладке, - прерывание пошагового режима.

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

Маскируемые прерывания - наиболее общий способ ответа на асинхронные внешние сигналы от аппаратуры. Такое прерывание может быть разрешено или запрещено. Аппаратное прерывание разрешено тогда, когда бит флага прерываний разблокирован (установлен в 1). Процессор обслуживает разрешенное маскируемое прерывание только после выполнения текущей команды. Он читает вектор прерывания, аппаратно установленный на шине данных, и определяет адрес программы обработки прерывания. Бит флага прерывания в регистре флагов (регистре состояния) может сбрасываться, когда обслуживается прерывание. Это позволяет предотвратить дополнительное прерывание во время обслуживания первого прерывания. Если флаг прерывания установлен, возможно прерывание программы обработки текущего прерывания и обработка другого прерывания, т.е. разрешается обработка вложенных прерываний.

Приоритетность прерываний

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

Немаскируемые прерывания (NMI -- Non-Maskable Interrrupt)

Немаскируемые прерывания обеспечивают обслуживание прерываний очень высокого уровня. Одним из распространенных примеров немаскируемых (NMI) прерываний может служить прерывание по сбою питания. Во время процедуры обслуживания немаскируемых прерываний процессор не будет обслуживать другие прерывания (запрос NMI или INT), до тех пор, пока не будет выполнена команда возврата из прерывания (IRET). Флаг блокировки прерываний устанавливается в начале выполнения немаскируемого прерывания. Если другое немаскируемое прерывание (NMI) произойдет во время обслуживания немаскируемого прерывания, запрос будет сохранен для его обработки после первой команды возврата из программы обработки текущего немаскируемого прерывания.

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

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

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

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

Размещено на http://www.allbest.ru

Министерство образования Республики Беларусь

УЧРЕЖДЕНИЕ ОБРАЗОВАНИЯ «ГРОДНЕНСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ИМЕНИ ЯНКИ КУПАЛА»

Кафедра теоретической физики.

Реферат на тему:

«Прерывания и исключения»

Студента 5 курса физико-технического факультета

Пецевича Андрея Ивановича

Гродно 2014

  • 1. Прерывания
    • 1.1 Oбрабoтка прерываний
    • 1. Внешние
    • 2. Внутренние
    • 3. Программные
    • 1.2 Векторы прерываний
    • 1.4 Типы прерываний
  • 2. Исключения
    • 2.3 Обработчики исключений

1. Прерывания

1.1 Oбрабoтка прерываний

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

1. Внешние;

2. Внутренние;

3. Программные.

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

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

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

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

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

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

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

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

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

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

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

· Восприятие запроса на прерывание: прием сигнала и идентификация прерывания.

· Запоминание состояния прерванного процесса: определяется значением счетчика команд (адресом следующей команды) и содержимым регистров процессора.

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

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

· Восстановление прерванного процесса и возврат в прерванную программу.

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

1. распознавание или классификация прерываний.

2. передача управления соответственно обработчику прерываний.

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

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

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

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

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

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

· Прерывание, которое информирует систему о том, что требуемый сектор диска уже прочитан, его содержимое доступно программе.

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

· Прерывания по нарушению питания.

· Нормальное завершение некоторой операции ввода-вывода (нажатие клавиши на клавиатуре).

· Прерывание по таймеру.

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

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

Существуют два специальных внешних сигнала среди входных сигналов процессора, при помощи которых можно прервать выполнение текущей программы и тем самым переключить работу центрального процессора. Это сигналы NMI (Nоn Mаsсаblе Intеrrupt, немаскируемое прерывани)INTR (intеrrupt rеquеst, запрос на прерывание).

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

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

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

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

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

· при наличии в поле кода не задействованной двоичной комбинации.

· при делении на нуль.

· при переполнении или исчезновении порядка.

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

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

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

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

2. Исключения

Обработка исключительных ситуаций (exception handling) -- механизм языков программирования, предназначенный для описания реакции программы на ошибки времени выполнения и другие возможные проблемы (исключения), которые могут возникнуть при выполнении программы и приводят к невозможности (бессмысленности) дальнейшей отработки программой её базового алгоритма. В русском языке также применяется более короткая форма термина: «обработка исключений».

прерывание исключение программа ошибка

2.1 Общее понятие исключительной ситуации

Во время выполнения программы могут возникать ситуации, когда состояние данных, устройств ввода-вывода или компьютерной системы в целом делает дальнейшие вычисления в соответствии с базовым алгоритмом невозможным или бессмысленными. Классические примеры подобных ситуаций приведены ниже Нулевое значение знаменателя при выполнении операции целочисленного деления. Результата у операции быть не может, поэтому ни дальнейшие вычисления, ни попытка использования результата деления не приведут к решению задачи. Ошибка при попытке считать данные с внешнего устройства. Если данные не удаётся ввести, любые дальнейшие запланированные операции с ними бессмысленны. Исчерпание доступной памяти. Если в какой-то момент система оказывается не в состоянии выделить достаточный для прикладной программы объём оперативной памяти, программа не сможет работать нормально. Появление сигнала аварийного отключения электропитания системы. Прикладную задачу, по всей видимости, решить не удастся, в лучшем случае (при наличии какого-то резерва питания) прикладная программа может озаботиться сохранением данных.Появление на входе коммуникационного канала данных, требующих немедленного считывания. Чем бы ни занималась в этот момент программа, она должна перейти к чтению данных, чтобы не потерять поступившую информацию.

2.2 Виды исключительных ситуаций

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

2.3 Обработчики исключений

В отсутствие собственного механизма обработки исключений для прикладных программ наиболее общей реакцией на любую исключительную ситуацию является немедленное прекращение выполнения с выдачей пользователю сообщения о характере исключения. Можно сказать, что в подобных случаях единственным и универсальным обработчиком исключений становится операционная система. Например, в операционную систему Windows встроена утилита Dr. Watson, которая занимается сбором информации об необработанном исключении и ее отправкой на специальный сервер компании Microsoft. Возможно игнорирование исключительной ситуации и продолжение работы, но такая тактика опасна, так как приводит к ошибочным результатам работы программ или возникновению ошибок впоследствии. Например, проигнорировав ошибку чтения из файла блока данных, программа получит в своё распоряжение не те данные, которые она должна была считать, а какие-то другие. Результаты их использования предугадать невозможно. Обработка исключительных ситуаций самой программой заключается в том, что при возникновении исключительной ситуации, управление передаётся некоторому заранее определённому обработчику -- блоку кода, процедуре, функции, которые выполняют необходимые действия. Существует два принципиально разных механизма функционирования обработчиков исключений.

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

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

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

Неструктурная обработка -- практически единственный вариант для обработки асинхронных исключений, но для синхронных исключений она неудобна: приходится часто вызывать команды установки/снятия обработчиков, всегда остаётся опасность нарушить логику работы программы, пропустив регистрацию или разрегистрацию обработчика.

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

Размещено на Allbest.ru

Подобные документы

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

    лекция , добавлен 09.12.2013

    Принципы и алгоритмы обработки прерываний. Набор действий по реализации этапов обработки прерываний микропроцессора. Разработка структуры и алгоритма резидентной программы. Реализация программы на языке Ассемблер, методы её отладки и тестирования.

    курсовая работа , добавлен 22.12.2014

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

    реферат , добавлен 22.06.2011

    Прерывание и его природа. Контролер прерываний. Обработка прерываний в реальном режиме. Характеристики реального режима работы микропроцессора. Схема обработки прерываний в реальном режиме. Написание собственного прерывания. Разработка в общем случае.

    доклад , добавлен 22.09.2008

    Проектирование механизма обработки прерываний. Контроллер прерываний Intel 82C59A. Ввод-вывод по прерыванию. Программируемый контроллер интерфейса Intel 82C55A. Роль процессора в обработке прерывания ввода-вывода. Обзор алгоритма обработки прерывания.

    контрольная работа , добавлен 19.05.2010

    Виртуальные функции, статические и абстрактные классы, шаблоны: элементы и члены класса, их роль в объектно-ориентированном программировании; механизм осуществления виртуального вызова при выполнении программы; обработка исключительных ситуаций в C++.

    реферат , добавлен 06.12.2010

    Фаза "избавления" программы от ошибок. Задача обработки ошибок в коде программы. Ошибки с невозможностью автоматического восстановления, оператор отключения. Прекращение выполнения программы. Возврат недопустимого значения. Директивы РНР контроля ошибок.

    учебное пособие , добавлен 27.04.2009

    Написание алгоритма приема 10 пакетов по 12 байт из последовательного порта и размещение их в памяти PRAM. Создание управляющего блока PTSCB для режима блоковой передачи данных. Аппаратная обработка прерываний в режима аналого-цифрового сканирования.

    практическая работа , добавлен 25.04.2012

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

    презентация , добавлен 21.06.2014

    Принципы организации и особенности обработки прерываний на основе контроллера 8259A. Общая характеристика аппаратных средств системы прерываний PIC (Programmable Interrupt Controller). История разработки и порядок работы с технологией Plag and Play.

  • Эксперименты с ядром
  • Пришла пора продолжить серию постов об экспериментах с разработкой Операционной Системы. У меня есть загрузчики, есть билд-система для сборки ядра. Есть заготовка экранных функций. Загрузчик загружает ядро в память по адресу 0x10000, переводит процессор в защищенный режим и передает управление на ядро. Ядро в данный момент просто выводит на экран несколько отладочных сообщений в цикле. Эдакий сферический конь в вакууме. Работает этот «конь» недолго. Дело в том, что у компьютера по-умолчанию настроены ряд прерываний. В частности таймер. Это прерывание вызывается весьма часто. В момент старта компьютер работает в реальном режиме. И прерывания обрабатываются обработчиками прерываний реального режима. Таблица прерываний реального режима находится в адресах 0 — 0x400.

    В защищённом режиме, прерывания обрабатываются по-другому. У меня кода обработки прерываний пока нет, поэтому первое же прерывание приводит мою тестовую систему к перезагрузке.

    Об обработке прерываний есть статья James Molloy: http://www.jamesmolloy.co.uk/tutorial_html/4.-The%20GDT%20and%20IDT.html . Есть ещё другие материалы, но я планирую для начала обратиться к первоисточникам. К документации Intel.

    Прерывания и исключения — события, означающие что где-то в системе
    (оборудовании) или внутри текущей выполняющейся программы или
    задачи возникло состояние, требующее немедленного внимания
    процессора. Обычно прерывания и исключения приводят к принудительной
    передачи управления от текущей выполняемой программы или задачи к
    специальной программной процедуре или задаче, называемой
    обработчиком прерывания или обработчиком исключения. Действие,
    выполняемое процессором в ответ на прерывание или исключение
    называют обработка прерывания или исключения (servicing or handling the
    interrupt or exception).

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

    Исключения возникают когда процессор определяет возникновение ошибки
    (detects error condition) в процессе выполнения инструкции. Например —
    деление на ноль. Процессор определяет разнообразные error conditions
    включая нарушения защиты (protection violations), ошибки страниц (page
    faults), internal machine faults. Архитектура процессоров Pentium 4, Intel Xeon,
    P6 family и Pentium позволяет генерацию machine-check excheption при
    возникновении внутренних аппаратных ошибок (hardware errors) или
    ошибок шины (bus errors).

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

    Для упорядочивания обработки исключений и прерываний, каждому
    отдельному исключению и каждому прерыванию (interrupt condition),
    требующему специальной обработки процессором, назначается уникальный
    идентификатор, называемый номером вектора (vector number). Процессор
    использует vector number (номер), назначенный исключению или
    прерыванию как индекс в таблице дескрипторов прерываний (interrupt
    descriptor table IDT). Таблица содержит адреса (entry point) обработчиков
    исключений или прерываний.

    Разрешенный диапозон для vector numbers от 0 до 255. Номера от 0 до 31
    зарезервированы в Intel 64 и IA-32 архитектурах для architecturedefined
    прерываний и исколючений. Не все из vector numbers в этом диапозоне
    имеют назначенную функцию. Неназначенные vector numbers в этом
    диапозоне зарезервированы. Не используйте эти зарезервированные
    номера.

    Vector numbers в диапозоне от 32 до 255 отведены под user-defined
    прерывания и не зарезервированы Intel 64 и IA-32 архитектурами. Эти
    прерывания в основном предназначены для внешних устройств ввода-
    вывода.

    Процессор получает прерывания из 2-х источников:
    — Внешние (аппаратно генерируемые) прерывания.
    — Программно-генерируемые прерывания.

    Внешние (аппаратные) прерывания

    Внешние прерывания получаются через контакты процессора или через
    локальный контроллер прерываний APIC. Главные контакты, означающие
    состояние прерывания на процессорах Pentium 4, Intel Xeon, P6 family и
    Pentium — LINT pins, соединенные с локальным APIC. Когда локальный
    APIC включен, LINT pins, могут быть запрограммированы с помощью
    APIC local vector table (LVT), на ассоциацию с любым процессорным
    исключением или вектором прерывания.

    Когда локальный APIC является глобальным/аппаратные прерывания
    запрещены, тогда эти контакты конфигурируются как INTR и NMI контакты,
    соответственно. Сигнал на контакте INTR сигнализирует процессору, что
    внешнее прерывание возникло. Процессор читает из системной шины
    inerrupt vector, предоставляемый внешним контроллером прерываний,
    таким как 8259A. Сигнал на контакте NMI говорит процессору, что
    немаскируемое прерывание (NMI), назначенное на вектор прерывания 2.

    Vector No. Mnemonic Description Type Error Code Source
    0 #DE Divide Error Fault No DIV и IDIV инструкции
    1 #DB RESERVED Fault/Trap No For Intel use only
    2 NMI Interrupt Interrupt No Nonmaskable externel
    interrupt
    3 #BP Breakpoint Trap No INT 3 instruction
    4 #OF Overflow Trap No INT0 instruction
    5 #BR BOUND Range Exceeded Fault No BOUND instruction
    6 #UD Invalid Opcode (Undefined
    Opcode)
    Fault No UD2 instruction or reserved
    opcode
    7 #NM Device Not Available (No
    Math Coprocessor)
    Fault No Floating-point or WIT/FWAIT
    instruction
    8 #DF Double Fault Abort Yes (zero) Any instruction that can
    generate an exception, an NMI, or an INTR.
    9 Coprocessor Segment Overrun
    (reserved)
    Fault No Floating-point instruction
    10 #TS Invalid TSS Fault Yes Task switch or TSS access.
    11 #NP Segment Not Present Fault Yes Loading segment registers or
    accessing system segments.
    12 #SS Stack-Segment Fault Fault Yes Stack operations and SS
    register loads
    13 #GP General Protection Fault Yes Any memory reference and
    other protection checks
    14 #PF Page Fault Fault Yes Any memory reference
    15 (Intel reserved. Do not use) Fault No
    16 #MF x87 FPU Floating-Point Error
    (Math Fault)
    Fault No x87 FPU floating-point or
    WAIT/FWAIT instruction
    17 #AC Alignment Check Fault Yes(Zero) Any data reference in memory
    18 #MC Machine Check Abort No Error codes (if any) and
    source are model dependant
    19 #XM SIMD Floating-Point Exception Fault No SSE/SSE2/SSE3 floating point
    instructions
    20-31 Intel reserved. Do not use.
    32-255 User Defined (Non
    reserved)
    Interrupts
    Interrupt External interrupt or INT n
    instruction

    Внутренний контроллер прерываний процессора localAPIC обычно соединен с
    системным контроллером прерываний I/O APIC. Внешние прерывания
    полученные через контакты системного контроллера прерываний I/O APIC
    могут быть направлены на внутренний контроллер прерываний local APIC
    через системную шину (Pentium 4, Intel Core Duo, Intel Core 2, Intel® Atom™,
    and Intel Xeon processors) или через APIC serial bus (P6 family and Pentium
    processors). Внешний контроллер прерываний I/O APIC определяет vector
    number прерывания и шлёт этот номер внутреннему контроллеру
    процессора (local APIC). Когда система включает множество процессоров,
    процессоры могут также слать прерывания один другому посредством
    системной шины (Pentium 4, Intel Core Duo, Intel Core 2, Intel Atom, and
    Intel Xeon processors) или посредством APIC serial bus (P6 family and
    Pentium processors).

    Контакты LINT не доступны в процессорах Intel486 и ранних
    процессорах Pentium не имеющих встроенного внутреннего local APIC. Эти
    процессоры имеют специальные жестко назначенные контакты NMI и INTR.
    В системах с такими процессорами прерывания обычно генерируются
    системным контроллером прерываний (8259A), с посылкой прерываний
    через контакт INTR.

    Заметьте, что несколько других контактов на процессоре могут приводить
    к возникновению процессорного прерывания. Однако эти прерывания не
    обрабатываются механизмом обработки прерываний и исключений
    описанным здесь. Эти контакты включают: RESET#, FLUSH#, STPCLK#,
    SMI#, R/S#, and INIT#. Есть ли они у конкретного процессора, зависит от
    реализации конкретной модели. Функции контактов описаны в технических
    описаниях прилагаемых к конкретным процессорам. Контакт SMI#
    описывается в главе 26 «System Management».

    Любое внешнее прерывание доставленное процессору посредством
    контакта INTR или через внутренний local APIC называется маскируемым
    аппаратным прерыванием. Через Маскируемые аппаратные прерывания
    доставленные через контакт INTR могут быть любыми в диапозоне 0 — 255.
    Прерывания доставленные через внутренний local API могут быть векторами
    в диапозоне 16 — 255.

    Флаг IF регистра EFLAGS позволяет маскировать всю группу маскируемых
    аппаратных прерываний. При получении прерываний с векторами от 0 до
    15 через внутренний local APIC, APIC сообщает (indicates) получение
    неверного вектора прерывания.

    Процессор получает исключения из трех источников:
    — Обнаруживаемые процессором Program-Error exceptions
    — Программно генерируемые исключения
    — Machine-check exceptions.

    Program-Error Exceptions

    Процессор генерирует одно или более исключений при обнаружении
    программных ошибок в процессе выполнении приложения, кода
    операционной системы или executive. Архитектуры Intel64 и IA-32
    определяют vector number для каждого processor-detectable exception.
    Исключения подразделяются на faults, traps и aborts.

    Программно-генерируемые исключения

    Инструкции INTO, INT3 и BOUND позволяют программную генерацию
    исключений. Эти инструкции позволяют выполнение проверки условий в
    местах выполнения потока инструкций. Например INT 3 вызывает
    генерацию breakpoint exception. Инструкция INT n может быть использована
    для эмуляции исключений в программах, но есть ограничение. Если INT n
    вызывает вектор для одного из architecturally-defined исключений,
    процессор генерирует прерывание на корректный вектор (для доступа
    к обработчику исключения) но не кладет код ошибки на стек. В отличии
    от аппаратно-генерируемое исключения нормально сохраняющего на стеке
    код ошибки. Обработчик исключения будет пытаться взять
    код ошибки со стека при обработке исключения. Но, так как код ошибки
    не был сохранён в стеке, вместо кода ошибки из стека будет извлечён
    EIP (на месте пропущенного кода ошибки). Это приведёт к возврату из
    обработчика по неверному адресу. (Т.о. нельзя с помощью INT n
    обращаться к обработчикам аппаратно-генерируемых исключений).

    Machine-Check Exceptions

    Процессоры семейств P6 family и Pentium предоставляют внутренние и
    внешние machine-check механизмы для проверки операций внутреннего
    аппаратного чипа и транзакций шины. Эти механизмы — implementation
    dependent (непереносимы). Когда процессор обнаруживает machinecheck
    ошибку, процессор сигнализирует об ошибке с помощью machine-check
    exception (vector 18) и возвращает код ошибки.

    Классификация исключений

    Исключения подразделяются на faults , traps и aborts в зависимости от
    пути их поступления или в зависимости от возможности рестара
    инструкции вызвавшей исключение без потери работоспособности
    (continuity) программы или задачи.



    
    Top