2.2 Система прерываний защищенного режима
В защищенном режиме используются два понятия - прерывание и исключение.
Прерываниями (interruption) называют системные ситуации, связанные с выполнением команд прерывания (программный тип прерывания) или вызванные внешними сигналами (аппаратные прерывания).
Исключениями (exception) называют нештатные ситуации (ошибки), возникающие в процессе работы процессора. При выявлении таких ошибок блоки процессора, контролирующие правильную работу процессора, вырабатывают сигналы (запросы), по которым осуществляются прерывания и вызываются соответствующие подпрограммы обслуживания.
Программные прерывания осуществляются по командам прерывания INTО, INT3, INT N, BOUND. Команда BOUND (в i8086 отсутствует) проверяет, находится ли адресуемый элемент (операнд, команда) в пределах сегмента. Если выходит за границы сегмента, то вызывается прерывание N=5 – «превышение границы» сегмента.
Запросы на выполнение аппаратных прерываний в однопроцессорных компьютерах поступают от внешних устройств на входы INTR, NMI процессора (как и в реальном режиме, рисунки 5, 6).
Исключения делятся на ошибки (faults), ловушки (traps) и отказы (aborts). Ошибки выявляются и обслуживаются (если возникли) до выполнения команды, которая является причиной их возникновения. Пример – обращение к сегменту или странице, которые отсутствуют в основной памяти (бит присутствия P=0). В качестве адреса возврата сохраняется адрес i=(CS:ЕIP) команды, которая вызвала данное исключение. Ловушка выявляется после исполнения команды. Пример: команда INTО (N=4) реализуется, если установлен флаг переполнения OF=1. В качестве адреса возврата сохраняется адрес следующей команды i+1. Ошибки и ловушки предусматривают продолжение прерванной программы (после обслуживания прерывания). Отказы информируют о возникновении серьёзных нарушений в работе системы. Примеры: отказ аппаратуры или появление исключения при обслуживании ранее поступившего запроса. Отказ не предусматривает продолжения прерванной программы, поэтому после него обычно производится повторный запуск (рестарт) процессора.
Организация внешних прерываний в мультипроцессорных системах. При построении многопроцессорных систем на основе процессоров Intel используется наиболее простая организация – симметричная. Объединение процессоров в систему осуществляется на основе общей локальной шины. Каждый процессор выполняет свою задачу, назначаемую ОС. При этом процессоры совместно используют общие ресурсы системы – память, внешние устройства, обращение к которым реализуется ОС. В каждый момент времени только один из процессоров является ведущим (master) и имеет доступ к системной шине. Другие процессоры для обращения к шине выдают соответствующий запрос в арбитр шины. Поддержку работы мультипроцессорных систем обеспечивают современные ОС – Windows NT, Novell Netware и другие.
![]() |
Обработка внешних прерываний в мультипроцессорных системах с помощью ПКП (PIC) типа i8259А невозможна, поэтому был разработан контроллер APIC с расширенными возможностями – Advanced PIC. В симметричной мультипроцессорной системе передача сигналов прерываний происходит по схеме, представленной на рисунке 8.
В этой схеме используется несколько контроллеров APIC. Внешние прерывания подключаются на входы системного контроллера APIC, который реализован в виде отдельной микросхемы и размещен на системной плате компьютера. Каждый из процессоров содержит локальный APIC, имеющий два входа прерываний LINT0, LINT1, на которые подаются локальные запросы прерываний, обслуживаемые только данным процессором. В однопроцессорной системе локальные APIC отключаются и входы LINT0, LINT1 используются как входы NMI, INTR. Общие запросы прерываний поступают на системный APIC, который их анализирует и ретранслирует через внутреннюю шину APIC соответствующему (свободному) процессору на обслуживание. С точки зрения внешних устройств система выглядит как один процессор, обслуживающий запросы прерываний.
В процессорах семейства Р6 номера прерываний распределены следующим образом. Первые 32 номера закреплены за исключениями процессора (таблица 2), а номера 32-255 – за прерываниями пользователя.
Таблица 2
Номер N и мнемоника | Причина прерывания | Тип исключения | Код ошибки |
0 #DE | Ошибка деления | Ошибка | Нет |
1 #DB | Отладка | Ошибка/Ловушка | Нет |
2 | Сигнал NMI | Прерывание | Нет |
3 #BP | Команда INT3 | Ловушка | Нет |
4 #OF | Команда INTO | Ловушка | Нет |
5 #BR | Команда BOUND | Ошибка | Нет |
6 #UD | Недействительный код операции | Ошибка | Нет |
7 #NM | FPU недоступен | Ошибка | Нет |
8 #DF | Двойная ошибка | Отказ | Да (ноль) |
9 | Резерв | Нет | |
10 #TS | Недействительный сегмент TSS | Ошибка | Да |
11 #NP | Отсутствие сегмента | Ошибка | Да |
12 #SS | Ошибка при обращении к стеку | Ошибка | Да |
13 #GP | Нарушение общей защиты | Ошибка | Да |
14 #PF | Страничное нарушение | Ошибка | Да |
15 | Резерв | Нет | |
16 #MF | Исключение FPU | Ошибка | Нет |
17 #AC | Ошибка выравнивания | Ошибка | Да (ноль) |
18 #MC | Машинный контроль | Отказ | Нет |
19 #XM | Исключение SSE | Ошибка | Нет |
20-31 | Резерв |
Если одновременно произошло несколько запросов прерываний, то процессор обслуживает их последовательно в соответствии с приоритетами, указанными в таблице 3 (1 – высший приоритет, 8 – низший).
Обработка прерываний в защищённом режиме. Роль вектора прерывания в защищенном режиме выполняет (специальный) дескриптор прерываний – шлюз, а роль таблицы ВП - дескрипторная таблица прерываний IDT (Interrupt Descriptor Table). Подпрограмма обслуживания прерывания вызывается через IDT, которая может размещаться в любом месте ОП (рисунок 9). Базовый линейный адрес таблицы IDT размещается в специальном регистре IDTR, формат которого имеет вид:
47 БА IDT 16 | 15 Lim 0 |
Поле БА IDT определяет базовый адрес таблицы IDT. Поле Lim определяет границу (размер) таблицы IDT. Загрузка линейного адреса в регистр IDTR осуществляется с помощью команды LIDT (загрузить IDTR), а его сохранение в памяти – с помощью команды SIDT. Команда LIDT является привилегированной (CPL=0), команда SIDT может выполняться на любом уровне привилегий. Дескриптор прерываний (ДП) с номером N из таблицы IDT выбирается по физическому адресу, сформированному путем сложения БА IDT (из регистра IDTR) и адреса ДП, равного 8N (8 – длина ДП). Селектор и смещение (из дескриптора N, выбранного из таблицы IDT) загружаются в регистры CS, EIP и вызывают обработчик N.
Таблица 3 – Приоритеты прерываний защищенного режима
Приоритет | Причины прерываний |
1 | Аппаратный сброс (RESET) и машинный контроль # MС |
2 | Ловушка при переключении задач – бит Т=1 (в сегменте TSS) |
3 | Внешние сигналы процессора: - очистка кэш-памяти FLUSH # = 0, - включение энергосберегающего режима STOPCLK # = 0, - вход в системный режим SMI # =0, - инициализация процессора INIT = 1 |
4 | Ловушки: - останов в контрольной точке (INT3), - исключение отладки (ТF=1 в регистре флагов), - точка останова при выборке данных или вводе/выводе |
5 | Внешние сигналы прерываний: - NMI = 1, - INTR = 1 |
6 | Ошибки при выборке следующей команды: - точка останова при выборке команды, - превышение границы сегмента, - ошибка обращения к странице при выборке команды |
7 | Ошибки при декодировании команды: - длина команды больше 15 байт, - недействительный код операции #UD, - процессор с плавающей запятой недоступен (FPU недоступен) |
8 | Ошибки при выполнении команды: - исключение FPU, переполнение, выход за границы, недействительный TSS, отсутствие сегмента, ошибка обращения к стеку, нарушение общей защиты, ошибка обращения к странице, ошибка выравнивания |
![]() |
Элементами таблицы IDT являются системные дескрипторы прерываний трёх типов: вентиль (Gate) прерываний (шлюз прерываний), шлюз ловушки, шлюз задачи.
Тип шлюза указывается в поле TYPE в байте управления доступом БУД дескриптора:
P | DPL | S = 0 | TYPE |
TYPE=D110 – шлюз прерываний, TYPE=D111 – шлюз ловушки, TYPE=D101 – шлюз задачи. Бит D задаёт режим работы процессора при обслуживании прерываний:
- если бит D=0, то процессор работает как 16-разрядный процессор 80286,
- если бит D=1, то процессор работает как 32-разрядный процессор (386+).
Формат системного дескриптора типа шлюз:
31 Селектор 16 | 15 Смещение 0 | ||
63 Смещение 48 | 47 БУД 40 | 000 | WС 32 |
В поле селектора размещается селектор сегмента, в котором размещён обработчик прерывания и его смещение (пусковой адрес) относительно начала сегмента. Селектор загружается в CS, смещение – в регистр EIP.
Формат шлюза задачи:
31 Селектор TSS 16 | 15 - 0 | |
- | БУД | - |
В нём используются только поле селектора, в котором размещается селектор сегмента состояния задачи (TSS) и байт БУД. Прерывание через шлюз задачи равносильно процедуре переключения задач.
По запросу прерывания процессор сохраняет в стеке соответствующего уровня:
1) базовый адрес сегмента стека (SS → стек),
2) указатель стека (ESP → стек),
3) содержимое регистра флагов (EFLAGS → стек),
4) содержимое CS,
5) содержимое EIP,
6) код ошибки (если он формируется).
Стек
←ESP (до)
←ESP (после) | |
SS | |
ESP | |
EFlags | |
CS | |
EIP | |
Код ошибки |
Содержимое регистров SS, ESP (см. пункты 1,2) заталкивается в стек только в случае изменения уровня привилегий процессора (CPL изменяется, если вызывается обработчик с другим уровнем привилегий). После этого в регистре флагов сбрасываются биты TF, VM, NT. Если вызов подпрограммы осуществляется через шлюз прерывания, то бит маски IF=0 (сбрасывается). Если вызов осуществляется через шлюз ловушки (т. е. причина - внутри процессора), то маска внешних прерываний IF остаётся без изменений.
Возврат из подпрограммы осуществляется по команде IRET. При выталкивании из стека старого значения регистра флагов учитываются условия:
- поле IOPL восстанавливается только при условии CPL=0, флаг маски IF изменяется только при условии CPL≤IOPL.
Код ошибки содержит индекс селектора, указывающий на дескриптор, использование которого вызвало исключение.
Формат регистра флагов Eflags:
31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 | 15 | 14 | 13 | 12 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ID | VIP | VIF | AC | VM | R | 0 | NT | IOPL |
Младшие 12 разрядов имеют такой же смысл, как и в процессоре i8086. В процессоре i286 новые флаги (12, 13 и 14 биты) имеют следующее значение:
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 |




