Исключения в Linux

Микропроцессоры 80x86 генерируют примерно 20 различных исключений. Ядро должно предоставить специальный обработчик для каждого типа исключения. При некоторых исключениях управляющий блок процессора генерирует также код аппаратной ошибки и помещает его в стек режима ядра до запуска обработчика исключения.
В приведенном далее списке даны векторы, названия, типы и краткие описания исключений, генерируемых процессорами 80><86. Дополнительную информацию можно найти в технической документации Intel. 0 - "Divide error" (Ошибка деления на ноль), ошибка. Возбуждается, когда программа пытается выполнить целочисленное деление на 0; 1 - "Debug" (Отладка), ловушка или ошибка. Возбуждается, когда установлен флаг tf регистра еflags (очень полезна при пошаговом выполнении отлаживаемой программы) или когда адрес инструкции или операнда попадает в диапазон, установленный активным регистром отладки; 2 - не используется. Зарезервирован для немаскируемых прерываний (тех, которые используют вывод NMI); 3 - "Breakpoint" (Точка останова), ловушка. Вызывается с помощью инструкции int3 (точка останова), обычно вставляемой отладчиком; 4 - "Overflow" (Переполнение), ловушка. Инструкция into (проверка на переполнение) была выполнена при установленном флаге of (переполнение) в регистре ef lags; 5 - "Bounds check" (Сбой проверки границ), ошибка. Инструкция bound (проверка границы адреса) была выполнена с операндом, лежащим вне допустимых границ адреса; 6 - "Invalid opcode" (Недопустимый код операции), ошибка. Выполняющий блок процессора обнаружил недопустимый код операции (часть машинной инструкции, определяющая выполняемую операцию); 7 - "Device not available" (Устройство недоступно), ошибка. Была выполнена инструкция ESCAPE, ММХ и SSE/SSE2 при установленном флаге ts в регистре его; 8 - "Double fault" (Двойная ошибка), авария. Обычно, когда процессор получает исключение при попытке вызвать обработчик для предыдущего исключения, эти два исключения могут быть обработаны последовательно. Однако в некоторых случаях процессор не может обработать их последовательно и возбуждает это исключение; 9 - "Coprocessor segment overrun" (Нарушение в сегменте сопроцессора), авария. Проблемы с внешним математическим сопроцессором (относится только к старым микропроцессорам 80386); 10 - "Invalid TSS" (Недопустимый сегмент состояния задачи), ошибка. Процессор пытался выполнить переключение контекста для процесса, имеющего недопустимый сегмент состояния задачи; 11 - "Segment not present" (Сегмент отсутствует), ошибка. Попытка сослаться на сегмент, отсутствующий в памяти (такой, у которого сброшен флаг Segment-Present в дескрипторе сегмента); 12 - "Stack segment fault" (Ошибка в сегменте стека), ошибка. Инструкция попыталась выйти за пределы сегмента стека, или сегмент, идентифицируемый полем ss, отсутствует в памяти; 13 - "General protection" (Общий сбой защиты), ошибка. Нарушено одно из правил доступа в защищенном режиме 80x86; 14 - "Page Fault" (Ошибка обращения к странице), ошибка. Обращение к странице, отсутствующей в памяти, или соответствующая запись Таблицы Страниц содержит нули, или произошло нарушение механизма защиты выделения страниц; 15 - Зарезервирован компанией Intel; 16 - "Floating-point error" (Ошибка операции с плавающей точкой), ошибка. Блок выполнения операций с плавающей точкой, встроенный в чип процессора, просигнализировал об ошибке, такой как переполнение или деление на 4; 17 - "Alignment check"(Сбой проверки выравнивания), ошибка. Адрес операнда не выровнен должным образом (например, адрес длинного целого не кратен 4); 19 - "floating point exception" (Исключение при выполнении SIMD-операции с плавающей точкой), ошибка. Блок SSE или SSE2, встроенный в процессор, просигнализировал об ошибке при выполнении операции с плавающей точкой. Значения с 20 до 31 зарезервированы компанией Intel для будущих разработок. Как показано, каждое исключение обслуживается соответствующим обработчиком, который обычно посылает сигнал Unix процессу, вызвавшему исключение.