Для чего используется команды программных прерываний

Для чего используется команды программных прерываний

Система прерываний 32-разрядных микропроцессоров i 80 x 86.

Работа системы прерываний в реальном режиме

1. Понятие прерывания

2. Классификация прерываний

3. Система прерываний.

· Программные средства системы прерываний

· Таблица векторов прерываний

4. Обработка прерывания в реальном режиме

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

Т.е. это процесс, временно переключающий микропроцессор на выполнение другой программы с последующим возвратом к прерванной программе.

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

Адрес программы-обработчика прерывания вычисляется по таблице векторов прерываний.

Механизм прерываний поддерживается на аппаратном уровне.

В зависимости от источника, прерывания делятся на

Общая классификация прерываний

Внешние прерывания возникают по сигналу какого-нибудь внешнего устройства.

Внешние прерывания подразделяются на не­маскируемые и маскируемые.

Маскируемые прерывания генерируются контроллером прерываний по заявке определенных периферийных устройств. Контроллер прерываний (выполнен в виде специальной микросхемы i8259A) поддерживает восемь уровней (линий) приоритета; к каждому уровню “привязано” одно периферийное устройство. Именно маскируемые прерывания часто называют аппаратными прерываниями.

В ПК, начиная с IBM PC AT, построенных на базе микропроцессора i80286, используются два контроллера прерываний i8259A; они соединяются последователь­но каскадным образом, что увеличивает количество внешних источников прерываний до 15 (каждая по 8).

Немаскируемые прерывания (говорят, что оно одно, т.к. подается на вывод микропроцессора NMI ) инициируют источники, требующие безотлагательного вмешательства со стороны микропроцессора.

В реальном и защищенном режиме работы микропроцессора обработка прерываний осуществляется принципиально разными методами.

Система прерываний. Аппаратные и программные средства системы прерываний

К аппаратным средствам системы прерываний относятся:

· программируемый контроллер прерываний 8259А (предназначен для фиксирования сигналов прерываний от восьми различных внешних устройств; он выполнен в виде микросхемы; обычно используют две последовательно соединенные микросхемы, поэтому кол-во возможных источников внешних прерываний до 15 плюс одно немаскируемое прер.; именно он формирует номер вектора прерывания и выдает его шину данных);

· внешние устройства (таймер, клавиатура, магнитные диски и т.п.)

К программным средствам системы прерываний Реального режима относятся:

Таблица векторов прерываний инициализируется при запуске системы, но в принципе может быть изменена и перемещена.

Каждый вектор имеет свой номер и называется номером прерывания.

· два флага в регистре флагов flags/eflags :

Обработка прерывания в реальном режиме

производится в три этапа:

1) прекращение выполнения текущей программы;

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

Наиболее удобным местом хранения регистров является стек.

2) переход к выполнению и выполнение программы обработки прерывания;

Здесь определяется источник прерывания и вызывается соответствующий обработчик прерывания.

смещение эл-та таблицы векторов прерываний = N * 4

Итак на втором этапе микропроцессор

1. По номеру источника прерывания определяет смещение в таблице векторов прерываний

2. Помещает первые два байта в регистр IP

3. Помещает вторые два байта в регистр CS

4. Передыет управление по адресу CS:IP

Далее выполняется сама программа обработки прерывания.

(Она тоже может быть прервана поступлением запроса от более приоритетного источника. Все источники прерывания имеют приоритеты.)

3) возврат управления прерванной программе.

Источник

Система команд процессора

3.3.3. Логические команды

Команды логических операций позволяют побитно вычислять основные логические функции от двух входных операндов. Кроме того, операция И ( AND ) используется для принудительной очистки заданных битов (в качестве одного из операндов при этом используется код маски, в котором разряды, требующие очистки, установлены в нуль). Операция ИЛИ ( OR ) применяется для принудительной установки заданных битов (в качестве одного из операндов при этом используется код маски, в котором разряды, требующие установки в единицу, равны единице). Операция «Исключающее ИЛИ» ( XOR ) используется для инверсии заданных битов (в качестве одного из операндов при этом применяется код маски, в котором биты, подлежащие инверсии, установлены в единицу). Команды требуют двух входных операндов и формируют один выходной операнд.

