Система прерывания в мп семейства Х86, страница 2

·  команда CALL  имеет  длину от 3 до 7 байт, в то время как команда INT n – всего двухбайтная. Поэтому во многих случаях она может использоваться с той же целью, но гораздо эффективнее.

При этом, особенностью обладает команда INT3, которая, во-первых является однобайтной, а во-вторых результатом ее исполнения является останов процесса исполнения программы. Таким образом, включением этой короткой, однобайтной команды в программу, пользователь задает точку останова, которая может использоваться при  отладке этой программы.

Как было уже упомянуто, микропроцессоры семейства Х86 способны обрабатывать 256 различных типов прерываний/исключений. Их перечень и основные характеристики приведены в таблице V.1. Первые 32 типа зарезервированы для внутрисистемных целей, остальные предоставлены пользователю для организации связей процессора с периферийными устройствами.

                                                                                                     Табл. V.1

Перечень прерываний/исключений защищенного режима

Номер

Описание

Тип

0

Ошибка переполнения при делении

Fault

1

Исключение при отладке

Fault/Trap

2

Немаскируемое прерывание (NMI)

Interrupt

3

Однобайтная команда останова (INT 3)

Trap

4

Исключение по переполнению (INTO)

Trap

5

Превышение границы массива (BOUND)

Fault

6

Недопустимый код команды

Fault

7

Сопроцессор FPU недоступен

Fault

8

Двойная ошибка

Abort

9

Нарушение границы сегмента сопроцессором (386/387)

Fault

10

Неразрешенный сегмент состояния задачи TSS

Fault

11

Отсутствие сегмента

Fault

12

Ошибка при обращении к стеку

Fault

13

Нарушение общей защиты

Fault

14

Отсутствие затребованной страницы

Fault

15

Зарезервировано

-

16

Ошибка операции FPU

Fault

17

Ошибка  при выравнивании данных (486+)

Fault

18

Машинный контроль (P5+)

Abort

19

Исключение SSE

Abort

20…31

Зарезервированы

32…255

Предоставлены пользователю

Interrupt

0…255

Двухбайтные команды прерываний INT N

Trap

Приведем краткую характеристику наиболее важных типов прерываний для общего представления их назначения.

Прерывание 0 -  возникает привыполнении команд целочисленного деления DIV и IDIV, если делитель оказывается равным 0.

Прерывание 1 -  возникает в трех случаях :

          1) при работе процессора в пошаговом режиме после выполнения каждой команды;

          2) при обращении к сегменту состояния задачи TSS, у которого бит Т (бит ловушки, используемый при отладке программного обеспечения) равен 1;

          3) при останове в контрольных точках, которые заданы в регистрах отладки DR3…DR0.

Прерывание 2 – возникает при запросе по входу NMI, либо при выполнении команды программного прерывания INT2.

Прерывание 3 – возникает при выполнении однобайтовой команды программного прерывания INT3.

Прерывание 4 – возникает при контроле переполнения разрядной сетки после арифметических операций над числами со знаком. Оно имеет место, если микропроцессор выполняет команду INTО при установленном флаге OF=0.

Прерывание 5 -  характеризует превышение границы массива. Имеет место при выполнении команды BOUND, если содержимое адресуемого регистра выходит за указанные пределы.

Прерывание 6 – это прерывание имеет место при попытке выполнения команды с неверным кодом или неправильной адресацией операнда, а также при использовании префикса LOCK с командой, для которой блокировка магистрали запрещена.

Прерывание 7 – возникает при недоступности математического сопроцессора FPU. В этом случае для выполнения поступившей команды процедура обслуживания должна реализовать программную эмуляцию FPU.

Прерывание 8 – двойная ошибка. Это прерывание имеет место, например, когда при вызове процедур обслуживания особых случаев, связанных с ошибками сегментов (прерывания типов 10…13), процессор выявляет новый особый случай, отличный от особого случая типа 14 («ошибка страницы).

Прерывание 10 – возникает при переключении задач, если вызывается неразрешённый TSS, который определяется как неразрешённым если:

          1) заданный в его дескрипторе размер меньше 104 байт;

          2) отсутствие, или неразрешенный селектор LDT;

          3) сегмент CS не является исполняемым;

          4) сегменты DS, ES, FS или GS недоступны для чтения;

          5) нарушены правила защиты при обращении к SS или CS;

          6) селектор сегмента (CS, SS, DS, ES, FS или GS) указывает на

              дескриптор, выходящий за пределы дескрипторной таблицы.

Прерывание 11 – отсутствие сегмента в оперативной памяти (бит P его

дескриптора = 0).

Прерывание 12 – возникает при попытке загрузки сегментного регистра SS отсутствующим дескриптором (у которого его бит P = 0).

Прерывание 13 – нарушение общей защиты. Является наиболее общим типом прерывания, которое может появляться по причинам:

·  нарушения правил защиты при обращении к памяти или внешним устройствам;

·  нарушения границ сегмента при обращении к таблицам дескрипторов или сегментам;

·  переключения на занятую задачу;

·  записи в сегмент команд или данных, разрешенный только для чтения;

·  передачи управления сегменту, который является сегментом данных;

·  превышения максимальной допустимой длины команды 15 байт;

·  и др.

Прерывание  14 – отсутствие доступа к странице при разрешенной страничной адресации (или при недостаточном уровне привилегий, или при ее отсутствии в оперативной памяти (P = 0)).

Прерывание 16 -  ошибка операции FPU.

Прерывание 17 – возникает при формировании невыровненных операндов, если в регистре общего управления CR0 бит AM = 0. Данное прерывание реализуется только при выполнении программ с текущим уровнем привилегий CPL = 3.