Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
мпс с 1 по 294.doc
Скачиваний:
21
Добавлен:
16.04.2019
Размер:
6.2 Mб
Скачать

2.8. Реализация прерываний и исключений. Обеспечение тестирования и отладки

При работе микропроцессорной системы часто возникают ситуации, когда требуется прервать выполнение текущей программы и перейти к подпрограмме, обеспечивающей необходимую реакцию системы на создавшиеся обстоятельства. Такие ситуации называ­ются прерываниями или исключениями в зависимости от причин, вызывающих их возникновение. Специальные виды таких прерываний реализуются при отладке программ, для чего в состав процессора введены необходимые функциональные блоки, работа которых контролируется с помощью регистров отладки DR7-0.

Особенно большое значение для современных процессоров и систем, реализуемых на их основе, имеют тестирование и самотестирование. Процессоры семейства Р6 содержат ряд средств, которые обеспечивают выполнение данных процедур.

2.8.1. Виды прерываний и исключений, реализация их обслуживания

Прерываниями (interruption) являются штатные ситуации, возникающие при поступле­нии соответствующих команд (программные прерывания) или внешних сигналов (аппарат­ные прерывания). Исключениями (exeption) являются нештатные ситуации (ошибки), воз­никающие при работе процессора. При выявлении таких ошибок соответствующие блоки, контролирующие работу процессора, вырабатывают внутренние сигналы запроса, обеспе­чивающие вызов необходимой подпрограммы обслуживания. Классификация прерываний и исключений иллюстрируется на рис. 2.56.

Процессор способен обеспечить обслуживание 256 различных типов исключений и пре­рываний. Соответствующая обработка информации при возникновении таких ситуаций выполняется с помощью специальных подпрограмм обслуживания, начальные адреса (век­тора) которых хранятся в таблице, размещаемой в памяти системы.

Запросы на выполнение аппаратных прерываний поступают от внешних устройств на входы LINTO/INTR, LINT1/NMI процессора. В мультипроцессорной системе, когда включен внутренний контроллер локальных прерываний APIC, сигналы LINT1-0 на этих входах опре­деляют номер запроса, поступающего от других устройств (процессоров) системы. В одно­процессорной системе, когда функционирование контроллера APIC запрещено, эти входы служат соответственно для подачи маскируемых INTR и немаскируемых NMI запросов пре­рывания от различных внешних устройств.

На вход INTR поступают маскируемые запросы прерываний, обслуживание которых мо­жет быть запрещено (замаскировано) путем установки значения признака IF = 1 в регистре состояний EFLAGS. Обычно такой запрос поступает от внешнего устройства через специ­альный контроллер прерываний, который собирает запросы от различных внешних уст­ройств и передает их для обработки процессору, указав для них также номер п., определяющий вид прерывания (INTR п). На вход NMI поступает запрос на немаскируемое

прерыва­ние, процедура обслуживания которого имеет фиксированный номер п = 2 (табл. 2.60). Зна­чение признака IF в регистре EFLAGS не влияет на обслуживание процессором немаскиру­емого запроса прерывания NMI. При работе процессора в мультипроцессорной системе, когда функционирует контроллер локальных прерываний APIC, запросы аппаратных пре­рываний (маскируемые и немаскируемые) поступают по специальной APIC-шине.

Программные прерывания реализуются при поступлении команд: INT n, INT3, INTO, BOUND. Эти команды вызывают переход к выполнению подпрограмм обслуживания, вектора которых выбираются согласно табл. 2.60.

Таблица 2.60

В реальном режиме процессор не заносит в стек кед ошибки и использует только млад­шие 16 разрядов регистра EIP (регистр IP) и EFLAGS (регистр FLAGS). Возврат из подпрог­раммы обслуживания прерывания выполняется с помощью команды I RET, которая восста­навливает сохраненное в стеке содержимое регистров FLAGS, CS и IP, обеспечивая воз­вращение к выполнению прерванной программы.

Обработка прерываний в защищенном режиме. Вызов подпрограмм обслуживания прерываний осуществляется через дескрипторную таблицу прерываний IDT (Interrupt Descriptor Table), которая может располагаться в любом месте адресного пространства. Базовый линейный адрес этой таблицы хранится в регистре IDTR (рис. 2.58).

Загрузка содержимого регистра IDTR осуществляется с помощью команды LIDT, а его сохранение в памяти - с помощью команды SIDT. Команда LIDT является привилегиро­ванной и может выполняться только программой, имеющей высший уровень привилегий CPL = 0. Команда SIDT может быть выполнена при любом уровне привилегий программы.

Элементами таблицы ЮТ являются системные дескрипторы прерываний, имеющие размер по 8 байт. Поэтому максимальный размер таблицы ЮТ составляет 2 Кбайт при использовании всех 256 видов прерываний (исключений). В таблице могут содержаться три вида системных дескрипторов: шлюз прерывания, шлюз ловушки и шлюз задачи.

Форматы содержимого шлюзов прерывания и ловушки приведены на рис. 2.59, а, б. Они содержат селектор вызываемого при обслуживании сегмента, который поступает в ре­гистр CS, и относительный адрес первой команды подпрограммы обслуживания, который загружается в регистр EIP. В дескрипторе также содержится бит Р, указывающий на присут­ствие (при значении Р = 1) в памяти сегмента, в котором находится соответствующая под­программа обслуживания, и двухбитовое поле gDPL, определяющее уровень привилегий шлюза. Бит D в байте доступа определяет режим работы процессора при обслуживании прерываний: если значение D = 0, то процессор функционирует как 16-разрядный процес­сор 80286, если D = 1, то обеспечивается 32-разрядный режим функционирования, харак­терный для процессоров 386,486, Pentium, Р6.

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

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

программы обслуживания прерываний и исключений располагать в сегментах с уровнем при­вилегий DPL = 0, чтобы избежать ситуации, когда при поступлении запроса прерывания или исключения уровень текущей программы CPL окажется меньше, чем DPL сегмента команд обработчика прерывания.

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

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

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

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

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

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

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

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

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

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

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

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

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]