December 16 2017 12:41:53
Навигация
Авторизация
Логин

Пароль



Вы не зарегистрированы?
Нажмите здесь для регистрации .

Забыли пароль?
Запросите новый здесь.
Шлюз ловушки и прерывания
ФОРМАТЫ ПРЕДСТАВЛЕНИЯ ДАННЫХ И ВЫПОЛНЕНИЕ ОПЕРАЦИЙ

Передача управления через шлюз прерывания или шлюз ловушки может сопровождаться изменением уровня привилегий. Процессор проверяет значение gDPL в дескрипторе шлюза при выполнении программных прерываний, вызываемых командами INT n, INT3, INTO. Переход к выполнению подпрограммы обслуживания в этих случаях производится, если уровень привилегий текущей программы меньше или равен значению gDPL шлюза: CPL <= gDPL. Таким образом, величина gDPL ограничивает уровень привилегий программ, которые могут вызывать данную процедуру обслуживания. При выполнении других видов прерываний и исключений процессор игнорирует gDPL шлюза.

а)

31 16 15 14 13 12 8 7 5 4 0
Смещение 31 ...16 Р DPL 0D110 000 Резерв. 4


31 16 15 0
Селектор сегмента Смещение 15-0 0
Шлюз прерывания
б)

31 16 15 14 13 12 8 7 5 4 0
Смещение 31 ...16 Р DPL 0D111 000 Резерв. 4


31 16 15 0
Селектор сегмента Смещение 15-0 0
Шлюз ловушки

Рис. 2.59. Формат содержимого дескрипторов - шлюзов прерывания (а) и ловушки (б)

img034

Уровень привилегий сегмента команд, в котором размещается подпрограмма обслуживания, должен быть меньше или равен уровню привилегий текущей программы: DPL <= CPL. Нарушение этого правила приводит к исключению типа #GP. Поэтому рекомендуется подпрограммы обслуживания прерываний и исключений располагать в сегментах с уровнем привилегий DPL = 0, чтобы избежать ситуации, когда при поступлении запроса прерывания или исключения уровень текущей программы CPL окажется меньше, чем DPL сегмента команд обработчика прерывания.

При возникновении прерывания процессор сохраняет в стеке (рис. 2.60):

•  содержимое регистра SS прерванной процедуры (если имеет место изменение уровня привилегий);

•  содержимое регистра ESP прерванной процедуры (если имеет место изменение уровня привилегий);

•  содержимое регистра EFLAGS;

•  содержимое регистра CS;

•  содержимое регистра EIP;

•  код ошибки (если он формируется для данного исключения).

После сохранения в стеке содержимого регистра EFLAGS процессор устанавливает в этом регистре значения признаков TF=VM=NT=0. Единственное различие между использованием шлюза ловушки и шлюза прерывания состоит в том, как процессор поступает с признаком IF. Если вызов подпрограммы обслуживания производится через шлюз прерывания, то процессор после сохранения в стеке содержимого регистра EFLAGS устанавливает значение признака IF = 0, запрещая маскируемые прерывания. Если переход к подпрограмме обслуживания осуществляется через шлюз ловушки, то значение признака IF не изменяется.

31 16 15 3 2 1 0
Резервировано Индекс селектора TI IDT EXT

Рис. 2.61. Формат кода ошибки

Возврат из подпрограммы обслуживания прерывания осуществляется с помощью команды IRET. При восстановлении из стека содержимого регистра EFLAGS действуют следующие правила:

•  поле IOPL восстанавливается только если CPL = 0;

•  флаг IF изменяется только если CPL J IOPL.

Формат дескриптора шлюза задачи при реализации прерываний и исключений имеет вид, представленный на рис. 2.54. Когда прерывание обрабатывается через шлюз задачи, то процессор выполняет обычную процедуру переключения задач.

При реализации некоторых исключений (табл. 2.60) процессор заносит в стек код ошибки, формат которого приведен на рис. 2.61.

Индекс селектора (биты 15-3) - указывает на дескриптор, использование которого вызвало исключение. Биты IDT, TI указывают на таблицу, в которой находится неверный дескриптор. Бит IDT = 1, если дескриптор находится в таблице IDT. При значении бита IDT = 0 размещение дескриптора определяется битом TI: если TI = 0, то дескриптор находится в таблице GDT, если TI = 1 - в таблице LDT. Бит ЕХТ = 1, если исключение вызвано не выполняемой программой, а внешним сигналом прерывания.

2.8.2. ПРИЧИНЫ ВОЗНИКНОВЕНИЯ ИСКЛЮЧЕНИЙ

В предыдущих главах рассмотрены основные случаи, при которых реализуются различные виды исключений (табл. 2.60). Поэтому в данном разделе ограничимся кратким обзором причин их возникновения.

Исключение 0 -деление на нуль (#DE). Возникает при выполнении команд DIV, IDIV, если делитель равен нулю или если результат не может разместиться в операнд-приемник (превышает разрядность приемника).

Исключение 1 - исключение для отладки (#DB). Возникает в пошаговом режиме (при значении признака TF = 1 в регистре EFLAGS) после выполнения каждой команды; при переключении на задачу, в сегменте TSS которой установлен бит Т=1; при достижении аппаратных точек останова, устанавливаемых с помощью регистров DR0-DR3. В зависимости от типа аппаратной точки останова исключение #DB может обслуживаться как ошибка или как ловушка.

Прерывание 2 - немаскируемое прерывание. Возникает при поступлении внешнего сигнала NMI=1 на вход NMI процессора или приеме соответствующего сообщения по шине APIC. Это прерывание может быть вызвано как программное с помощью команды INT п, где п = 2.

Исключение 3 - исключение программной точки останова (#ВР). Имеет место при выполнении однобайтной команды INT3. Команда INT3 обычно вводится в текст отлаживаемой программы для ее останова и контроля текущих результатов выполнения.

Комментарии
Нет комментариев.
Добавить комментарий
Пожалуйста, залогиньтесь для добавления комментария.
Рейтинги
Рейтинг доступен только для пользователей.

Пожалуйста, авторизуйтесьили зарегистрируйтесь для голосования.

Нет данных для оценки.

Время загрузки: 0.04 секунд 2,298,442 уникальных посетителей