Команды сдвигов позволяют побитно сдвигать код операнда вправо (в сторону младших разрядов) или влево (в сторону старших разрядов). Тип сдвига (логический, арифметический или циклический) определяет, каково будет новое значение старшего бита (при сдвиге вправо) или младшего бита (при сдвиге влево), а также определяет, будет ли где-то сохранено прежнее значение старшего бита (при сдвиге влево) или младшего бита (при сдвиге вправо). Например, при логическом сдвиге вправо в старшем разряде кода операнда устанавливается нуль, а младший разряд записывается в качестве флага переноса в регистр состояния процессора. А при арифметическом сдвиге вправо значение старшего разряда сохраняется прежним (нулем или единицей), младший разряд также записывается в качестве флага переноса.

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

Для примера на рис. 3.12 показаны действия, выполняемые командами сдвигов вправо.

Команды проверки битов и операндов предназначены для установки или очистки битов регистра состояния процессора в зависимости от значения выбранных битов или всего операнда в целом. Выходного операнда команды не формируют. Команда проверки операнда ( TST ) проверяет весь код операнда в целом на равенство нулю и на знак (на значение старшего бита), она требует только одного входного операнда. Команда проверки бита ( BIT ) проверяет только отдельные биты, для выбора которых в качестве второго операнда используется код маски. В коде маски проверяемым битам основного операнда должны соответствовать единичные разряды.

Для чего используется команды программных прерываний. Смотреть фото Для чего используется команды программных прерываний. Смотреть картинку Для чего используется команды программных прерываний. Картинка про Для чего используется команды программных прерываний. Фото Для чего используется команды программных прерываний

Наконец, команды установки и очистки битов регистра состояния процессора (то есть флагов) позволяют установить или очистить любой флаг, что бывает очень удобно. Каждому флагу обычно соответствуют две команды, одна из которых устанавливает его в единицу, а другая сбрасывает в нуль. Например, флагу переноса C (от Carry ) будут соответствовать команды CLC (очистка) и SEC или STC (установка).

3.3.4. Команды переходов

Команды переходов без возврата делятся на две группы:

В обозначениях этих команд используются слова Branch ( ветвление ) и Jump (прыжок).

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

Команды условных переходов вызывают переход не всегда, а только при выполнении заданных условий. В качестве таких условий обычно выступают значения флагов в регистре состояния процессора ( PSW ). То есть условием перехода является результат предыдущей операции, меняющей значения флагов. Всего таких условий перехода может быть от 4 до 16. Несколько примеров команд условных переходов :

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

Совместное использование нескольких команд условных и безусловных переходов позволяет процессору выполнять разветвленные алгоритмы любой сложности. Для примера на рис. 3.13 показано разветвление программы на две ветки с последующим соединением, а на рис. 3.14 — разветвление на три ветки с последующим соединением.

Для чего используется команды программных прерываний. Смотреть фото Для чего используется команды программных прерываний. Смотреть картинку Для чего используется команды программных прерываний. Картинка про Для чего используется команды программных прерываний. Фото Для чего используется команды программных прерываний

Для чего используется команды программных прерываний. Смотреть фото Для чего используется команды программных прерываний. Смотреть картинку Для чего используется команды программных прерываний. Картинка про Для чего используется команды программных прерываний. Фото Для чего используется команды программных прерываний

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

Отметим, что у некоторых процессоров предусмотрены также команды условных прерываний, например, команда прерывания при переполнении.

Источник

Команды прерываний

Ещё один из способов изменения порядка выполнения программы заключается в использовании в программе прерываний.

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

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

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

Прерывания могут быть внешними (аппаратными) и внутренними.

Внешние или аппаратные прерывания в свою очередь делятся на немаскируемые и маскируемые.

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

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

Этот вид прерываний обрабатывается командой INT xx, где xx — номер прерывания.

Обработка прерываний в реальном режиме как внешних, так, и внутренних производится в три этапа:

1. прекращение выполнения текущей программы;

2. переход к выполнению программы обработки прерывания;

3. возврат управления прерванной программе.

Все возможные прерывания нумеруются числами от 0 до 255.

Для каждого прерывания есть своя процедура обработки прерывания.

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

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

Для этого микропроцессор заносит в стек текущее содержимое трёх регистров: CS, IP, регистра флагов. (CS и IP — полный адрес возврата в прерванную программу).

Когда обработчик прерываний закончит свою работу, он должен возобновить работу прерванной программы. Для этого из стека считываются три слова и восстанавливаются по ним регистры CS, IP и регистр флагов.

Для осуществления этих действий используется команда IRET — “возврат из прерывания”.

Описанные действия микропроцессором выполняются совершенно одинаково для всех видов прерываний.

Далее процессор загружает CS и IP из соответствующего вектора прерываний, осуществляя, тем самым, переход на обработчик прерывания связанный с этим вектором.

