Прерывания в реальном режиме
V. СИСТЕМА ПРЕРЫВАНИЯ В МП СЕМЕЙСТВА Х86
Общие сведения
Системой прерываний процессораназывается совокупность программных и аппаратных средств,позволяющих процессорупрерывать выполнение текущей задачи (программы) по запросам внешних или внутренних устройств, и переключаться на выполнение других задач (процедур, подпрограмм) с возвращением в исходную задачу после их выполнения.
Причинами прерывания текущей программы в процессорах семейства Х86 могут являться:
· Внешний сигнал, поступивший на вход маскируемых прерываний INTR (Interrupt) или немаскируемого прерывания NMI (Non Masked Interrupt);
· Аномальная ситуация, появляющаяся в результате выполнения очередной команды, которая приводит к невозможности дальнейшего нормального продолжения выполнения программы;
· Встретившаяся в процессе выполнения программы команда INT n.
Первый тип прерываний относится к внешним прерываниям (относительно процессора), остальные два - к внутренним прерываниям, возникающих в самом процессоре при его функционировании.
Таким образом, обобщенная схема источников прерывания в процессорах семейства Х86 может быть изображена в виде, изображенном на рис. V.1.
Рис. V.1. Источники прерываний в процессорах семейства Х86.
Все внешние прерывания относятся к типу аппаратных прерываний, поскольку вызываются запросами от внешних, по отношению к процессору, аппаратных средств системы обработки информации.
Прерывания, определяемые специальными командами выполняемой программы (типа INT n), относятся к программным прерываниям.
Те же внутренние прерывания, которые возникают при появлении аномальных ситуаций при выполнении некоторой команды, получили специальное название «Exceptions» (исключения или особые случаи). Некоторые авторы относят их к типу программных прерываний, однако они от собственно программных прерываний отличаются кардинально, хотя и возникают только при выполнении программ. Назвать же их аппаратными тоже некорректно, хотя они часто возникают при нарушении правил защиты, устанавливаемых при инициализации системы.
Внешние аппаратные прерывания являются основой взаимодействия процессора с периферийными устройствами вычислительной системы (клавиатурой, магнитными и оптическими дисками, системным таймером, принтерами, управляемыми объектами и процессами и т.д.). С их помощью сообщается процессору о готовности принимать или передавать сообщения, об аварийном выключении сети, о возникновении ошибки в запоминающем устройстве или на самой шине и т.п. Реакция процессора на внешнее прерывание заключается в том, что процессор должен, прежде всего, идентифицировать источник прерывания, занести в память (обычно в стек) информацию о состоянии основных регистров процессора на момент прерывания текущей исполняемой программы (так называемый контекст текущей программы), а также адрес возврата после окончания обработки прерывания. После этого процессор передает управление на исполнение подпрограммы обработки данного прерывания, часто называемой обработчиком прерывания (Interrupt handler). В качестве обработчика прерывания, при переключении задач, может служить и новая задача.
При этом реакция процессора на отдельные маскируемые запросы прерываний может быть запрещена программным способом (наложением соответствующей «маски») непосредственно еще в контроллере прерываний, а также и на все маскируемые запросы в целом, путем установки в состояние 1 флага IF (Interrupt Flag) в регистре флагов (EFLAG) самого процессора.
Немаскируемые же внешние прерывания (NMI – Nonmaskable Interrupt), также как и все внутренние прерывания, замаскируемы быть не могут. При этом в процессе обслуживания немаскируемых внешних прерываний флаг IF сбрасывается и, следовательно, процессор не воспринимает другие запросы как маскируемых, так и немаскируемых прерываний до тех пор, пока не будет выполнена команда возврата из прерывания IRET. Отдельные источники немаскируемых запросов прерывания разрешаются и идентифицируются битами порта 061h.
Особые случаи возникают, например, при нарушении защиты по привилегиям, превышении предела сегмента, выходе за границы массива, делении на нуль и т.д. В зависимости от условий возникновения особых случаев их относят к следующим трем разновидностям.
· Fault (нарушение, ошибка, отказ) – к этому классу особых случаев относятся особые случаи, которые процессор обнаруживает до возникновения самой непредвиденной ситуации (например, нарушение правил привилегии по доступу к сегменту (страницы), или превышение предела запрашиваемого сегмента), что обнаруживается уже при анализе дескриптора сегмента. Примером может также служить ситуация, когда запрашиваемый сегмент или страница отсутствует в оперативной памяти компьютера. При таких нарушениях, процессор, после обработки этих особых случаев, может осуществить повторное исполнение виноватой команды (рестарт) и продолжить программу.
· Trap (ловушка) – к ловушкам относятся такие особые случаи, которые обнаруживаются уже после выполнения текущей команды. При этом, продолжение выполнения основной программы, после окончания процедуры обработки, производится, начиная с команды, следующей за командой, которая вызвала данный особый случай. Примерами особых случаев данного типа является выполнение команды деления на нуль, случаи переполнения разрядной сетки или выполнение команды при пошаговом режиме работы. Случаи программных прерываний, а также большинство отладочных контрольных точек также рассматриваются как ловушки.
· Abort (авария, выход из процесса).Под этим особым случаемпонимается, например, такая ошибка в работе программы, при которой теряется целый фрагмент программы и в дальнейшем выполнять ее становится невозможным. Причину возникновения таких особых случаев установить бывает невозможно. Поэтому при авариях рестарт невозможен и выполнение программы всегда прекращается. Обычно такие особые случаи вызываются аппаратными повреждениями, а также несовместимыми или недопустимыми значениями в системных таблицах.
Программные прерывания реализуются специальными командами INT n, которые включаются в программу самим пользователем и, в каком-то смысле, аналогичны командам вызова подпрограмм CALL. Разница между ними заключается только в том, что:
· при использовании команд INT n, обязательно заносится в стек содержимое регистра флагов EFLAGS, и сбрасываются флаги TF и IF;
· команда CALL имеет длину от 3 до 7 байт, в то время как команда INT n – всего двухбайтная. Поэтому во многих случаях она может использоваться с той же целью, но гораздо эффективнее.
При этом особенностью обладает команда INT3, которая, во-первых, является однобайтной, а во-вторых, результатом ее исполнения является останов процесса исполнения программы. Таким образом, включением этой короткой, однобайтной команды в программу, пользователь задает точку останова, которая может использоваться при отладке этой программы.
Как было уже упомянуто, микропроцессоры семейства Х86 способны обрабатывать 256 различных типов прерываний/исключений. Их перечень и основные характеристики, в защищенном режиме работы, приведены в таблице V.1. Первые 32 типа зарезервированы для внутрисистемных целей, остальные предоставлены пользователю для организации связей процессора с периферийными устройствами.
Табл. V.1
Перечень прерываний/исключений защищенного режима
Номер | Описание | Тип |
Ошибка переполнения при делении | Fault | |
Исключение при отладке | Fault/Trap | |
Немаскируемое прерывание (NMI) | Interrupt | |
Однобайтная команда останова (INT 3) | Trap | |
Исключение по переполнению (INTO) | Trap | |
Превышение границы массива (BOUND) | Fault | |
Недопустимый код команды | Fault | |
Сопроцессор FPU недоступен | Fault | |
Двойная ошибка | Abort | |
Нарушение границы сегмента сопроцессором (386/387) | Fault | |
Неразрешенный сегмент состояния задачи TSS | Fault | |
Отсутствие сегмента | Fault | |
Ошибка при обращении к стеку | Fault | |
Нарушение общей защиты | Fault | |
Отсутствие затребованной страницы | Fault | |
Зарезервировано | - | |
Ошибка операции FPU | Fault | |
Ошибка при выравнивании данных (486+) | Fault | |
Машинный контроль (P5+) | Abort | |
Исключение 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.
Прерывания в реальном режиме.
Прерывания в реальном режиме (R-режиме) процессоров семейства Х86 осуществляются, так же как и в процессоре 8086. Сигналы запросов прерывания от внешних устройств поступают на контроллер прерываний, расположенный в современных компьютерах в микросхеме «южного моста» ChipSet на системной плате. Контроллер прерываний осуществляет следующие основные функции:
· позволяет пользователю маскировать отдельные входы запросов прерываний, т.е. блокировать прохождение от них запросов прерывания на вход системы прерываний процессора;
· позволяет пользователю присваивать запросам прерывания уровни приоритета их обслуживания, в соответствии с важностью соответствующих периферийных устройств системы, запрашивающих эти прерывания;
· при одновременном поступлении на контроллер прерывания нескольких запросов прерывания одинакового приоритета, устанавливает последовательность их обслуживания;
· Позволяет пользователю программировать входы запросов прерывания на чувствительность либо к уровню (Level sensitive), либо к фронту (Edge sensitive) сигнала запросов прерывания. Запрос прерывания по уровню сигнала означает, что прием контроллером запроса на прерывание определяется обнаружением заданного уровня сигнала на входе запроса. Поэтому, если после окончания обработки соответствующего прерывания, контроллер обнаружит вновь активный уровень сигнала запроса, то им снова выдается процессору общий запрос прерывания INTR. Запрос же прерывания по фронту сигнала означает, что прием контроллером запроса на прерывание фиксируется только в момент появления фронта сигнала (положительного или отрицательного, по определению). Поэтому повторный запрос по этому входу может быть принят только после появления аналогичного фронта сигнала запроса.
Поступление на контроллер прерываний запросов прерываний и их фиксирование, влечет за собой выдачу контроллером на процессор общего сигнала появления запроса прерывания INTR (Interrupt). Если в этот момент процессору разрешены прерывания (флаг IF=1), процессор выдает на контроллер сигнал подтверждения прерывания INTA (Interrupt Ackowledge), в ответ на который контроллер посылает процессору код типа прерывания запроса прерывания с наивысшим уровнем приоритета. Код типа прерывания (номер прерывания) представляет собой восьмибитный код, определяющий номер вектора запрашиваемого прерывания в таблице векторов прерываний процессора.
Запрос немаскируемого прерывания по входу NMI не требует от источника запроса прерывания последующей посылки кода типа, поскольку ему назначен фиксированный код типа прерывания (тип 2). Фиксированные коды типа прерывания имеют также все возможные особые случаи. Напомним также, что на запросы немаскируемых прерываний, как и на особые случаи, процессор реагирует всегда, независимо от состояния флага прерывания IF.
Код типа прерывания определяет номер вектора прерывания в таблице векторов прерывания, расположенной в ОЗУ в первом килобайте адресного пространства, т.е. начиная от адреса 00000h до 003FFh. Каждый вектор прерывания представляет собой логический адрес, соответствующей подпрограммы обработки прерывания, и поэтому занимает 4 байта в адресном пространстве (2 байта – значение сегментного регистра CS, и 2 байта – смещение в этом сегменте). Таким образом, выбор вектора прерывания из таблицы прерывания – это, по сути, безусловная передача управления на адрес первой команды соответствующей подпрограммы обслуживания прерывания, которая реализуется путем загрузки двух старших байтов вектора прерывания в сегментный регистр CS, а младших двух байтов вектора – в регистр указателя команд IP.
Принцип организации системы прерываний МП семейства Х86 в реальном режиме работы приведен на рис.V.2. Последовательность действий при организации прерывания будет следующая.
· Код типа прерывания из контроллера прерываний, при внешних аппаратных прерываниях, суммируется с 32 (поскольку вектора аппаратных прерываний начинаются с адреса 00080h, т.е. с 32 вектора). Затем умножается на 4 (поскольку каждый вектор занимает четыре байтовые ячейки адресного пространства), и выдается в виде физического адреса на адресную шину процессора, выбирая соответствующий вектор прерывания из оперативной памяти. Выбор вектора прерывания при обработке особых случаев осуществляется аналогично за исключением того, что суммирования с 32 не происходит, поскольку вектора особых случаев располагаются в памяти, начиная с нулевого адреса.
· В стеке запоминаются: содержимое регистра флагов (младшие два байта регистра EFLAGS) и адрес возврата из подпрограммы обработки прерывания, т.е. содержимое сегментного регистра CS и содержимое указателя команд IP.
· Сбрасывается в 0 состояние флага IF, а в регистры CS и IP пересылаются новые значения CS и IP, выбранные из таблицы векторов прерывания.
· По новым значениям CS и IP формируется физический адрес подпрограммы обработки прерывания, соответствующей полученному запросу прерывания, по этому адресу передается управление, и начинается обслуживание данного прерывания.