Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






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






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

Система прерываний процессоров Intel – это векторная приоритетная система прерываний.

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

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

Кроме того, процессоры должны обеспечивать возможность возобновления " нормальной" работы системы после обработки прерывания.

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

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

- внешние сигналы (запросы от внешних устройств);

- аномальная ситуация, сложившаяся при выполнении конкретной команды и препятствующая нормальному продолжению программы;

- выполнение специальной команды прерывания INT.

Каждому уровню прерываний соответствует свой вектор прерываний (свой номер).

Прерывания, вызванные событиями из первой группы, называют внешними аппаратными прерываниями. Вторая группа прерываний – внутренние прерывания процессора. Третья группа – программные прерывания.

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

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

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

 

┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┐

│ IMR │ Сигнал прерывания

└ ─ ─ ─ ─ ─ ─ ┬ ─ ─ ─ ─ ─ ─ ┘ процессора

│ ┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ >

┌ ─ ─ ─ ─ ─ ─ ─ ┐ ┌ ─ ─ ┴ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┴ ─ ─ ┐ ┌ ─ ─ ─ ─ ─ ─ ─ ┐

─ ─ ─ ─ ─ ─ │ ├ ─ ─ ─ ─ │ Блок ├ ─ ─ ─ ─ │ │

─ ─ ─ ─ ─ ─ │ ├ ─ ─ ─ ─ │ ├ ─ ─ ─ ─ │ │

─ ─ ─ ─ ─ ─ │ ├ ─ ─ ─ ─ │ разрешения ├ ─ ─ ─ ─ │ │

─ ─ ─ ─ ─ ─ │ IRR ├ ─ ─ ─ ─ │ ├ ─ ─ ─ ─ │ ISR │

─ ─ ─ ─ ─ ─ │ ├ ─ ─ ─ ─ │ приоритетов ├ ─ ─ ─ ─ │ │

─ ─ ─ ─ ─ ─ │ ├ ─ ─ ─ ─ │ ├ ─ ─ ─ ─ │ │

─ ─ ─ ─ ─ ─ │ ├ ─ ─ ─ ─ │ PR ├ ─ ─ ─ ─ │ │

─ ─ ─ ─ ─ ─ │ ├ ─ ─ ─ ─ │ ├ ─ ─ ─ ─ │ │

__ └ ─ ─ ─ ─ ─ ─ ─ ┘ └ ─ ─ ─ ─ ─ ─ ─ ┬ ─ ┬ ─ ┬ ─ ─ ─ ─ ┘ └ ─ ─ ─ ─ ─ ─ ─ ┘

WR │ │ │

─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┐ │ │ │

│ │ │ │

┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┐

│ IRQ0 │

├ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┤

DATA 0-7 │ IRQ1 │ DATA 0-7

═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ > ├ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┤ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ >

│........... │

├ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┤

│ IRQ7 │

└ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┘

VR

Рис. 5.9. Структурная схема контроллера прерываний

Контроллер содержит пять основных блоков:

- регистр запросов прерываний IRR;

- схема управления и разрешения приоритетов PR;

- служебный регистр ISR;

- регистр маски IMR;

- блок программируемых векторов VR.

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

Блок разрешения приоритетов PR реализует схему определения приоритетов запросов (шифрацию приоритетов) по содержимому регистра IRR, передавая полученный трехразрядный код источника прерывания с наивысшим приоритетом на вход регистра векторов VR. А в регистре ISR для прерывания с высшим приоритетом помечается соответствующий разряд.

Регистр IMR используется совместно с регистром IRR и хранит код, по которому маскируются сигналы на определенных линиях запросов прерываний, передаваемых с регистра IRR. Замаскированные сигналы не участвуют в шифрации приоритетов блоком PR. Для маскирования определенных аппаратных прерываний следует сформировать последовательность из 8 битов, где в позициях, соответствующих маскируемым прерываниям, устанавливаются 1, и послать этот байт в порт, соответствующий регистру маски прерываний, что может быть выполнено с помощью следующей последовательности команд:

 

