Что такое код abort


Что такое прерывание? Какие шаги выполняет система прерываний при возникновении запроса прерываний? Какие бывают прерывания?

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

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

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

2. Автоматически сохраняется некоторая часть контекста прерванного потока, которая позволит ядру возобновить исполнение потока процесса после обработки прерывания. В это подмножество обычно включаются значения счетчика команд, слова состояния машины, хранящего признаки основных режимов работы процессора (пример такого слова — регистр EFLA6S в Intel Pentium), а также нескольких регистров общего назначения, которые требуются программе обработки прерывания. Может быть сохранен и полный контекст процесса, если ОС обслуживает данное прерывание со сменой процесса. Однако в общем случае это не обязательно, часто обработка прерываний выполняется без вытеснения текущего процесса1.

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

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

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

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

Различают следующие типы прерываний:

внешние (аппаратные) ,
внутренние (исключения -exception),
программные

Не нашли то, что искали? Воспользуйтесь поиском:

Описание функций языка Си

All | _ | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

abort – аварийное завершение работы

#include
void abort (void);

нет возвращаемых значений

Функция abort() вызывает немедленное аварийной завершение работы программы, то есть без вызова функций, нормального завершения работы, зарегистрированных функцией atexit().

Ее действия эквивалентны вызову функции raise (SIGABRT). То есть при вызове функции abort() посылается сигнал SIGABRT с помощью функции raise(). Сигнал SIGABRT будет доставлен, даже если он был замаскирован.

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

Эта программа при вводе символа ‘q’ нормально завершает свою работу, а при вводе символа ‘a’ вызывает функцию аварийного завершения работы. На ввод других символов программа не реагирует.

Если пользователь ввел символ ‘q’, то результат будет следующим:

Если пользователь ввел символ ‘a’, то результат будет следующим:

Прерывания


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

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

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

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

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

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

tp – время реакции системы на прерывание;
tз – время запоминания состояния прерываемой программы;
tппр – время собственно прерывающей программы;
tв – время восстановления состояния прерванной программы

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

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

Характеристиками системы прерывания являются:

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

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

Что такое «аборт» на компьютерном сленге?

Вероятно, имеется ввиду один из вариантов ответа в типовом диалоге Windows. Особенного значения не имеет, просто чтение слова Abort. Данная кнопка означает прерывание текущего выполняемого действия и по смыслу близка с Cancel.

Доброго времени суток! На сленге программистов или просто «копмпьютерщиков», как говорится, аборт — это отмена выполнения запрограммированного действия или команды. «комп тупит — жми аборт, возможно проблема иссякнет». Спасибо за ваш вопрос!

Что такое код abort

Обычно Abort Handler срабатывает, когда произошло некорректное обращение к данным (чтение или запись) — программа попыталась что-то сделать с данными по адресу, который не существует.

