Типичный обработчик исключения в Linux

Теперь рассмотрим, что делает типичный обработчик исключения. Это описание обработки исключения будет достаточно кратким. В частности, оно не сможет охватить:
— коды сигналов, посылаемых некоторыми обработчиками процессам режима пользователя;
исключения, возникающие, когда ядро работает в режиме эмуляции MS — DOS (режим vm86), поскольку они требуют отдельной обработки;
— отладочные исключения.
Достоинством исключений является использование их для эффективной работы внутренней оптимизации ресурса при продвижении сайтов, а именно при разработке библиотек процедур и программных компонентов, которые ориентированы на массовое использование.
Сохранение регистров для обработчика исключений
Воспользуемся именем handier name (имя обработчика) для обозначения типичного обработчика исключений. Каждый обработчик исключения начинается со следующих ассемблерных инструкций:
handle r_name:
— pushl только для некоторых исключений/pushl $do_handler_name jmp error_code
Если не предполагается, что управляющий блок автоматически занесет код аппаратной ошибки в стек, когда возникнет исключение, то соответствующий ассемблерный фрагмент включает в себя инструкцию pushl $о, записывающую ноль в стек. Затем в стек помещается адрес функции на языке С, имя которой образовано именем обработчика исключения и префиксом do_.
Что еще важнее, процесс, от имени которого выполняется обработчик прерывания, должен оставаться в состоянии task running, чтобы не произошло зависание системы. Следовательно, обработчики прерываний не могут выполнять никакие блокирующие процедуры, например, дисковые операции ввода/вывода. Действия, выполняемые в ответ на прерывания, подразделяются в Linux на три класса: критические — действия, примерами которых являются подтверждение приема прерывания на программируемом контроллере прерываний, перепрограммирование этого контроллера или контроллера устройства, а также обновление структур, к которым обращаются как устройство, так и процессор. Эти действия можно выполнить быстро, и они являются критическими, поскольку должны быть совершены как можно скорее. Критические действия выполняются в коде обработчика прерываний, а маскируемые прерывания при этом отключены.
Для представления как состояния IRQ-линий, так и функций, выполняемых при возникновении прерывания, требуется несколько дескрипторов. Схематически представлены аппаратные устройства и программные функции, применяемые для обработки прерываний. Эти функции обсуждаются в последующих разделах этой главы.
IBM-совместимая архитектура персональных компьютеров требует, чтобы некоторые устройства были статически привязаны к конкретным IRQ-линиям. В частности:
— таймер интервалов должен быть соединен с линией IRQ 1;
— подчиненный программируемый контроллер прерываний 8259А должен быть соединен с линией IRQ 2 (хотя в настоящее время применяются более совершенные программируемые контроллеры прерываний, Linux по-прежнему поддерживает старые контроллеры 8259А);
внешний математический сопроцессор должен быть соединен с линией IRQ 13 (хотя новейшие процессоры 80×86 уже не пользуются таким устройством, Linux продолжает поддерживать надежную модель 80386);
— вообще, устройство ввода/вывода может быть соединено с ограниченным набором IRQ — линий. (Фактически, работая на старом персональном компьютере, на котором совместное использование линий IRQ невозможно, вы не можете установить новую карту из-за IRQ — конфликтов с уже имеющимися аппаратными устройствами).