Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Исключения. Программные прерывания




Программные прерывания

С помощью инструкции INT n (n - номер прерывания) можно сгенерировать прерывание с любым номером 0...255. Такие прерывания называют программными. Состояние бита IF в регистре флагов не влияет на возможность генерации программных прерываний.

Хотя номер прерывания в этой инструкции может быть любым, следует отметить, что, например, при использовании вектора 2 для вызова обработчика немаскируемого прерывания внутреннее состояние процессора будет отличаться от того, которое бывает при обработке аппаратного немаскируемого прерывания. Аналогично, попытка вызвать обработчик исключения с помощью этой инструкции может оказаться неудачной, т.к. при возникновении большинства исключений в стек включается код ошибки, а при генерации программного прерывания этого не происходит. Обработчик исключения извлекает из стека код ошибки, а в случае программного прерывания из стека будет ошибочно извлечен адрес возврата, что нарушит целостность стека и в конечном итоге, скорее всего, приведет к исключению #13 или более тяжелому.

 

Источниками исключений являются три типа событий:

генерируемые программой исключения,

исключения машинного контроля (Pentium+),

обнаруженные процессором ошибки в программе.

Инструкции INTO (проверка на переполнение), INT3 (контрольная точка) и BOUND (проверка границ массива) позволяют программе контролировать определенные условия в заданных точках программы и генерировать программные исключения. Следует отметить, что попытка вызвать обработчик исключения при помощи инструкции INT n (за исключением перечисленных выше инструкций) не является исключением и может привести к аварийному завершению программы, если соответствующее исключение должно генерировать код ошибки.

Процессоры Pentium+ предоставляют зависящий от реализации механизм контроля операций внутри чипа и транзакций на шине процессора, называемый машинным контролем. Если при выполнении машинного контроля возникает ошибка, генерируется исключение #18.

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

Нарушение (отказ) - это исключение, которое обнаруживается либо перед исполнением, либо во время исполнения команды. При этом процессор переходит в состояние, позволяющее осуществить рестарт команды. В качестве адреса возврата в стек обработчика заносится адрес вызвавшей исключение команды.

Ловушка возникает на границе команд сразу же после команды, вызвавшей это исключение. Значения регистров CS и EIP, заносимые в стек обработчика, указывают на очередную команду. Например, если ловушка сработала на команде JMP, то в стеке запоминаются значения регистров CS и EIP, указывающие на адресат команды JMP.

В некоторых случаях для ловушек и нарушений невозможен рестарт команды, например, если один из операндов расположен ниже текущего указателя стека, т.е. по адресу памяти меньше, чем вершина стека.

Авария не позволяет осуществить рестарт программы, и зачастую нельзя точно локализовать команду, вызвавшую это исключение. Исключения типа "авария" генерируются при обнаружении серьезных ошибок, таких как неразрешенные или несовместимые значения в системных таблицах или аппаратные сбои.

Типичным случаем аварии является исключение #8 "двойная ошибка". Двойная ошибка происходит, когда процессор пытается обработать исключение, а его обработчик генерирует еще одно исключение. Для некоторых исключений процессор не генерирует двойную ошибку, такие исключения называют "легкими": 1, 2, 3, 4, 5, 6, 7, 9, 14 и 16. Только ошибки деления (исключение #0) и сегментные исключения (10, 11, 12, 13), называемые "тяжелыми", могут вызвать двойную ошибку. Таким образом, получение исключения "неприсутствие сегмента" во время обработки исключения отладки не приведет к двойной ошибке, в то время как ошибка сегмента, происходящая во время обработки ошибки деления на нуль, приведет к исключению #8.

Если при попытке вызвать обработчик исключения #8 возникает ошибка, процессор переходит в режим отключения (shutdown mode). Вывести из этого режима процессор могут только аппаратные сигналы: NMI#, SMI#, RESET# или INIT#. Обычно чипсет, обнаружив на шине процессора цикл отключения, инициирует аппаратный сброс.

Если на границе инструкции обнаруживается, что требуется обработка более одного прерывания или исключения, процессор обрабатывает прерывание или исключение с наивысшим приоритетом. Исключения с низким приоритетом снимаются, а прерывания с низким приоритетом откладываются. Снятые исключения могут быть потом снова сгенерированы при возврате из обработчика.

 

 

Приоритеты событий:

Приоритет Описание
  Аппаратный сброс (RESET#) и машинный контроль (#18)
  Ловушка при переключении задач (#1)
  Внешний сигнал (INIT#, SMI# и др.)
  Контрольная точка (#3) и ловушка отладки (#1)
  Аппаратные прерывания (NMI#, INTR#)
  Нарушения, обнаруженные при предвыборке очередной инструкции: · точка отладки по коду (#1), · неприсутствие страницы с кодом (#14), · превышение предела сегмента кода (#13).
  Нарушения, обнаруженные при декодировании очередной инструкции: · превышение длины инструкции (#13), · недействительный код операции (#6), · неприсутствие сопроцессора (#7).
  Нарушения, обнаруженные при исполнении инструкции (все остальные)

 

Назначение прерываний и исключений:

номер описание тип возможен рестарт код ошибки источник исключения
  Ошибка деления нарушение да нет DIV, IDIV
  Отладка нарушение / ловушка да нет любая команда
  NMI прерывание со след. команды нет сигнал NMI
  Контрольная точка ловушка со след. команды нет INT3
  Переполнение ловушка со след. команды нет INTO
  Нарушение границы массива нарушение да нет BOUND
  Недействительный код операции нарушение да нет Инструкция UD2 (P6+), неверный код операции, неверный операнд, выполнение спец. команд в RM, неверное использование префикса LOCK
  Сопроцессор отсутствует нарушение да нет ESC, WAIT
  Двойное нарушение авария нет   Если при обработке тяжелого исключения1 или страничного нарушения возникает еще одно тяжелое исключение.
  Нарушение сегмента для сопроцессора2 нарушение да нет ESC, WAIT
  Недействительный TSS нарушение да есть JMP, CALL, IRET, INT
  Неприсутствие сегмента нарушение да есть при попытке загрузить сегментный регистр или LDTR
  Нарушение стека нарушение да есть операции со стеком, загрузка SS
  Нарушение общей защиты нарушение / ловушка да есть любое обращение к памяти или проверка защиты
  Страничное нарушение нарушение да есть любое обращение к памяти
  резерв
  Ошибка сопроцессора нарушение да нет ESC, WAIT
  Контроль выравнивания3 нарушение да   любое обращение к данным в памяти
  Машинный контроль4 авария стоп зависит от МП зависит от МП
  Ошибка SIMD5 нарушение да нет инструкция SSE или SSE2
20-31 резерв
32-255 Определяемые пользователем прерывания прерывание да - INT n или внешний сигнал
1К тяжелым относят исключения 0, 10, 11, 12, 13. 2Это исключение генерируется только МП 80386. В поздних процессорах - зарезервировано. 3Используется в i486 и выше. 4Используется в Pentium и выше. 5Используется в Pentium-III и выше.



Поделиться с друзьями:


Дата добавления: 2014-01-07; Просмотров: 661; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.013 сек.