Прерывание (англ. interrupt ) — сигнал от программного или аппаратного обеспечения, сообщающий процессору о наступлении какого-либо события, требующего немедленного внимания. Прерывание извещает процессор о наступлении высокоприоритетного события, требующего прерывания текущего кода, выполняемого процессором. Процессор отвечает приостановкой своей текущей активности, сохраняя свое состояние и выполняя функцию, называемую обработчиком прерывания (или программой обработки прерывания), которая реагирует на событие и обслуживает его, после чего возвращает управление в прерванный код. [1]
В зависимости от источника возникновения сигнала прерывания делятся на:
- асинхронные, или внешние (аппаратные) — события, которые исходят от внешних аппаратных устройств (например, периферийных устройств) и могут произойти в любой произвольный момент: сигнал от таймера, сетевой карты или дискового накопителя, нажатие клавиш клавиатуры, движение мыши. Факт возникновения в системе такого прерывания трактуется как запрос на прерывание (англ. Interrupt request, IRQ ) — устройства сообщают, что они требуют внимания со стороны ОС;
- синхронные, или внутренние — события в самом процессоре как результат нарушения каких-то условий при исполнении машинного кода: деление на ноль или переполнение стека, обращение к недопустимым адресам памяти или недопустимый код операции;
- программные (частный случай внутреннего прерывания) — инициируются исполнением специальной инструкции в коде программы. Программные прерывания, как правило, используются для обращения к функциям встроенного программного обеспечения (firmware), драйверов и операционной системы.
Термин «ловушка» (англ. trap ) иногда используется как синоним термина «прерывание» или «внутреннее прерывание». Как правило, словоупотребление устанавливается в документации производителя конкретной архитектуры процессора.
Содержание
Содержание
Маскирование [ править | править код ]
Внешние прерывания, в зависимости от возможности запрета, делятся на:
- маскируемые — прерывания, которые можно запрещать установкой соответствующих битов в регистре маскирования прерываний (в x86-процессорах — сбросом флага IF в регистре флагов);
- немаскируемые (англ. Non-maskable interrupt, NMI ) — обрабатываются всегда, независимо от запретов на другие прерывания. К примеру, такое прерывание может быть вызвано сбоем в микросхеме памяти.
Обработчики прерываний обычно пишутся таким образом, чтобы время их обработки было как можно меньшим, поскольку во время их работы не могут обрабатываться другие прерывания, а если их будет много (особенно от одного источника), то они могут теряться. В Windows для этого применяется механизм отложенного вызова процедур.
Приоритезация [ править | править код ]
До окончания обработки прерывания обычно устанавливается запрет на обработку этого типа прерывания, чтобы процессор не входил в цикл обработки одного прерывания. Приоритезация означает, что все источники прерываний делятся на классы и каждому классу назначается свой уровень приоритета запроса на прерывание.
- Относительное обслуживание прерываний означает, что если во время обработки прерывания поступает более приоритетное прерывание, то это прерывание будет обработано только после завершения текущей процедуры обработки прерывания.
- Абсолютное обслуживание прерываний означает, что если во время обработки прерывания поступает более приоритетное прерывание, то текущая процедура обработки прерывания вытесняется, и процессор начинает выполнять обработку вновь поступившего более приоритетного прерывания. После завершения этой процедуры процессор возвращается к выполнению вытесненной процедуры обработки прерывания.
Таблица прерываний [ править | править код ]
Вектор прерывания — закреплённый за устройством номер, который идентифицирует соответствующий обработчик прерываний. Векторы прерываний объединяются в таблицу векторов прерываний, содержащую адреса обработчиков прерываний. Местоположение таблицы зависит от типа и режима работы процессора.
Программное прерывание [ править | править код ]
Программное прерывание — синхронное прерывание, которое может осуществить программа с помощью специальной инструкции.
В процессорах архитектуры x86 для явного вызова синхронного прерывания имеется инструкция Int , аргументом которой является номер прерывания (от 0 до 255). В IBM PC-совместимых компьютерах обработку некоторых прерываний осуществляют подпрограммы BIOS, хранящиеся в ПЗУ, и прерывание служит интерфейсом для доступа к сервису, предоставляемому BIOS. Также обслуживание прерываний могут взять на себя BIOS карт расширений (например, сетевых или видеокарт), операционная система и даже обычные (прикладные) программы, которые постоянно находятся в памяти во время работы других программ (т. н. резидентные программы). В отличие от реального режима, в защищённом режиме x86-процессоров обычные программы не могут обслуживать прерывания, эта функция доступна только системному коду (операционной системе).
MS-DOS использует для взаимодействия со своими модулями и прикладными программами прерывания с номерами от 20h до 3Fh (числа даны в шестнадцатеричной системе счисления, как это принято при программировании на языке ассемблера x86). Например, доступ к основному множеству функций MS-DOS осуществляется исполнением инструкции Int 21h (при этом номер функции и её аргументы передаются в регистрах). Это распределение номеров прерываний не закреплено аппаратно и другие программы могут устанавливать свои обработчики прерываний вместо или поверх уже имеющихся обработчиков, установленных MS-DOS или другими программами, что, как правило, используется для изменения функциональности или расширения списка системных функций. Также этой возможностью пользуются вирусы.
Читайте также:
- Арифметические команды
- Арифметические команды
- АТ-команды
- Блок прерываний микроконтроллера MCS-51
- В. Привлечение команды внешних консультантов
- ГРУППЫ – «КОМАНДЫ» ЛИДЕРА
- Для получения листинга программы введите команды
- Если же такая нежелательная команда уже была допущена до подсознания, то ее надо нейтрализовать сознательной отменой команды.
- Идентификация прерываний
- Какой тип управленческой команды есть, должен быть в вашей организации?
- Клавиатурные команды
- Клавиатурные команды
Ещё один из способов изменения порядка выполнения программы заключается в использовании в программе прерываний.
Прерывания — это инициируемый определенным образом процесс, временно переключающий микропроцессор на выполнение другой программы с последующим возобновлением прерванной программы.
Прерывания используются, прежде всего, для увеличения эффективности, работы микропроцессора, а также в качестве удобного средства, обеспечивающего доступ к аппаратному оборудованию и утилитным программам, контролируемым операционной системой.
Прерывания дают возможность операциям ввода-вывода от микропроцессора, т.е. когда устройство ввода-вывода требует обслуживания со стороны микропроцессора, оно сообщает об этом микропроцессору формированием соответствующего запроса (сигнала), по которому может быть прервано выполнение текущей программы.
Прерывания могут быть внешними (аппаратными) и внутренними.
Внешние или аппаратные прерывания в свою очередь делятся на немаскируемые и маскируемые.
Немаскируемые — обрабатываются микропроцессором независимо от состояния флага прерывания IF. К ним относятся прерывания, приходящие по линии NMI, сигнализирующие о каких-то неординарных (катастрофических) событиях в системе.
Маскируемые — предназначены для фиксации запросов от различных периферийных устройств (например, клавиатуры) — вход INTR.
Внутренние прерывания также делятся на две группы: программные прерывания и прерывания в особой ситуации (или исключения), которые возникают при ненормальном внутреннем состоянии микропроцессора, возникшем при обработке некоторой команды программы (например, прерывание из-за ошибки при делении, если возникает условие деления на нуль), или при попытке выполнить несуществующую команду.
Программные прерывания — это планируемые прерывания, так как с их помощью программист обращается в нужное для него время за обслуживанием своих запросов к операционной системе или к 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.
Например, вывод на экран строки текста можно осуществить функцией 09H, которая требует, чтобы в регистрах DS:DX содержался полный адрес выводимой строки. (Регистр DS-начальный адрес сегмента данных, а в регистр DX-заносится относительный адрес строки). Длина выводимой строки не указывается, так как функция 09H DOS выводит на экран строку от указанного адреса до символа доллара $.
Для завершения программы используется функция DOS с номером 4CH. Эта функция предполагает, что в регистре AL находится код завершения программы, который она передает DOS. Если программа завершилась успешно, код завершения должен быть равен 0, поэтому мы в одном предложении MOV AX, 4C00H загружаем в AH 4CH, а в Al — 0 и вызываем DOS командой INT 21H.
6.6 Команды ввода/вывода
Любые микропроцессорные системы должны иметь в системе своих команд команды вода/вывода с внешних устройств. Для данного семейства таких команд две – ввод из внешнего порта – IN и вывод во внешний порт – OUT.
Формат команд: — IN ,
Здесь первый операнд, в который записывается или откуда считывается соответственно вводимое или выводимое значение – это регистр-аккумулятор – AL или AX. Адрес порта, в который вводится или откуда считывается значение, является вторым операндом и в данной команде им может быть или 8-ми разрядная константа, или содержимое регистра DX. Следует помнить, что в первом случае команды можно адресовать только такие порты ввода/вывода, адрес которых находится в пределах от 0 до 256, при этом старшие биты адреса устанавливаются в 0. Во втором случае, при использовании регистра DX, можно адресовать порты ввода/вывода во всём адресном пространстве таких устройств.
Эти команды не изменяют состояния флагов микропроцессора.
Дата добавления: 2014-11-09 ; Просмотров: 1944 ; Нарушение авторских прав? ;
Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет
Прерывания и особые случаи
Прерывание — это изменение естественного порядка выполнения программы, которое связано с необходимостью реакции системы на работу внешних устройств, а также на ошибки и особые ситуации, возникшие при выполнении программы. При этом вызывается специальная программа — обработчик прерываний, специфическая для каждой возникшей ситуации, после выполнения которой возобновляется работа прерванной программы.
Механизм прерывания обеспечивается соответствующими аппаратно-программными средствами компьютера.
Классификация прерываний представлена на рис. 7.1.
Запросы аппаратных прерываний возникают асинхронно по отношению к работе микропроцессора и связаны с работой внешних устройств.
Запрос от немаскируемых прерываний поступает на вход NMI микропроцессора и не может быть программно заблокирован. Обычно этот вход используется для запросов прерываний от схем контроля питания или неустранимых ошибок ввода/вывода.
Для запросов маскируемых прерываний используется вход INT микропроцессора. Обработка запроса прерывания по данному входу может быть заблокирована сбросом бита IF в регистре флагов микропроцессора.
Программные прерывания, строго говоря, называются исключениями или особыми случаями. Они связаны с особыми ситуациями, возникающими при выполнении программы (отсутствие страницы в оперативной памяти, нарушение защиты, переполнение ), то есть с теми ситуациями, которые программист предвидеть не может, либо с наличием в программе специальной команды INT n, которая используется программистом для вызова функций операционной системы либо BIOS , поддерживающих работу с внешними устройствами. В дальнейшем при обсуждении работы системы прерываний мы будем употреблять единый термин " прерывание " для аппаратных прерываний и исключений, если это не оговорено особо.
Программные прерывания делятся на следующие типы.
Нарушение (отказ) — особый случай, который микропроцессор может обнаружить до возникновения фактической ошибки (например, отсутствие страницы в оперативной памяти); после обработки нарушения программа выполняется с рестарта команды, приведшей к нарушению.
Ловушка — особый случай, который обнаруживается после окончания выполнения команды (например, наличие в программе команды INT n или установленный флаг TF в регистре флагов ). После обработки этого прерывания выполнение программы продолжается со следующей команды.
Авария ( выход из процесса) — столь серьезная ошибка, что некоторый контекст программы теряется и ее продолжение невозможно. Причину аварии установить нельзя, поэтому программа снимается с обработки. К авариям относятся аппаратные ошибки, а также несовместимые или недопустимые значения в системных таблицах.
Порядок обработки прерываний
Прерывания и особые случаи распознаются на границах команд, и программист может не заботиться о состоянии внутренних рабочих регистров и устройств конвейера.
Реагируя на запросы прерываний, микропроцессор должен идентифицировать его источник, сохранить минимальный контекст текущей программы и переключиться на специальную программу — обработчик прерывания. После обслуживания прерывания МП возвращается к прерванной программе, и она должна возобновиться так, как будто прерывания не было.
Обработка запросов прерываний состоит из:
- "рефлекторных" действий процессора, которые одинаковы для всех прерываний и особых случаев и которыми программист управлять не может;
- выполнения созданного программистом обработчика.
Для того чтобы микропроцессор мог идентифицировать источник прерывания и найти обработчик, соответствующий полученному запросу, каждому запросу прерывания присвоен свой номер ( тип прерывания ).
Тип прерывания для программных прерываний вводится изнутри микропроцессора; например, прерывание по отсутствию страницы в памяти имеет тип 14. Для прерываний, вызываемых командой INT n, тип содержится в самой команде. Для маскируемых аппаратных прерываний тип вводится из контроллера приоритетных прерываний по шине данных . Немаскируемому прерыванию назначен тип 2.
Всего микропроцессор различает 256 типов прерываний. Таким образом, все они могут быть закодированы в 1 байте.
"Рефлекторные" действия микропроцессора по обработке запроса прерывания выполняются аппаратными средствами МП и включают в себя:
- определение типа прерывания ;
- сохранение контекста прерываемой программы (некоторой информации, которая позволит вернуться к прерванной программе и продолжить ее выполнение). Всегда автоматически сохраняются как минимум регистры EIP и CS , определяющие точку возврата в прерванную программу, и регистр флагов EFLAGS . Если вызов обработчика прерывания проводится с использованием шлюза задачи, то в памяти полностью сохраняется сегмент состояния TSS прерываемой задачи;
- определение адреса обработчика прерывания и передача управления первой команде этого обработчика.
После этого выполняется программа — обработчик прерывания, соответствующая поступившему запросу. Эта программа пишется и размещается в памяти прикладным или системным программистом. Обработчик прерывания должен завершаться командой I RET , по которой автоматически происходит переход к продолжению выполнения прерванной программы с восстановлением ее контекста.
Для вызова обработчика прерывания микропроцессор при работе в реальном режиме использует таблицу векторов прерываний, а в защищенном режиме — таблицу дескрипторов прерываний.
Таблица векторов прерываний (рис. 7.2) располагается в самых младших адресах оперативной памяти, имеет объем 1 Кбайт и содержит 4байтные элементы ( векторы прерываний ) для 256 обработчиков прерываний. Старшие 2 байта вектора загружаются в сегментный регистр команд CS , а младшие 2 байта — в регистр указателя команд IP . Обращение к элементам таблицы осуществляется по 8-разрядному коду — типу прерывания. Так как таблица всегда имеет нулевой начальный адрес и длину вектора в 4 байта, чтобы определить адрес вектора для прерывания типа i, достаточно просто умножить это значение на 4.
В защищенном режиме для вызова обработчика прерывания используется таблица дескрипторов прерываний IDT . Элементами таблицы являются 8-байтные дескрипторы типа шлюз -пециальные программные структуры, через которые происходит передача управления обработчику.
Обращение к IDT аналогично обращению к глобальной таблице дескрипторов, где вместо системного регистра GDT R используется регистр IDTR , который определяет размер и базовый адрес таблицы в памяти.
Физический адрес дескриптора шлюза, находящегося в IDT , определяется как сумма базового адреса таблицы и умноженного на 8 типа прерывания (рис. 7.3).
Содержимое регистра IDTr не сохраняется в сегментах TSS и не изменяется при переключении задачи. Программы не могут обратиться к IDT , так как единственный бит TI индикатора таблицы в селекторе сегмента обеспечивает выбор только между таблицами GDT и LDT .
Максимальный предел таблицы дескрипторов прерываний составляет 256*8 — 1 = 2047.
Можно определить предел меньшим, но это не рекомендуется. Если происходит обращение к дескриптору вне пределов IDT , процессор переходит в режим отключения до получения сигнала по входу NMI или сброса.
В IDT могут храниться только дескрипторы следующих типов:
- шлюз ловушки ,
- шлюз прерывания, шлюз задачи.
Шлюзы ловушки и прерывания сходны со шлюзом вызова, только в них отсутствует поле счетчика WC (рис. 7.4). Так как прерывание является неожиданным событием и не связано с текущей программой, говорить о передаче параметров их обработчику не приходится.
Бит S = 0 в байте доступа определяет этот дескриптор как системный объект . Если поле ТИП в байте доступа равно 1110, то это шлюз прерывания, если 1111 — то шлюз ловушки.
Поле уровня привилегий дескриптора DPL , как правило, устанавливается равным 3 с тем, чтобы к обработчику прерываний могли обращаться программы с любого уровня привилегий.
Бит присутствия P может быть равен как 0, так и 1.
При входе в обработчик через шлюз прерывания в регистре флагов сбрасывается бит разрешения прерываний IF . В этом случае микропроцессор блокирует все маскируемые аппаратные прерывания. Поэтому в обработчике прерываний этот бит должен быть установлен в 1 как можно раньше с тем, чтобы не блокировать работу программ, которые вызываются, например, при обработке прерываний от системного таймера .
При входе в обработчик через шлюз ловушки флаг IF не меняется.
Вызов обработчика через шлюз ловушки , а не шлюз прерывания, чаще реализуют при обработке исключений , так как на период обслуживания прерывания нежелательно выключать механизм разделения времени, использующий прерывания таймера.
Вызов обработчика через шлюз задачи обычно осуществляется при обработке аппаратных прерываний, так как такая обработка не связана с текущей выполняемой задачей. При этом возможен механизм вложенных прерываний, если прерывания в задаче разрешены. Вызов обработчика прерывания через шлюз задачи осуществляется и при обработке исключений , например, "неразрешенный TSS ", когда поврежденная задача не может вызвать процедуру прерывания. Переключение задач требует примерно в 5 раз больше времени, чем вызов процедуры. Поэтому, если приоритет запроса высок, а программа обслуживания короткая, ее оформляют в виде процедуры.