Краткая выдержка из таблицы векторов

00h — внутреннее прерывание, деление на 0;

01h — внутреннее прерывание, пошаговое выполнение (при TF=1);

02h — немаскируемое прерывание (выводит NMI процессора);

08h — аппаратное прерывание от системного таймера;

09h — аппаратное прерывание от клавиатуры;

0Eh — аппаратное прерывание от гибкого диска;

13h — программное прерывание, программы BIOS управление дисками;

16h — программное прерывание, программы BIOS управления клавиатур;

21h — программное прерывание, диспетчер функций DOS;

22h — программное прерывание, адрес перехода при завершении процесса, используемый DOS;

25h — программное прерывания, абсолютное чтение диска (функция DOS);

26h — программное прерывание, абсолютная запись на диск (функция DOS);

60h …66h — зарезервировано для программных прерываний пользователя;

68h …6Fh — программные прерывания, свободные векторы;

70h — аппаратное прерывание от часов реального времени (с питанием от аккумулятора);

76h — аппаратное прерывание от жёсткого диска;

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

Особенно характерен в этом отношении вектор 21H, через который осуществляется вызов практически всех функций DOS: ввода с клавиатуры и вывода на экран и т.д.

Для вызова требуемой функции надо не только выполнить команду INT с соответствующим номером, но и указать системе в одном из регистров (для этой цели всегда используется регистр AH) номер вызываемой функции, в другие регистры — исходные данные, после чего выполнить команду INT 21H, которая передает управление DOS.

Для чего используется команды программных прерываний. Смотреть фото Для чего используется команды программных прерываний. Смотреть картинку Для чего используется команды программных прерываний. Картинка про Для чего используется команды программных прерываний. Фото Для чего используется команды программных прерываний

6.6 Команды ввода/вывода

Любые микропроцессорные системы должны иметь в системе своих команд команды вода/вывода с внешних устройств. Для данного семейства таких команд две – ввод из внешнего порта – IN и вывод во внешний порт – OUT.

Здесь первый операнд, в который записывается или откуда считывается соответственно вводимое или выводимое значение – это регистр-аккумулятор – AL или AX. Адрес порта, в который вводится или откуда считывается значение, является вторым операндом и в данной команде им может быть или 8-ми разрядная константа, или содержимое регистра DX. Следует помнить, что в первом случае команды можно адресовать только такие порты ввода/вывода, адрес которых находится в пределах от 0 до 256, при этом старшие биты адреса устанавливаются в 0. Во втором случае, при использовании регистра DX, можно адресовать порты ввода/вывода во всём адресном пространстве таких устройств.

Эти команды не изменяют состояния флагов микропроцессора.

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

Источник

4. Обработка прерываний.

4.1 Общие принципы.

4.2 Рестарт команд.

4.3 Приоритеты одновременно происходящих прерываний.

4.4 Механизмы передачи управления обработчикам прерываний.

4.5 Защита в процедурах прерываний.

4.6 Код ошибки.

4.7 Условия возникновения исключений.

4.1 Общие принципы.

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

Аппаратные прерывания подразделяются на маскируемые и немаскируемые. Процессор может воспринимать прерывания после выполнения каждой коман­ ды, длинные строковые команды имеют для восприятия прерываний специаль­ ные окна. Аппаратные прерывания вызываются электрическими сигналами на входах INTR и NMI.

Маскируемые прерывания вызываются переходом в высокий уровень сиг­ нала на входе INTR ( Interrupt Request ) при установленном флаге разрешения (IF=1). В этом случае процессор сохраняет в стеке регистр флагов, сбрасы­вает флаг IF и вырабатывает два следующих друг за другом ( back to back ) цикла подтверждения прерывания, в которых генерируются управляющие сиг­ налы INTA# ( Interrupt Acknowledge ). Высокий уровень сигнала INTR должен сохраняться по крайней мере до подтверждения прерывания. Первый цикл подтверждения холостой, по второму импульсу внешний контроллер прерыва­ ний передает по шине номер вектора, обслуживающего данный тип аппарат­ ного прерывания. Прерывание с полученным номером вектора выполняется процессором так же, как и программное. Обработка текущего прерывания может быть в свою очередь прервана немаскируемым прерыванием, а если обработчик установит флаг IF, то и другим маскируемым аппаратным преры ванием.

Немаскируемые прерывания выполняются независимо от состояния флага IF по сигналу NMI ( Non Mascable Interrupt ). Высокий уровень на этом входе вы­зовет прерывание с типом (вектором) 2, которое выполняется так же, как и маскируемое. Его обработка не может прерываться под действием сигнала на входе NMI до выполнения команды IRET.

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

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

