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

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

хорошую работу на сайт">

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

Размещено на 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.

Для надежного управления ходом выполнения приложений операционная система должна иметь по отношению к приложениям определенные привилегии . Обеспечить, привилегии операционной системе невозможно без специальных средств аппаратной поддержки. Аппаратура компьютера должна поддерживать как минимум два режима работы - пользовательский (user mode) и привилегированный , который также называют режимом ядра (kernel mode), или супервизора (supervisor mode). Подразумевается, что операционная система или некоторые ее части работают в привилегированном режиме , а приложения - в пользовательском режиме . Так как основные функции ОС выполняются ядром, то чаще всего именно ядро становится той частью ОС, которая работает в привилегированном режиме.

Иногда это свойство - работа в привилегированном режиме - служит основным определением понятия «ядро ». Приложения ставятся в подчиненное положение за счет запрета для них выполнения в пользовательском режиме некоторых критичных команд (инструкций), связанных с переключением процессора с задачи на задачу, управлением устройствами ввода-вывода, доступом к механизмам распределения и защиты памяти . Выполнение некоторых команд в пользовательском режиме запрещается безусловно (очевидно, что к таким командам относится команда перехода в привилегированный режим ), тогда как другие запрещается выполнять только при определенных условиях . Например, команды ввода-вывода могут быть запрещены приложениям при доступе к контроллеру жесткого диска , который хранит данные, общие для ОС и всех приложений, но разрешены при доступе к последовательному порту , выделенному в монопольное владение определенного приложения. Важно, что условия разрешения выполнения критичных команд находятся под полным контролем ОС , и этот контроль обеспечивается за счет набора команд , безусловно запрещенных для пользовательского режима. Аналогичным образом обеспечиваются привилегии ОС при доступе к памяти . Например, выполнение команды доступа к памяти для приложения разрешается, если она обращается к области памяти, отведенной данному приложению операционной системой , и запрещается при обращении к областям памяти, занимаемым ОС или другими приложениями . Полный контроль ОС над доступом к памяти достигается за счет того, что команды конфигурирования механизмов защиты памяти (например, изменения ключей защиты памяти в мэйнфреймах IBM или указателя таблицы дескрипторов памяти в процессорах Pentium) разрешается выполнять только в привилегированном режиме . Очень важно, что механизмы защиты памяти используются операционной системой не только для защиты своих областей памяти от приложений, но и для защиты областей памяти, выделенных ОС какому-либо приложению, от остальных приложений . Говорят, что каждое приложение работает в своем адресном пространстве . Это свойство позволяет локализовать некорректно работающее приложение в собственной области памяти , так что его ошибки не оказывают влияния на остальные приложения и операционную систему .

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

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

· Внешние

· Внутренние

· Программные

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

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

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

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

11 ответов

Перехват - это сигнал ЦП, генерируемый аппаратным обеспечением, или конкретные инструкции ЦП. Это вызывает выполнение обработчиков interupt. Такие вещи, как сигналы ввода-вывода от оборудования ввода/вывода, генерируют прерывания.

Исключение можно рассматривать как программную версию interupt, которая влияет только на ее процесс.

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

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

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

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

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

Ответ Ron Savage относится к конструкции программного обеспечения. Это чисто исключение на уровне приложения, где часть кода может указывать на ошибку, которая может быть обнаружена каким-либо другим фрагментом кода. Здесь вообще нет участия в оборудовании.

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

И, в-третьих, есть аппаратное исключение. С точки зрения поведения он идентичен прерыванию в том, что процессор немедленно перейдет в некоторую назначенную ячейку памяти и начнет выполнение. Если исключение отличается от прерывания, это исключение вызвано некоторой незаконной деятельностью, обнаруженной процессором. Например, MMU на процессоре обнаружит незаконный доступ к памяти и вызовет исключение. Эти аппаратные исключения являются начальным триггером для операционной системы для выполнения задач очистки (как описано в параграфе выше).

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

Если ваша программа не работает без операционной системы (или вы разрабатываете ОС), она никогда не увидит необработанное исключение/прерывание. Они попадают под ОС и обрабатываются им (прерывания) или преобразуются в какую-либо другую форму перед отражением обратно в пользовательскую программу (например, сигналы в UNIX, обработка структурированных исключений (SEH) в Windows), где у нее есть возможность обработки он.

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

Существует множество вариантов этой основной темы: прерывания могут быть сгенерированы программным обеспечением, другая задача может получить процессор после ISR и т.д. Ключевым моментом является то, что прерывания могут возникать в любое время по причине кода/У CPU нет контроля над .

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

Исключения оборудования

Некоторые процессоры (например, PowerPC) определяют исключения, указывающие на то, что произошло какое-то необычное условие: System Reset, Invalid Address, некоторая ошибка кэширования перевода виртуального адреса и т.д.

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

Исключения ОС

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

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

Я бы рассматривал window Structured Exception Handlers (SEH) как исключение этого типа.

Исключения программного обеспечения

Некоторые языки, такие как Java, С++ и С#, имеют концепцию программных исключений, где язык обеспечивает обработку непредвиденных или необычных условий, связанных с работой программы. В этом случае исключение возникает в какой-то момент кода, а некоторый код выше в стеке выполнения программы "ломает" исключение и выполняет. Это то, что делают блоки try/catch.

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

Прерывание

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

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

  • такие как нарушение доступа к памяти
  • чтобы ОС выполняла операцию для поддержки запущенной программы, например, прерывания программного обеспечения или запроса подкачки памяти
  • аппаратное устройство требует внимания, такого как принятый сетевой пакет, или пустой буфер передачи

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