IN AL, int_mask_port; прочитать установленное в IMR

; значение через порт int_mask_port

OR AL, new_mask; new_mask содержит 1 в разрядах,

; соответствующих маскируемым прерываниям

OUT int_mask_port, AL; установили новое значение IMR

 

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

Номера предварительно запрограммированных векторов прерываний записываются в набор векторных регистров VR, где для каждой линии запроса прерывания определен свой векторный регистр. В соответствии с кодом источника, поступившего от PR, при подтверждении прерывания по сигналу WR (Писать/Читать) номер вектора (значение от 0 до 255), соответствующий выбранному для обслуживания прерыванию, выставляется на шину данных DATA для передачи по линиям 0-7.

В ВС на базе процессоров Intel используются различные типы контроллеров прерываний (микросхемы 8259, 8259A, 82C59A, 82380). Контроллер 82380 является интегрированным системным периферийным устройством, объединяющим функции контроллеров прямого доступа к памяти, прерываний и других устройств. В частности, в нем объединены функции трех контроллеров типа 82(C)59A. Функционально он идентичен своим предшественникам, за исключением программирования векторов прерываний: здесь имеются более широкие возможности по использованию механизма прерываний, так как каждый вход запроса прерываний может отдельно программироваться: каждому запросу прерываний может быть предписан свой собственный вектор прерывания, кроме того, системные программы по умолчанию могут присвоить определенный вектор контроллеру прерываний с целью предупреждения прерываний, вызванных ошибочным запросом. Записываемое в регистр VR значение вектора поступает также по младшим линиям шины данных и фиксируется при поступлении соответствующего управляющего сигнала. Микросхемы его предшественников позволяют ставить в соответствие источникам прерываний только векторы с последовательно идущими номерами, например, процедура

 

set_int_num PROC

; Перепрограммирование контроллера прерываний 8259A.

; На входе: DX – порт управления контроллером прерываний;

; AH – начальный номер прерывания, соответствующий IQR0

MOV AL, 11

OUT DX, AL

JMP SHORT $+2; задержка для передачи информации через порт

INC DX

MOV AL, AH

OUT DX, AL

JMP SHORT $+2; задержка для передачи информации через порт

MOV AL, 4

OUT DX, AL

JMP SHORT $+2; задержка для передачи информации через порт

MOV AL, 1

OUT DX, AL

JMP SHORT $+2; задержка для передачи информации через порт

MOV AL, 0FFh

OUT DX, AL

DEC DX

RET

set_int_num ENDP

 

назначает прерываниям IQR0-IQR7 последовательные векторы с номерами от первого номера, определяемого содержимым регистра AH на входе процедуры. Однако 82380 распознает попытки его перепрограммирования по методу контроллера 82C59A, что гарантирует совместимость для существующих программных продуктов.

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

ПК типа IBM PC/AT имеют два контроллера прерываний, которым приписаны векторы IQR0-IQR7 и IQR8-IQR15. Для управления ими используются порты 20h-3Fh и 0A0h-0BFh соответственно. А регистрам масок этих контроллеров соответствуют порты 21h и 0A1h.

Доступ к процедурам обработки прерываний в реальном режиме процессоров Intel происходит через таблицу векторов прерываний, содержащую полные указатели точек входа в обработчики прерываний (в данном случае вектор-код ассоциируется с элементом таблицы, который также называют вектором). Эта таблица состоит из 256 четырехбайтовых элементов (каждому номеру соответствует свой элемент), начинается с нулевого физического адреса оперативной памяти. Каждый элемент с номером n таблицы представляет собой полный указатель точки входа обработчика прерывания с кодом n. Структура таблицы векторов прерываний показана на рис.5.10.

 

31 15 0

00000h ┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┬ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┐

│ Сегмент │ Смещение │

00004h ├ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┼ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┤

│ Сегмент │ Смещение │

00008h ├ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┼ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┤

│ Сегмент │ Смещение │

0000Ch ├ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┼ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┤

..............