Ловушка ( trap ) — это исключение, которое обнаруживается и обслуживает­ ся после выполнения инструкции, его вызывающей. После обслуживания этого исключения управление возвращается на инструкцию, следующую за вызвав­ шей ловушку. К классу ловушек относятся и программные прерывания.

Аварийное завершение ( abort ) — это исключение, которое не позволяет точно установить инструкцию, его вызвавшую. Оно используется для сообще­ния о серьезной ошибке, такой как аппаратная ошибка или повреждение сис­темных таблиц.

Обработка прерываний и исключений в защищенном режиме базируется на таблице дескрипторов прерываний (шлюзов прерываний) IDT – адрес начала и размер которой хранятся в регистре IDTR. Его формат аналогичен формату регистра GDTR (рис. 4.1).

Для чего используется команды программных прерываний. Смотреть фото Для чего используется команды программных прерываний. Смотреть картинку Для чего используется команды программных прерываний. Картинка про Для чего используется команды программных прерываний. Фото Для чего используется команды программных прерываний

Рис. 4.1 Формат регистра IDTR

Таблица прерываний может содержать до 256 дескрипторов. При попытке обслуживания прерывания с номером, выходящим за размер таблицы, генери­руется исключение #DF. Под исключения отданы первые 32 номера (0 ¸ 31).

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

Для чего используется команды программных прерываний. Смотреть фото Для чего используется команды программных прерываний. Смотреть картинку Для чего используется команды программных прерываний. Картинка про Для чего используется команды программных прерываний. Фото Для чего используется команды программных прерываний

1 В реальном режиме — вектор прерывания не попадает в таблицу.

2 В реальном режиме не возникают, но возможны в V86.

3 В реальном режиме — нарушение границы сегмента стека.

4 В реальном режиме — нарушение границы сегмента данных или кода.

Таблица 4.1 Назначения векторов исключений и прерываний

4.2 Рестарт команды.

Для большей части исключений и прерываний передача управления не происходит до конца текущей команды. Тем самым регистр EIP устанавливается таким образом, чтобы указывать на команду, следующую за командой, которая выполнялась в момент генерации исключения или прерывания. Если эта команда имеет префикс повторения, то передача управления происходит в конце текущей итерации, причем все регистры будут находиться в состоянии для выполнения следующей итерации. Однако, если данная ситуация относится по типу к сбоям, то регистры процессора восстанавливаются в состояние, предшествующее выполнению вызвавшей сбой команды. Тем самым допускается рестарт команды.

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

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

4.3 Приоритеты одновременно происходящих прерываний.

Анализ условий обслуживания прерываний и исключений выполняется в следующем порядке (по убыванию приоритета):