Ловушки

В терминах прерываний общие ошибки являются условиями гонки. Например, у вас может быть прерывание, которое периодически увеличивает глобальные часы реального времени. Часы могут быть 64 бит на 32-битной машине.

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

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

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

Я расскажу о том, что такое прерывание, потому что есть один критический тип прерывания, с которым никто еще не справился: таймер.

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

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

Итак, скажем, я пишу простую программу на С, которая подсчитывает все числа или последовательность Фибоначчи или что-то еще без остановки. Или еще лучше: ничего не происходит, кроме спины внутри (1) цикла. Как другие процессы в системе получают возможность запускать? Что делать, если ничего не происходит, чтобы вызвать прерывание?

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

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

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

Сохранение простых вещей...

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

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

При обработке прерывания вы можете решить исключение, но это не значит, что вы должны рассматривать прерывание как исключение. Исключения не "прерывают" (так как это подразумевает возможность возврата к тому, что вы делали непосредственно перед тем, как вас прервали); скорее, они "прерывают" (некоторые подмножества) вашу текущую деятельность.

И, как уже отмечалось несколько раз, прерывания обычно запускаются внешними объектами, такими как аппаратные средства или пользователи (например, щелчок мышью или нажатие клавиши, например CTRL-C), в то время как исключения генерируются (выбрасываются) синхронно с помощью программного обеспечения, обнаруживающего "проблему" "или" исключительное условие ".

Чтобы обработать запросы от внешних устройств, сообщить об ошибках или исключительных обстоятельствах необходимо прервать выполнение текущей программы и осуществить некоторые необходимые в данной ситуации действия.. Чем отличаются прерывания и исключения. Различия между прерываниями и исключениями состоят в том, что прерывания предназначены для обработки запросов от внешних устройств, а исключения для обработки ошибок, возникающих при выполнении команд. Программные прерывания также относятся к исключениям. С помощью команды 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) восстанавливается прежнее состояние процессора и по адресу возврата (по адресу сохраненному в стеке) возобновляется выполнение программы.

Прерывание обычно определяется как событие, меняющее последовательность инструкций, выполняемых процессором.
Прерывания часто подразделяются на синхронные и асинхронные:
- синхронные прерывания выдаются управляющим блоком процессора при выполнении инструкций и называются синхронными, потому что управляющий блок процессора выдает их только по окончании выполнения инструкции;
- асинхронные прерывания генерируются другими аппаратными устройствами в произвольные моменты времени по отношению к тактовым сигналам процессора.
В руководствах по микропроцессорам Intel синхронные и асинхронные прерывания обозначаются терминами «исключения» и «прерывания» соответственно.
Обработка прерываний является для ядра одной из задач, требующих исключительно тонкого подхода, потому что она должна удовлетворять следующим ограничениям:
Прерывания могут поступать в любой момент, например, когда ядро заканчивает какую-то операцию. Следовательно, цель ядра в том, чтобы как можно скорее убрать прерывание с дороги и отложить выполнение связанных с прерыванием действий, насколько это возможно. Например, предположим, что по сети прибыл блок данных. Когда устройство прервет ядро, последнее может просто отметить у себя наличие данных и позволить процессору доделать то, что он выполнял перед этим, а остальные действия, касающиеся данных (копирование их в буфер процесса-получателя и запуск самого процесса), выполнить позже. Таким образом, действия, совершаемые ядром в ответ на прерывание, делятся на неотложные, которые ядро выполняет сразу, и на те, которые можно оставить на потом.
Поскольку прерывания могут поступать в любой момент, возможна ситуация, когда во время обработки одного прерывания возникает второе (имеющее другой тип). Такой подход оправдан, потому что он позволяет поддерживать занятость устройств ввода/вывода. Иными словами, обработчик прерываний должен быть написан так, чтобы соответствующие части ядра могли быть выполнены вложенным образом. Когда завершится последний обработчик, ядро должно быть в состоянии возобновить выполнение прерванного процесса или переключиться на другой процесс, если сигнал прерывания вызвал активность планировщика.
Хотя ядро может принять новый сигнал прерывания во время обработки предыдущего, в коде ядра имеются критические области, в которых прерывания должны быть отключены.
Ошибки в общем случае могут быть исправлены; после их исправления программе разрешается работать дальше без потери целостности. Сохраненное значение регистра eip является адресом инструкции, вызвавшей ошибку, и, следовательно, эта инструкция может быть выполнена снова, когда обработчик исключения возвратит управление. Ловушки срабатывают сразу после выполнения соответствующей инструкции. После того как ядро возвратит управление программе, ей разрешается работать дальше без потери целостности. Сохраненное значение регистра eip является адресом инструкции, которая должна быть выполнена после инструкции, вызвавшей это исключение. Ловушки применяются, в основном, для целей отладки. Роль сигнала прерывания в данном случае сводится к уведомлению отладчика о выполнении конкретной инструкции (например, в программе достигнута точка останова). IP адрес инструкции, вызвавшей исключение. Аварии применяются для индикации серьезных ошибок, таких как сбои аппаратной части или противоречивые данные в системных таблицах. Сигнал прерывания, посылаемый управляющим блоком, является тревожным сигналом, используемым для передачи управления соответствующему обработчику исключений - аварий. У этого обработчика нет иного выбора, кроме принудительного завершения проблемного процесса.