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