Что будет выполняться после обработки прерывания

Что будет выполняться после обработки прерывания

Система прерываний 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) возврат управления прерванной программе.

Источник

Обработка прерываний, векторы прерываний, программные прерывания, IRQ.

Здесь мы разберем такие важные темы, как: обработка прерываний, векторы прерываний, программные прерывания, IRQ, в общем поговорим на темы прерывания.

Идея прерывания была предложена в середине 50-х годов и основная цель введения прерываний – реализация синхронного режима работы и реализация параллельной работы отдельных устройств ЭВМ.

Прерывания и обработка прерываний зависят от типа ЭВМ, поэтому их реализацию относят к машинно-зависимым свойствам операционных систем.

Прерывание (interrupt) – это сигнал, заставляющий ЭВМ менять обычный порядок выполнения команд процессором.

Возникновение подобных сигналов обусловлено такими событиями, как:

Обработка прерывания

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

Например прерывание с номером 9 — прерывание от клавиатуры, которое генерируется при нажатии и при отжатии клавиши. Используется для чтения данных с клавиатуры. Обозначается в ОС как IRQ1, где IRQ – обозначение прерывания, а 1 – приоритет прерывания. Данные о запросах на прерывание можно проанализировать в диспетчере устройств:

Что будет выполняться после обработки прерывания. Смотреть фото Что будет выполняться после обработки прерывания. Смотреть картинку Что будет выполняться после обработки прерывания. Картинка про Что будет выполняться после обработки прерывания. Фото Что будет выполняться после обработки прерывания

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

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

Что будет выполняться после обработки прерывания. Смотреть фото Что будет выполняться после обработки прерывания. Смотреть картинку Что будет выполняться после обработки прерывания. Картинка про Что будет выполняться после обработки прерывания. Фото Что будет выполняться после обработки прерывания

Векторы прерываний

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

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

Таблица векторов прерываний занимает первый килобайт оперативной памяти — адреса от 0000:0000 до 0000:03FF. Таблица состоит из 256 элементов — FAR-адресов обработчиков прерываний. Эти элементы называются векторами прерываний. В первом слове элемента таблицы записано смещение, а во втором — адрес сегмента обработчика прерывания. Векторами являются просто полные адреса памяти программы (в сегментированной форме), которая должна быть активизирована в случае возникновения прерывания.

Прерыванию с номером 0 соответствует адрес 0000:0000, прерыванию с номером 1 — 0000:0004 и т.д. Адрес такой состоит из пары 2-байтовых слов, поэтому каждый из векторов занимает четыре байта.

Можно просмотреть таблицу векторов прерываний в компьютере, если воспользоваться программой DEBUG. Используйте команду D для вывода содержимого начала памяти: D 0:0. Программа DEBUG покажет вам первые 128 байтов или 32 вектора, которые могут иметь вид наподобие следующего:

0000:0000 E8 4E 9A 01 00 00 00 00-C3 E2 00 F0 00 00 00 00
0000:0010 F0 01 70 00 54 FF 00 F0-05 18 00 F0 05 18 00 F0
0000:0020 2C 08 51 17 D0 0A 51 17-AD 08 54 08 E8 05 01 2F
0000:0030 FA 05 01 2F 05 18 00 F0-57 EF 00 F0 F0 01 70 00
0000:0040 90 13 C7 13 4D F8 00 F0-41 F8 00 F0 3E 0A 51 17
0000:0050 5C 00 B7 25 59 F8 00 F0-E2 0A 51 17 9C 00 B7 25
0000:0060 00 00 00 F6 8E 00 DE 09-6E FE 00 F0 F2 00 7B 09
0000:0070 27 08 51 17 A4 F0 00 F0-22 05 00 00 00 00 00 F0

Векторы хранятся как «слова наоборот»: сначала смещение, а потом сегмент. Например, первые четыре байта, которые программа DEBUG показала выше (E8 4E 9A 01) можно преобразовать в сегментированный адрес 019A:4EE8.

Можно встретить три вида адресов в таблице векторов. Это могут быть адреса, указывающие на ROM-BIOS, которые можно идентифицировать шестнадцатеричной цифрой F, которая предшествует номеру сегмента. Это могут быть адреса, которые указывают на главную память (как в примере: 019A:4EE8). Эти адреса могут указывать на подпрограммы ДОС или на резидентную программу (например, SideKick или Prokey), либо они могут указывать на саму программу DEBUG (поскольку DEBUG должна временно управлять прерыванием). Также векторы могут состоять из одних нулей, когда прерывание с данным номером не обрабатывается в текущий момент.

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

Ниже приведено назначение некоторых векторов:

Описание
0Ошибка деления. Вызывается автоматически после выполнения команд DIV или IDIV, если в результате деления происходит переполнение (например, при делении на 0).
2Аппаратное немаскируемое прерывание. Это прерывание может использоваться по-разному в разных машинах. Обычно вырабатывается при ошибке четности в оперативной памяти и при запросе прерывания от сопроцессора.
5Печать копии экрана. Генерируется при нажатии на клавиатуре клавиши PrtScr. Обычно используется для печати образа экрана.
8IRQ0 — прерывание интервального таймера, возникает 18,2 раза в секунду.
9IRQ1 — прерывание от клавиатуры. Генерируется при нажатии и при отжатии клавиши. Используется для чтения данных от клавиатуры.
AIRQ2 — используется для каскадирования аппаратных прерываний в машинах класса AT
BIRQ3 — прерывание асинхронного порта COM2.
CIRQ4 — прерывание асинхронного порта COM1.
DIRQ5 — прерывание от контроллера жесткого диска для XT.
EIRQ6 — прерывание генерируется контроллером флоппи-диска после завершения операции.
FIRQ7 — прерывание принтера. Генерируется принтером, когда он готов к выполнению очередной операции. Многие адаптеры принтера не используют это прерывание.
10Обслуживание видеоадаптера.
11Определение конфигурации устройств в системе.
12Определение размера оперативной памяти в системе.
13Обслуживание дисковой системы.
14Последовательный ввод/вывод.
19Загрузка операционной системы.
1AОбслуживание часов.
1BОбработчик прерывания Ctrl-Break.
70IRQ8 — прерывание от часов реального времени.
71IRQ9 — прерывание от контроллера EGA.
75IRQ13 — прерывание от математического сопроцессора.
76IRQ14 — прерывание от контроллера жесткого диска.
77IRQ15 — зарезервировано.

IRQ0 — IRQ15 — это аппаратные прерывания.

Механизм обработки прерываний

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

Главные функции механизма прерывания:

Типы прерываний

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

Что будет выполняться после обработки прерывания. Смотреть фото Что будет выполняться после обработки прерывания. Смотреть картинку Что будет выполняться после обработки прерывания. Картинка про Что будет выполняться после обработки прерывания. Фото Что будет выполняться после обработки прерывания

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

Аппаратные прерывания не координируются c работой программного обеспечения. Когда вызывается прерывание, то процессор оставляет свою работу, выполняет прерывание, a затем возвращается на прежнее место.

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

Прерывание по таймеру вызывается интервальным таймером. Этот таймер содержит регистр, которому может быть присвоено определенное начальное значение посредством специальной привилегированной команды. Значение этого регистра автоматически уменьшается на 1 по истечении каждой миллисекунды времени. Когда это значение становятся равным нулю, происходит прерывание по таймеру. Подобный интервальный таймер используется операционной системой для определения времени, в течение которого программа пользователя может оставаться под управлением машины.

Маскируемые и немаскируемые внешние прерывания

Существуют два специальных внешних сигнала среди входных сигналов процессора, при помощи которых можно прервать выполнение текущей программы и тем самым переключить работу центрального процессора. Это сигналы NMI (Non Mascable Interrupt, немаскируемое прерывани) INTR (interrupt request, запрос на прерывание).

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

Часто при выполнении критических участков программ, для того чтобы гарантировать выполнение определенной последовательности команд целиком, приходится запрещать прерывания (т.е. сделать систему нечувствительной ко всем или отдельным прерываниям). Это можно сделать командой CLI. Ее нужно поместить в начало критической последовательности команд, а в конце расположить команду STI, разрешающую процессору воспринимать прерывания. Команда CLI запрещает только маскируемые прерывания, немаскируемые всегда обрабатываются процессором.

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

Внутренние прерывания вызываются событиями, которые связаны с работой процессора и являются синхронными с его операциями, а именно прерывание происходит, когда:

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

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

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

Механизм программных прерываний был специально введен для того, чтобы:

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

В упрощенном виде схему обработки различных видов прерываний можно представить следующим образом:

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

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

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

В случае о прерывании самой программы обработки прерывания говорят о вложенном прерывании. Уровни приоритетов обозначаются сокращенно IRQ0 — IRQ15 или IRQ0 – IRQ23 (в зависимости от микросхемой реализации).

Пpepывaнию вpeмeни cутoк дан мaкcимaльный пpиopитeт, пocкoльку ecли oнo будет пocтoяннo тepятьcя, то будут нeвepными пoкaзaния cиcтeмныx чacoв. Пpepывaниe от клaвиaтуpы вызывaeтcя при нaжaтии или oтпуcкaнии клавиши; oнo вызывaeт цепь coбытий, кoтopaя oбычнo зaкaнчивaeтcя тем, что код клавиши пoмeщaeтcя в буфep клaвиaтуpы (oткудa он зaтeм мoжeт быть пoлучeн пpoгpaммными пpepывaниями).

Ну и наконец реализация механизма обработки прерываний

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

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

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

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

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

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

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

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

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

Источник

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 не будет опубликован. Обязательные поля помечены *