003F8h ├ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┼ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┤

│ Сегмент │ Смещение │

003FCh ├ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┼ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┤

│ Сегмент │ Смещение │

└ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┴ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┘

Рис.5.10. Таблица векторов прерываний

При работе с таблицей следует учитывать, что в первом слове двойного слова, занимаемого полным указателем, находится смещение, а сегмент занимает старшее слово, так как данные хранятся в " перевернутом" виде. Причем векторы прерываний 0-31 зарезервированы фирмой Intel. Таблица векторов прерываний размещается в младших адресах памяти, занимая 256*4 байт памяти.

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

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

При распознавании активного сигнала (высокий уровень) на входе INTR (если прерывания разрешены – IF=1) процессор выполняет в реальном режиме следующие действия:

- вводит номер n от программируемого контроллера прерываний (снимает с шины данных значение, передаваемое по линиям 0-7) (1);

- сохраняет в стеке содержимое регистра флагов FLAGS (2);

- включает в стек содержимое пары регистров CS: IP (3, 4);

- сбрасывает в 0 флажок прерываний IF, запрещая восприятие последующих внешних прерываний до явной установки в 1 флага IF с помощью команды STI (5);

- по номеру n обращается к n-му элементу таблицы векторов, выбирая полный указатель программы-обработчика прерывания; при этом сегмент передается в регистр CS, а смещение – в регистр IP (6);

- начинает выполнение обработчика прерываний с точки входа, помещенной в пару регистров CS: IP (7).

Сохраненное в стеке перед началом обработки прерывания содержимое регистров CS: IP образует адрес возврата. Поэтому все обработчики прерываний должны заканчиваться командой IRET – возврат из прерывания, которая возвращает управление прерванной программе, выбрав информацию (CS: IP и FLAG), помещенную в стек.

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

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

Внутренние прерывания процессора – это прерывания, возникающие при невозможности выполнить очередную команду. Такое событие еще называют исключительной ситуацией или особым случаем, исключением (exception) (иногда эти термины используют только для обозначения прерываний, связанных с невозможностью выполнения текущей работы процессора в защищенном режиме). Таким образом, прерывания данного типа генерируются определенными событиями, возникающими в процессе выполнения активной программы, например, деление на ноль, нарушение зашиты и т.п. Закрепление за такими событиями определенных номеров прерываний зашито в процессоре и не может быть изменено. Для особых случаев назначены фиксированные номера от 0 до 31. Эти прерывания связаны с выполнением команд активной программы, однако, как и внешние аппаратные прерывания, предвидеть такие особые случаи практически невозможно.

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

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

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

инициализации прерывания состоит в следующем:

- запретить все прерывания (команда CLI), чтоб их обработка не нарушила процедуру модификации вектора перехватываемого прерывания (изменения сегмента и смещения в таблице векторов должны быть неделимы);

- инициализировать нужный вектор в таблице векторов прерываний (записать в соответствующий элемент таблицы адрес процедуры обработки прерывания, разработанной пользователем); это можно сделать прямой пересылкой адреса или с помощью функции 25h диспетчера функций DOS (прерывание INT 21h);

- разрешить прерывания (команда STI).

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

- сохранить системный контекст (регистры, флаги);

- заблокировать прерывания, которые могут привести к конфликту при выполнении данной программы обработки прерываний;

- разрешить прерывания, которые " полезны" для выполнения данной процедуры и могут быть в нее " вложены";

- определить источник и причину прерывания, если это необходимо (например, проанализировав код ошибки в регистре);

- выполнить обработку прерывания;

- восстановить системный контекст;

- разрешить запрещенные в начале программы прерывания;

- возобновить нормальную работу.

В защищенном режиме доступ к процедурам обработки прерываний осуществляется через таблицу IDT, структура которой аналогична структуре GDT и LDT. ЕЕ базовый адрес и предел помещаются на регистр IDTR, таким образом, она может размещаться по любому адресу памяти. Элементами этой таблицы могут быть шлюзы задач, ловушек и прерываний.






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.