1. Проверка на исключение-ловушку отладки (#DS) по выполненной инструкции (пошаговый режим через флаг TF или точка останова по дан ным через регистры отладки).

2. Проверка на исключение-отказ отладки (#DB) по последующей инструк­ ции (точка останова по инструкции через регистр отладки).

3. Немаскируемое прерывание (аппаратное по входу NMI).

4. Маскируемое прерывание (аппаратное по входу INTR при IF=1).

5. Проверка на исключение-отказ сегментации (#NP или #GP) при выборке следующей инструкции.

6. Проверка на исключение-отказ страницы (#PF) при выборке следующей инструкции.

7. Проверка на отказ декодирования следующей инструкции (#UD или #GP).

8. Для операции WAIT проверка TS и МР (исключение #NM, если TS=1 и МР=1).

9. Для операции ESCAPE (инструкция математического сопроцессора) про­верка ЕМ и TS (исключение #NМ, если E М=1 или TS=1).

10. Для операции WAIT или ESCAPE проверка на исключение #MF от сопро­ цессора.

11. Проверка на отказ сегментации (# N Р, #SS, #GP) или отказ страницы (#PF) для операндов, используемых в инструкции.

Двойной отказ ( Double Fault ) — исключение #DF — возникает, когда при обработке исключения, связанного с сегментацией (#TS, #NP, #SS или #GP), процессор обнаруживает исключение, отличное от отказа страницы (#PF). Также двойной отказ возникает, если при обработке исключения отказа страни­ цы #PF обнаруживается исключение другого типа. В этом случае тоже исполня­ется исключение #DF.

Если во время обслуживания исключения отказа страницы произойдет еще один отказ страницы, то происходит аварийный останов ( Shutdown ) процессо­ ра. Во время аварийного останова никакие новые инструкции не выполняются. Из этого состояния процессор можно вывести только аппаратно сигналом NMI, оставляя его в защищенном режиме, или сигналом RESET, переводящим процес сор в реальный режим.

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

4.4 Механизмы передачи управления обработчикам прерываний.

Дескрипторная таблица прерываний ( IDT ) содержит шлюзы (рис 4.2).

Для чего используется команды программных прерываний. Смотреть фото Для чего используется команды программных прерываний. Смотреть картинку Для чего используется команды программных прерываний. Картинка про Для чего используется команды программных прерываний. Фото Для чего используется команды программных прерываний

Рис. 4.2 Формат шлюза IDT

Поле «TYPE» в байте доступа определяет тип шлюза:

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

4.5 Защита в процедурах прерываний.

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

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

· Обработчик исключения или прерывания должен быть помещен в конформный кодовый сегмент. Этот способ может использоваться для обработчиков некоторых конкретных исключений (например, деления на ноль). Такие обработчики должны использовать только данные, доступные через стек. Если обработчику требуются данные из сегмента данных, этот сегмент данных должен иметь уровень привилегированности 3, то есть он должен быть незащищенным.

· Обработчик может быть помещен в кодовый сегмент с уровнем привилегированности 0. Такой обработчик будет выполняться всегда, независимо от CPL программы.

4.6 Код ошибки.

При отработке исключения в защищенном режиме процессор сохраняет в стеке слово кода ошибки ( Error Code ). Если оно отлично от нуля, то в нем содержится селектор дескриптора, с которым связана ошибка.

Для чего используется команды программных прерываний. Смотреть фото Для чего используется команды программных прерываний. Смотреть картинку Для чего используется команды программных прерываний. Картинка про Для чего используется команды программных прерываний. Фото Для чего используется команды программных прерываний

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

Код ошибки похож на селектор сегмента, однако вместо поля RPL код ошибки содержит два однобитовых поля:

1. Процессор устанавливает бит EXT, если исключение вызвано событием, внешним по отношению к программе.

2. Процессор устанавливает бит IDT, если индексная часть кода ошибки ссылается к дескриптору шлюза в IDT.

4.7 Условия возникновения исключений.

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

Сбой типа «ошибки деления» встречается в командах DIV или IDIV, при делителе равном 0.

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

· Сбой в контрольной точке адреса команды;

· Ловушка в контрольной точке адреса данных;

· Ловушка шага выполнения;

· Ловушка контрольной точки переключения задачи.

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

Команда INT 3 генерирует ловушку типа контрольной точки. Команда INT 3 имеет длину один байт, что упрощает замену кода операции в кодовом сегменте в оперативной памяти кодом операции контрольной точки. Операционная система или система отладки может использовать сегмент данных, отображенный в том же физическом адресном пространстве, что и кодовый сегмент, для помещения команды INT 3 в точках, где желательно вызвать отладчик. Отладчики используют контрольные точки для приостановки выполнения программы, чтобы иметь возможность исследовать регистры, переменные программы и т.д.

Сохраненное содержимое регистров CS и EIP указывает на байт, следующий за контрольной точкой. Если отладчик позволяет возобновление приостановленной программы, он заменяет команду INT 3 исходным кодом операции по адресу контрольной точки, а также декрементирует сохраненное содержимое регистра EIP перед возвратом.

Ловушка переполнения происходит, когда процессор выполняет команду INTO при установленном флаге IF. Поскольку арифметические операции со знаком и без знака используют некоторые общие команды, процессор не в состоянии определить, когда фактически происходит переполнение. Вместо этого он устанавливает флаг OF, когда результаты, интерпретируемые как числа со знаком, выходят за пределы допустимого диапазона. При выполнении арифметических операций с операндами, имеющими знак, флаг OF можно тестировать непосредственно, либо при помощи команды INTO.

Сбой типа «контроля диапазона» генерируется процессором, когда при выполнении команды BOUND обнаруживается, что операнд превышает заданные границы. Программа может использовать команду BOUND для контроля того, что индекс массива, имеющий знак, находится в пределах, определенных для этого блока памяти.

Сбой «неверного кода операции» генерируется, когда исполнительный модуль обнаруживает неверный код операции. (Данное исключение не будет обнаружено до тех пор, пока не будет сделана попытка выполнить неверный код операции; т.е. предварительная выборка неверного кода операции, без выполнения, не ведет к данному исключению). Код ошибки в данном случае на стек не помещается. Такое исключение может обрабатываться в пределах той же задачи.

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

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

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *