Программные исключения в Linux

Программные исключения возникают по запросу программиста. Они вызываются инструкциями int или int3. Инструкции into (проверка на переполнение) и bound (проверка границы адреса) тоже могут возбудить программное исключение, если проверяемое ими условие не истинно. Программные исключения обрабатываются управляющим блоком как ловушки, и их число называют программными прерываниями. Такие исключения обычно имеют два применения: для реализации системных вызовов и для уведомления отладчика о некотором событии.
Каждое прерывание или исключение идентифицируется числом от 0 до 255. Компания Intel называет это 8 — битовое целое без знака вектором. Векторы немаскируемых прерываний и исключений зафиксированы, а векторы маскируемых прерываний могут быть изменены путем программирования контроллера прерываний.
IRQ и прерывания
Любой контроллер аппаратного устройства, способный выдавать запросы на прерывание, обычно имеет одну выходную линию, называемую IRQ — линией. Все IRQ — линии в системе соединены со входами электронной схемы, которая называется программируемым контроллером прерываний. Она выполняет следующие действия:
1. Ведет мониторинг IRQ-линий, проверяя наличие сигналов. Если возбуждены две или более IRQ-линий, выбирает ту, у которой меньше номер входа.
2. Если на IRQ-линии возник сигнал:
• преобразует принятый сигнал в соответствующий вектор;
• сохраняет вектор в порте ввода/вывода контроллера прерываний, тем самым позволяя процессору прочитать его через шину данных;
• посылает сигнал на вход INTR процессора, т. е. возбуждает прерывание;
• ждет, пока процессор подтвердит прием сигнала прерывания, записав соответствующую информацию в один из портов ввода/вывода программируемого контроллера прерываний. Когда это произойдет, сбрасывает линию INTR.
3. Возвращается к шагу 1.
IRQ-линии перенумерованы, начиная с 0. Поэтому первая IRQ-линия обычно обозначается IRQ 0. В компании Intel с линией IRQ и по умолчанию ассоциируется вектор. Как было сказано ранее, соответствие между IRQ-линиями и векторами может быть модифицировано с помощью соответствующих инструкций ввода/вывода, подаваемых на порты контроллера прерываний.
Каждая IRQ-линия может быть избирательно отключена. Таким образом, контроллер прерываний может быть запрограммирован на отключение запросов IRQ. Иными словами, ему можно велеть прекратить выдачу прерываний, относящихся к данной IRQ-линии (или, наоборот, возобновить их выдачу). Отключенные прерывания не пропадают; программируемый контроллер прерываний отправит их процессору, как только они будут включены. Эта особенность используется в большинстве обработчиков прерываний, потому что позволяет им обрабатывать IRQ-запросы одного типа последовательно.
Избирательное включение/отключение IRQ-линий — это не то же самое, что глобальная маскировка/демаскировка маскируемых прерываний. Когда флаг if в регистре efiags сброшен, любое маскируемое прерывание, выдаваемое программируемым контроллером прерываний, временно игнорируется процессором. Ассемблерные инструкции cii и sti соответственно сбрасывают и устанавливают этот флаг.
Традиционные программируемые контроллеры прерываний реализуются «каскадным”соединением двух внешних чипов типа 8259А. Каждый чип может работать максимум с восемью разными входными линиями IRQ. Поскольку выходная INT-линия у подчиненного контроллера соединена со входом IRQ 2 главного контроллера, количество доступных IRQ-линий ограничено пятнадцатью.