- •8. Прерывания и исключения
- •Прерывания и исключения защищенного режима
- •Приоритеты событий, вызывающих прерывания
- •Обработка прерываний в реальном режиме
- •Обработка прерываний в защищенном режиме
- •Возможности последовательной обработки исключений различных классов
- •Условия недостоверности сегмента tss
- •Приоритеты sse-исключений операций с плавающей точкой
- •Варианты обработки прерываний в режиме виртуального 8086
- •Виртуальные прерывания в режиме виртуального 8086
- •Обработка прерываний с использованием idt (защищенный режим)
- •Обработка прерываний с помощью таблицы векторов прерываний (реальный режим).
- •Обработка прерываний с использованием признаков vif и vip
8. Прерывания и исключения
При работе микропроцессорной системы часто возникают ситуации, когда требуется прервать выполнение текущей программы и перейти к подпрограмме, обеспечивающей необходимую реакцию системы на создавшиеся обстоятельства. Такие ситуации называются прерываниями (или исключениями) в зависимости от причин, вызывающих их возникновение. В данной главе мы рассмотрим механизмы возникновения и обработки прерываний на примере процессоров семейства ix86, поскольку именно здесь реализованы многие из этих механизмов. В конце главы упомянуты особенности, характерные для других типов процессоров.
$.1. Виды прерываний и исключений, реализация их обслуживания
Прерываниями (interruption) являются штатные ситуации, возникающие при поступлении соответствующих инструкций (программные прерывания) или внешних сигналов (аппаратные прерывания). Исключениями (exception) являются нештатные ситуации (ошибки), возникающие при работе процессора. При выявлении таких ошибок соответствующие блоки, контролирующие работу процессора, вырабатывают внутренние сигналы запроса, обеспечивающие вызов необходимой подпрограммы обслуживания. Процессор способен обеспечить обслуживание 256 различных типов исключений и прерываний. Соответствующая обработка информации при возникновении таких ситуаций выполняется с помощью специальных подпрограмм (обработчиков) обслуживания (interrupt handlers), указатели на обработчики (вектора прерываний) хранятся в таблице, размещаемой в памяти системы.
По типу возникновения прерывания делятся на программные, аппаратные и прерывания от внутренних блоков процессора.
Программные прерывания – это своеобразный способ вызова процедур, как правило, системных. Осуществляется по инструкциям INTn, INTO, INT3, BOUND.
Запросы на выполнение аппаратных прерываний поступают от внешних устройств на входы LINT0/INTR, LINT1/NMI процессора. В мультипроцессорной системе, когда включен внутренний контроллер локальных прерываний APIC (см. раздел $.4), сигналы LINT1-0 на этих входах определяют номер запроса, поступающего от других устройств (процессоров) системы. В однопроцессорной системе, когда функционирование контроллера APIC запрещено, эти входы служат, соответственно, для подачи маскируемых INTR и немаскируемых NMI запросов прерывания от различных внешних устройств.
Маскируемые прерывания вызываются активизацией входа INTR (Interrupt Request). Их обслуживание может быть запрещено (замаскировано) путем установке значения признака IF=1 в регистре состояний EFLAGS. Обычно такой запрос поступает от внешнего устройства через специальный контроллер прерываний, который собирает запросы от различных внешних устройств и передает их для обработки процессору, указав для них также номер n определяющий вид прерывания (INTR n). На вход NMI поступает запрос на немаскируемое прерывание, процедура обслуживания которого имеет фиксированный номер n=2 (см. табл. $.1). Значение признака IF в регистре EFLAGS не влияет на обслуживание процессором немаскируемого запроса прерывания NMI. При работе процессора в мультипроцессорной системе, когда функционирует контроллер локальных прерываний APIC, запросы аппаратных прерывания (маскируемые и немаскируемые) поступают по специальной APIC-шине (см. разд. $.4).
Для исключений зарезервированы первые 32 вектора в таблице прерываний. Каждый тип исключения имеет мнемоническое обозначение. Исключения делятся на ошибки (Faults), ловушки (Traps) и отказы (Aborts). В табл. $.1 указан их список для защищенного режима. В реальном режиме некоторые прерывания (например, #TS или #PF) имеют несколько другой смысл, но эти случаи здесь не рассматриваются. Пояснение столбца «класс» будет дано при описании отказа #DF в разделе $.2.
Ошибки выявляются и обслуживаются до выполнения инструкции, которая является причиной их возникновения. Примером ошибки может служить ситуация, возникающая при обращении очередной инструкции к странице или сегменту, отсутствующим в адресуемой оперативной памяти (обращение к сегменту или странице, для которых бит присутствия P=0, см. разд. 7.3). При ошибке в качестве адреса возврата к прерванной программе сохраняется адрес инструкции, выполнение которой вызвало данное исключение.
Таблица $.1.
