Jump to content

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

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

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

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

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

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

Флаги прерываний

[ редактировать ]

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

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

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

Контекст выполнения

[ редактировать ]

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

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

Рекомендации по использованию стекового пространства

[ редактировать ]

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

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

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

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

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

Ограничения во времени и параллелизме

[ редактировать ]

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

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

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

[ редактировать ]

В нескольких операционных системах‍— ‌ Linux , Unix , [ нужна ссылка ] macOS , Microsoft Windows , z/OS , DESQview и некоторые другие операционные системы, использовавшиеся в прошлом‍—‌обработчики прерываний разделены на две части: обработчик прерываний первого уровня ( FLIH ) и обработчик прерываний второго уровня ( SLIH ). FLIH также известны как обработчики жестких прерываний или обработчики быстрых прерываний , а SLIH также известны как обработчики медленных/мягких прерываний или вызовы отложенных процедур в Windows.

FLIH реализует обработку прерываний, специфичную для минимальной платформы, аналогично процедурам обработки прерываний . В ответ на прерывание происходит переключение контекста , и код прерывания загружается и выполняется. Задача FLIH состоит в том, чтобы быстро обслужить прерывание или записать критически важную информацию, специфичную для платформы, которая доступна только во время прерывания, и запланировать выполнение SLIH для дальнейшей долговременной обработки прерываний. [ 2 ]

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

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

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

В Linux FLIH называются верхней половиной , а SLIH — нижней половиной или нижней половиной . [ 1 ] [ 2 ] Это отличается от именования, используемого в других Unix-подобных системах, где оба являются частью нижней половины . [ нужны разъяснения ]

См. также

[ редактировать ]
  1. ^ Перейти обратно: а б с «Руководство по программированию модулей ядра Linux, глава 12. Обработчики прерываний» . Проект документации Linux . 18 мая 2007 года . Проверено 20 февраля 2015 г.
  2. ^ Перейти обратно: а б с д Джонатан Корбет; Алессандро Рубини; Грег Кроа-Хартман (27 января 2005 г.). «Драйверы устройств Linux, Глава 10. Обработка прерываний» (PDF) . О'Рейли Медиа . Проверено 20 февраля 2015 г.
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 075c6df016f9da0f4eb263bdc6f43efe__1708570080
URL1:https://arc.ask3.ru/arc/aa/07/fe/075c6df016f9da0f4eb263bdc6f43efe.html
Заголовок, (Title) документа по адресу, URL1:
Interrupt handler - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)