При этом срабатывает исключение Data Abort, которое заставляет процессор ARM перейти по фиксированному адресу 0x00000010, где, в свою очередь, стоит безусловный переход в обработчик Abort_Handler. Например, по адресу 0x00000010 может быть команда LDR PC, [PC, #+20], загружающая в счетчик команд адрес из таблицы векторов переходов по исключению (адрес находится по смещению +20 относительно текущего счетчика команд. Назовем этот адрес меткой Abort Handler:). По этому месту компилятор ставит тупое зацикливание:
Abort Handler:
B Abort_Handler

При срабатывании Abort Handler можно посмотреть, откуда это произошло (какой код вызвал ошибку). Для этого нужно в отладчике остановить выполнение программы (курсор текущего местоположения окна Disassembler должен показывать на Abort_Handler), и посмотреть содержимое регистра LR (Link Register — в нем сохраняется содержимое программного счетчика при вызове подпрограмм) — в нем будет находится адрес, где сработало исключение Data Abort.

Несмотря на то, что есть такое удобное средство, чтобы выявить источник ошибки, иногда разобраться в ошибке бывает нелегко, особенно если она возникает случайно или в том месте, где работает чужой код. У меня такое произошло в обработчике прерывания, обслуживающее прерывание по изменению уровня на ножках ввода/вывода. Этот обработчик я взял из примеров IAR, так как там было очень удобно сделана обработка изменения уровней на отдельных ножках — для каждой ножки можно назначить свой обработчик. Вот код, который у меня вызывал Data Abort (pio_it.c):
//——————————————————————————
/// Handles all interrupts on the given PIO controller.
/// \param id PIO controller ID.
/// \param pBase PIO controller base address.
//——————————————————————————
void PioInterruptHandler (unsigned int id, AT91S_PIO *pBase)
<
unsigned int status;
unsigned int i;

// Check PIO controller status
status = pBase->PIO_ISR;
status &= pBase->PIO_IMR;
if (status != 0)
<
trace_LOG(trace_DEBUG, «-D- PIO interrupt on PIO controller #%d\n\r», id);

// Check all sources
i = 0;
while (status != 0)
<
// There cannot be an unconfigured source enabled.
SANITY_CHECK(i


Ошибка происходила случайно, и локализовать её обычными средствами не удавалось. Причина была в переполнении массива static InterruptSource pSources[MAX_INTERRUPT_SOURCES] (pio_it.c). У меня при задании нового источника прерывания количество прерываний numSources превышало MAX_INTERRUPT_SOURCES (стало 8, а MAX_INTERRUPT_SOURCES было равно 7), и происходило обращение к переменной вне массива (if (pSources[i].pPin-> >

[Общая схема — как ловить ошибки при зависании Abort_Handler]

1. В отладчике нужно посмотреть содержимое LR (адрес) — оттуда произошло зависание.
2. В подпрограмме (которую находим по адресу в LR), где произошло зависание, нужно поставить условную точку останова. Условие останова нужно подобрать такое, при котором должно произойти зависание (чтобы оно сработало до зависания). После попадания в точку останова нужно изучить неверные параметры вызова функции, являющиеся причиной зависания. Потом нужно изучить код, который стал причиной появления таких неверных параметров.
3. Если создать условие останова трудно (условие сложное), то подготавливают глобальные переменные, куда сохраняют все параметры исследуемой (вызывающей зависание) функции. После того, как произошло исключение Abort_Handler, изучают содержимое сохраненных параметров функции, и по их содержимому вычисляют причину ошибки.

Илон Маск рекомендует:  Удалить все сообщения из почтового ящика(POP3)

Прерывания и особые ситуации: Типы прерываний

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

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

  • Прерывания и особые ситуации (Interrupts and Exceptions) — обнаруживаются и обрабатываются процессором в самые различные моменты времени и могут происходить как из внешних так и из внутренних источников, все другие типы экстраординарных ситуаций занимают более низкий уровень иерархии и могут обрабатываться, только если сперва заявят о своем существовании через прерывание или особую ситуацию.
  • Исключительные ситуации FPU(Floating-Point Exceptions) — могут возникать только при выполнении команд сопроцессора, команд MMX или 3DNow!-команд. Возникновение исключительной ситуации FPU, в свою очередь, может вызывать генерацию прерывания через подачу сигнала на специальные внешние выводы процессора (так называемая реакция в стиле MS-DOS) или особой ситуации (внутренний механизм процессора обеспечивает генерацию ошибки сопроцессора #MF), обработчик которой далее сам разбирается с тем, какое исключение произошло и какие действия в связи с этим следует предпринять (подробнее . ).
  • Исключительные ситуации SIMD (SSE) (SIMD Floating-Point Exceptions) — могут возникать только при выполнении SIMD-команд и полностью определяются состоянием SIMD-регистров процессора. SIMD-исключения сообщают о своем возникновении через генерацию специальной особой ситуации #XM. Получив управление, обработчик особой ситуации должен сам программным путем определить причину возникновения исключения (подробнее . ).

Прерывания и особые ситуации

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

Все прерывания и особые ситуации имеют уникальные идентификационные номера. Эти номера называются векторами прерываний и лежат в пределах от 0 до 255. Векторы от 0 до 31 отведены для особых ситуаций и немаскируемого прерывания, причем некоторые из них зарезервированы и не должны использоваться программами. Векторы от 32 до 255 свободны для любого использования пользовательскими программами и внешними устройствами.

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

Внешние или аппаратные прерывания (External or Hardware interrupts):

  • Внешние маскируемые прерывания(Maskable Hardware Interrupts) — инициируются сигналами на внешних выводах процессора или с помощью встроенного контроллера прерываний (Advanced Programmable Interrupt Controller – APIC). Для процессоров, начиная с Pentium, встроенный APIC-контроллер является наиболее распространенным способом управления прерываниями. В этом случае выводы LINT[1:0]# программируются через локальную таблицу векторов (LVT) контроллера APIC, которая позволяет назначать соответствующий вывод для приема любого вида прерываний. Если же встроенного контроллера APIC в процессоре нет, или же он отключен, то внешние маскируемые прерывания принимаются на выводе INTR#. При этом номер поступившего прерывания должен передаваться процессору по системной шине специальным внешним контроллером прерываний (например, таким как 8259А). Как правило, встроенный APIC-контроллер также взаимодействует с системным контроллером прерываний (I/O APIC), который обеспечивает прием множества прерываний от разных источников и передает в процессор(ы) информацию о полученном прерывании по системной шине или специальной выделенной шине APIC (APIC serial bus). Если флаг разрешения прерываний не установлен (EFLAGS.IF = 0), то внешние маскируемые прерывания не обрабатываются. Выше указывалось, что для использования маскируемыми прерываниями предназначены векторы от 32 до 255. Технически, однако, возможно определить любому маскируемому прерыванию, которое принимается на выводе INTR# процессора значение вектора в диапазоне от 0 до 255, а если прием прерываний происходит через встроенный APIC-контроллер – в диапазоне от 16 до 255 (при попытке использования векторов от 0 до 15 APIC-контроллер сигнализирует о некорректном векторе прерывания).
  • Внешние немаскируемые прерывания (Nonmaskable External Interrupts) — принимаются на выводе NMI# процессора или внутренней шине APIC-контроллера, механизм запрета немаскируемых прерываний отсутствует (на них не влияет текущее значение флага EFLAGS.IF). Получив запрос на немаскируемое прерывание, процессор передает управление по вектору 2 и блокирует прием новых запросов на немаскируемые прерывания вплоть до выполнения команды IRET/IRETD. Технически вектор прерывания 2 может использоваться и для обрабтки маскируемых прерываний, но только описанный выше способ поступления запросов на немаскируемые прерывания обеспечивает особое поведение процессора при их обработке.

Программные прерывания и особые ситуации (Software interrupts and Exceptions):

  • Генерируемые процессором особые ситуации (Program-Error Exceptions) — возникают в процессе и по результатам выполнения программного кода, разделяются на ошибки, ловушки и сбои. Каждая особая ситуация генерируется по набору определенных условий и ей соответствует строго определенный вектор прерывания в диапазоне от 0 до 31. Зачастую, при генерации таких особых ситуаций процессор сохраняет в стеке не только адрес возврата из прерывания, но и специальный код ошибки, который позволяет обработчику детально понять причину ошибки, внести коррективы и перезапустить команду, если это возможно. Для обозначения особых ситуаций принято использовать специальные мнемонические обозначения (#DE, #DB и т.д.). Полный перечень всех особых ситуаций, поддерживаемых разными моделями процессоров, приведен в Таблице 3.1.
  • Программные прерывания и особые ситуации(Software-Generated Interrupts and Exceptions) — могут быть вызваны командами INTO, INT 3, INT01, INT n, BOUND. При этом только команду INT n правильно относить к командам вызова программных прерываний (Software-Generated Interrupts). Команды INTO, INT 3, BOUND и INT01 по сути являются командами программной генерации особых ситуаций (Software-Generated Exceptions). Например, команда INT 40 генерирует прерывание, передавая управление по вектору номер 40, а команда BOUND edi, [ecx] может сгененрировать особую ситуациюнарушение границ (#BR). В качестве непосредственного операнда команды INT n могут использоваться любые вектора прерываний от 0 до 255. То есть она может использоваться, в том числе, и для программной эмуляции любых особых ситуаций с векторами от 0 до 31. В этом случае, однако, не происходит записи в стек кода ошибки (как это может иметь место в случае генерации особой ситуации аппаратными средствами контроля функционирования процессора). Обработчик особой ситуации, который предполагает, что процессор всегда генерирует и помещает в стек предусмотренный код ошибки, не сможет правильно обработать программный вызов командой INT n, так как выберет из стека некорректное значение адреса возврата для указателя команд EIP. Кроме того, существуют определенные отличия в обработке программных прерываний и программных особых ситуаций в режиме V86.
  • Особые ситуации генерируемые средствами самопроверки процессора (Machine-Check Exceptions) — реализованы в процессорах, начиная с Pentium. Условия генерации и типы таких особых ситуаций зависят от модели процессора. Для их обработки используется вектор прерывания 18.

Таблица 3.1. Типы прерываний и особых ситуаций

Использование Abort для улучшения/упрощения кода в некоторых ситуациях

У меня была дискуссия на днях: qaru.site/questions/1669786/. где я не совсем понял, почему Abort был лучше, чем вызов Exit в этой ситуации. Я стараюсь не использовать его в потоке кода. Я считаю это плохой практикой и плохим для потока кода. но выражение @David в комментариях заставило меня задуматься, может быть, я что-то упустил:

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

Я не могу представить такую ​​ситуацию. Может ли кто-нибудь дать мне пример такого кода/сценария и убедить меня, что Abort в приведенном выше случае действительно хорошая вещь и «гораздо более подробный и подверженный ошибкам». (Для иллюстрации достаточно 3-4 стека вызовов)


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

Это прекрасно. Теперь предположим, что MethodB запрашивает у пользователя некоторый ввод, и если пользователь нажимает кнопку Отмена, то дальнейшая работа не должна выполняться. Вы можете реализовать это следующим образом:

Это прекрасно работает, но представьте, что вы в коде реального мира, там было более глубокое гнездование. Логическое значение, возвращаемое MethodB , возможно, должно быть передано на большое количество уровней. Это станет громоздким.

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

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

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

Теперь код будет выглядеть следующим образом:

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

Еще одно преимущество заключается в том, что MethodB может сохранять свою естественную подпись. Он возвращает string . В случае отказа, либо от более традиционного исключения, либо от отмены пользователя, генерируется исключение.

Этот очень простой пример не настолько привлекателен, как предыдущий, который не использует Abort . Но представьте, как выглядел бы код, если MethodB было 4 или 5 в стеке вызовов?

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

Обработка прерываний, векторы прерываний, программные прерывания, IRQ.

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

Илон Маск рекомендует:  Выполнение длительных операций в приложениях на delphi

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

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

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

Векторы хранятся как «слова наоборот»: сначала смещение, а потом сегмент. Например, первые четыре байта, которые программа DEBUG показала выше (E8 4E 9A 01) можно преобразовать в сегментированный адрес 019A:4EE8.

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

АВС_Лек7_2013 / Система прерываний программ в ЭВМ

Система прерываний программ в ЭВМ

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

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

Илон Маск рекомендует:  Элемент main

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


выбора очередной задачи или определения приоритета задачи;

сохранения информации о статусе задачи при ее прерывании (формирование слова состояния программы);

упреждения и устранения конфликтов между задачами (координации и син­хронизации выполнения задач).

Последовательность действий процессора при реализации прерывания такова. При появлении запроса на прерывание, запланированное заранее или неожидан­ное, процессор, как правило, после завершения выполнения текущей команды программы анализирует допустимость (разрещенность и приоритетность) дан­ного вида прерывания. Если оно разрешено, Процессор производит следующие Действия:

запоминает в стековой памяти текущее состояние прерываемой программы (состояние некоторых регистров МПП, в частности, регистров FL, CS, IP, а в микропроцессорах МП80286 и выше — и слова состояния программы, храня­щегося в другом регистре МПП);

посылает источнику запроса на прерывание запрос о причине (коде) прерыва­ния;

□ анализирует код запрошенного прерывания (номер прерывания — Ni) и фор» мирует адрес ячейки (AV), хранящей вектор прерывания (вектор-адрес про­ граммы обработки прерывания) по формуле AV = 4Ni (векторы прерываний; занимают начальную 1024-байтовую область ОП с адресами ячеек от 00000

■ до 00400h (шестнадцатеричный код) так, что адрес вектора вычисляется про­ етым умножением номера прерывания на четыре, так как CS и IP занимают по два байта каждый);

считывает из ОП и записывает в регистры МПП (в регистры FL, CS, IP и т. д.) вектор прерывания и его атрибуты;

сбрасывает (устанавливает в 0) флаги прерывания (IF) и трассировки (TF);

выполняет программу обработки прерывания (которую иногда называют драйвером прерывания);

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

Видов (номеров) прерывания может быть всего 256, и, соответственно, векторов прерывания (адресов CS:IP программ обработки прерываний) в ОП насчитыва­ется до 256. Классификация видов прерываний показана на рис. 17.2.

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

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

Аппаратные прерывания инициируются при обращениях к МП со стороны внешних устройств (таймера, клавиатуры, дисководов, принтера и т. д.) с требо­ванием уделить им внимание и выполнить совместно с ними те или иные про­цедуры. Прерывания от таймера, например, повторяются 18 раз в секунду, от клавиатуры — при каждом программно не запланированном нажатии некоторых клавиш и т. п. Аппаратные прерывания не координируются с работой програм­мы и могут/быть весьма разнообразны. Для их систематизации и определения очередности выполнения при одновременном возникновении нескольких из них обычно используется контроллер прерываний.

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

базовой системы ввода-вывода — прерывания BIOS;

операционной системы — прерывания DOS.

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

Технические прерывания (или, иначе, прерывания от схем контроля) возникают при появлении отказов и сбоев в работе технических средств (аппаратуре) ПК. Большинство технических прерываний не маскируются, то есть они разрешают­ся всегда, а некоторые из них относятся к категории «аварийных» (например, от­ключение питания), и при их возникновении даже не запрашивается причина прерывания, а просто по возможности спасаются важные промежуточные ре­зультаты — записываются в безопасное место, в НЖМД, например.

Логические прерывания возникают при появлении ошибок в выполняемых про­граммах (деление на 0, потеря точности мантиссы, нарушение защиты памяти и т. п.). Многие из логических прерываний также относятся к категории немас­кируемых.

Прерывания обслуживаются базовой системой ввода-вывода — модулем расши­рения BIOS и модулем обработки прерываний DOS. BIOS и блок расширения BIOS имеют дело в основном с непланируемыми техническими и логическими прерываниями, пользовательскими прикладными прерываниями, а также со многими планируемыми прерываниями, обслуживающими систему ввода-выво­да, детализированными и не’очень детализированными (прерывания, обслужи­ваемые BIOS, часто называют прерываниями нижнего уровня).


Модуль обработки прерываний DOS обслуживает в большинстве планируемые прерывания, в том числе и прерывания системы ввода-вывода. Прерывания DOS часто называют прерываниями верхнего уровня, так как, с одной стороны, в этих прерываниях меньше учитываются технические особенности элементов ПК, с дру­гой стороны, при обработке этих прерываний часто случаются обращения к про­граммам прерываний системы BIOS. Большинство прерываний BIOS имеют близкие аналоги среди прерываний DOS.

Следует сказать, что использование прерываний BIOS позволяет, как правило, более детально выполнять обращения к различным системным ресурсам ПК, к элементам информационных структур и их атрибутам. Однако прерывания DOS более просты в использовании при программировании. Поэтому начинаю­щим программистам можно рекомендовать работать с прерываниями DOS, осо­бенно с расширенными функциями DOS для работы с файлами. Схема органи­зации приема запросов на прерывания показана на рис. 17.3.

Для приема внешних прерываний имеются порты двух типов: NMI (None Masked Interrupt) для приема немаскируемых прерываний и INTR (Interrupt) — для приема прочих прерываний (INTR обычно используется для подсоединения контроллера прерываний). Если запрос на прерывание поступает по входу NMI, то прерывание не маскируется (имеет абсолютный приоритет) и сразу выполня­ется; по входу INTR прерывание разрешается, если в регистре флагов МПП флаг IF-1.

Всего предусмотрено 256 типов (0-255) прерываний. Из них только первые пять жестко закреплены в МП, остальные используются системами BIOS и DOS:

Тип 0 — прерывание возникает при делении на 0 или если частное от деления переполняет разрядную сетку МП.

Тип 1 — в режиме «трассировка» (при TF = 1) после выполнения каждой ко­манды программы происходит останов.

Тип 2 — немаскируемое техническое прерывание.

□ Тип 3 — прерывание по команде INT, включенной в программу: останов и ото- бражение содержимого регистров МПП. оизо

□ Тип 4 — прерывание по команде INTO, включенной в программу, но только если при выполнении предыдущей команды пр шло переполнение раз­рядной сетки.

Типы 8-15 — аппаратные прерывания, инициируемые внешними устройства­ми, поступают на входы IRQ0-IRQ7 контроллера прерываний (вход IRQ0 имеет высший приоритет, и прерывание, поступившее по этому входу, обра­батывается первым; всего уровней приоритета 8 и вход IRQ7 имеет низший приоритет).

Типы 16-31 — планируемые программные прерывания BIOS.

Типы 32-255 — программные прерывания DOS (жестко задействовано около 10, а вообще в разных версиях DOS их разное количество).

Прерывания с 0 по 31 и прерывание 64 относятся к прерываниям нижнего уров­ня, обслуживаемым BIOS; прерывания, начиная с 32, являются прерываниями верхнего уровня (за исключением прерывания 64), причем прерывание 33 (21h) — это комплексное, чаще всего используемое в программах пользователя прерыва­ние, имеющее около 100 разновидностей (служебных функций DOS).

В некоторых типах прерываний BIOS и DOS имеется много разновидностей, иногда более 10. Так, прерывание 10 (Ah) включает в себя 15 разновидностей, прерывание 33 (21h) — около 100 разновидностей: в DOS 1.0 — 47, в DOS 2.0 — 88, в DOS 3.0 и выше — 99 разновидностей (вид действия в рамках каждого пре­рывания определяется содержимым регистра АН).

В работе [10] приведен список прерываний нижнего и верхнего уровней, а также служебных функций DOS для наиболее часто используемого программистами прерывания 21h.

Вопросы для самопроверки

Дайте определения алгоритма и программы решения задачи.

Сформулируйте основные необходимые свойства алгоритма и способы его записи.

Назовите основные классы алгоритмических языков и разновидности транс­ляторов.

Приведите и поясните типовой состав машинных команд и возможные их структуры.

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

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

Назовите основные режимы работы компьютеров и дайте им краткую харак­теристику.


Что такое прерывание работы программы и каково назначение прерываний?

9. Назовите и поясните основные виды прерываний.

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

Укажите, последовательность действий машины при выполнении прерыва­ния.

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

Упрощенная структурная схема PIC

Описание схемы Структура PIC включает в себя следующие байтные регистры: • IRR – регистр запросов прерываний — связан с внешними входами запросов (IRQ – IRQ7); • IMR – регистр маски запросов; • ISR – Interrupt Service Register – регистр обслуживаемых запросов; • ICW1-ICW3 – Initialization Control Word – управляющее слово инициализации (приказы инициализации); • OCW1-OCW3 — Operation Control Word – операционное управляющее слово (рабочие приказы); OCW1 = IMR Кроме регистров в состав PIC входят: блок управления и схема анализа приоритетов (арбитр). Назначением блока управления является выработка внутренних и внешних сигналов управления, с помощью которых осуществляются те или иные элементарные действия (микрооперации) внутри микросхемы. Например, запись байта из внешней шины данных в один из регистров контроллера. Сигналы CAS-CAS2 используются для реализации каскадирования микросхемы. Входной сигнал CS (Chip Select – выбор кристалла) генерируется в том случае, если на внешней шине адреса (АВ) зафиксированы адреса, относящиеся к контроллеру прерываний. Программирование контроллера осуществляется по стандартным адресам портов ввода / вывода.

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

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

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

Таким образом, любой подписчик ExceptionHandler.Handler может либо резолвить проблемы в автоматическом режиме, либо вываливать решение на пользователя. Любой опасный код теперь можно обернуть:

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

UPD: да, я понимаю, что даже так остаются проблемные ситуации — экшн может быть одноразовым (закрывать соединение, гробить sql сессию, да что угодно делать). Это уже остается на совести того, кто использует код. Хотя, интересные варианты по этой проблеме я бы тоже глянул, это же фиг ограничишь.

UPD2: пока не смог придумать, можно ли оборачивать один такой блок в другой, а то сейчас в итоге на аборте внутреннего блока внешний снова уходит на обработку.

3 ответа 3

Мне не кажется, что существует общее решение проблемы. Поскольку то, что вы кодируете — это по сути бизнес-логика, которая «разнообразна как сама жизнь», вы не сможете заранее покрыть все возможные случаи.

Навскидку что с кодом не так:

  1. Выполнение происходит синхронно, блокирующим образом. Это не всегда так, очень часто «строительные блоки» бизнес-логики формируются из асинхронных процедур. Этой возможности у вас нет.
  2. Модель подписки на событие у стороннего объекта мне кажется слишком сложной и нарушающей линейную логику. У вас один, статический экземпляр ExceptionHandler ‘а, а значит, вам придётся подписывать несколько обработчиков одновременно. При этом нужен механизм, который решает, ответственен ли данный обработчик за данную ошибку или нет. Этой логики у вас нет, и она получится достаточно сложной. Также у универсального объекта должны возникать проблемы с многопоточным доступом, как только вы попытаетесь сделать его сложнее.
  3. Очень часто простого повторения действия недостаточно, т. к. условия не поменялись, и значит, новое действие завершится с той же ошибкой. Нужно какое-нибудь дополнительное действие: сделать паузу, подобрать другие исходные данные, провести диалог с пользователем и. т. д. В вашем дизайне эти все дополнительные действия придётся паковать в обработчик события, что не очень читаемо.

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

Например, такую простую логику

достаточно сложно закодировать в терминах ExceptionHandler ‘а.

Тестовой функцией пользоваться так:

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

Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL