Мегаобучалка Главная | О нас | Обратная связь


Принципы организации обработчика прерываний



2015-12-06 586 Обсуждений (0)
Принципы организации обработчика прерываний 0.00 из 5.00 0 оценок




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

К замещающим обработчикам, например, относится обработчик INT 23 (Control/Break), который предполагает замену существующего вектора без его сохранения и восстановления.

По-иному реализуется механизм в обработчике, построенном по принципу перехвата вектора прерывания с последующим его возвратом, при этом обработчик сохраняет значение перехваченного оригинального вектора. Большинство макропрограмм клавиатуры относятся к этому типу обработчиков. Они не замещают вектор прерывания INT 09, а перехватывают прерывание и затем уже "решают", будет ли использоваться оригинальный обработчик BIOS. В любом случае после выполнения процедуры обработки прерывания управление будет передано тому обработчику, чей вектор был перехвачен. Подавляющее большинство обработчиков строится именно по такому принципу.

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

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

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

 

Фаза инициализации

Задача этой фазы - обеспечить корректную загрузку обработчика с точки зрения DOS и программ, находящихся в памяти одновременно с обработчиком, привязку обработчика к определенным векторам прерываний и инсталляцию его в качестве резидента. Загрузка обработчика осуществляется таким же образом, как и большинства программ, - при помощи системной функции 4Bh, но в процессе инсталляции резидента могут быть открыты файлы, которые будут закрыты самой операционной системой после выхода из процедуры инициализации. Выход из фазы инициализации заключается в освобождении той части памяти, которая не может быть освобождена операционной системой, и в вызове либо системной функции 31h, либо прерывания DOS INT 27.

Как и функция 31h, прерывание INT 27 относится к подклассу системных программных средств, которые обеспечивают реализацию очень важного режима TSR (Terminate but Stay Resident) - "Закончить, но Остаться Резидентом". Системная функция 31h - более поздняя и более удачная реализация этого режима, чем традиционное прерывание INT 27 в операционной системе DOS. Особенностью этой функции является то, что в результате ее выполнения остается код выхода в резидентный режим, а также возможность оставлять резидентом программу размером более 64 Кбайт.

Прежде чем выйти в систему в качестве резидента, программа для более эффективного распределения памяти должна освободить сегмент памяти, содержащий копию окружения DOS для данного обработчика. При обычном окончании программы этот блок памяти очищается самой операционной системой, но при окончании программы и назначении ее резидентом этого не происходит. Процедура освобождения памяти может быть выполнена путем загрузки регистра ES значением адреса сегмента, содержащегося по смещению 2Ch в PSP (префиксе программного сегмента), и использования функции 49h (освободить распределенную память) системного прерывания INT 21.

Однако, чтобы обработчик имел возможность найти PSP, который часто еще называют PID (идентификатор программы), необходимо в самый начальный момент инициализации сохранить значение DS или ES, которые в процессе выполнения процедуры инициализации могут измениться. Возможно более удачным окажется использование системной функции 62h, которая позволяет получить в регистре BX адрес сегмента PSP активной программы.

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

Ниже приведен пример построения основных конструкций фазы инициализации обработчика:

 

;==============CODE SEGMENT

CODE SEGMENT

;**************EXECUTION START WITH THIS PIECE

ASSUME CS:CODE, DS:CODE, ES:CODE, SS:CODE

; PROGRAM SEGMENT PREFIX COPY

mov ah,62h

int 21h

mov PSPCopy,word ptr [bx+2Ch] ; Сохранить адрес

; сегмента копии

; окружения DOS

jmp short START ; Переход к основной фазе

; инициализации с меткой

; START

. . .

 

;--------FREE MEMORY ALLOCATED TO THE ENVIRONMENT

push es

push bx

mov ah,49h

mov bx,word ptr PSPCopy ; Установить адрес

; сегмента копии

; окружения DOS

mov es,bx

int 21h ; Очистить память

pop bx ; от копии окружения DOS

pop es ; текущей программы

ASSUME ES:CODE

 

. . .

 

;--------TERMINATE PROTECTING MEMORY BELOW START

 

mov dx,offset START ; Установить верхнюю

mov ax,3100h ; границу памяти и

int 21h ; выйти в DOS

CODE ENDS

 

Обычно обработчик, или, как его еще называют, ISR (Interrupt Service Routine), привязывается не только к специфическому вектору прерываний, но и к одному из наиболее часто используемых векторов прерываний: INT 08, 09, 16, 23, 24, 28, 21.

Привязка обработчика к определенному вектору прерывания осуществляется при помощи функций 35h (получить вектор) и 25h (установить вектор). Значение оригинального вектора сохраняется и в фазе выхода из обработки. Оно используется для возвращения управления перехваченному вектору прерываний.

 

;*************INITIALIZATION PIECE

ASSUME CS:CODE,DS:CODE,ES:CODE,SS:CODE

START LABEL NEAR

;-------GET INT 8 VECTOR AND SAVE

push es

mov al,08h

mov ah,35h

int 21h ; Получить вектор 08h

mov offset VectOld,bx ; Сохранить сегмент

mov offset VectOld+2,es ; и смещение вектора

pop es

ASSUME ES:CODE

;-------SET INT 8 VECTOR TO INT 08

mov al,08h

mov ah,25h

mov dx,word ptr NewOff ; Загрузить новые значения

mov ds,word ptr NewSeg ; сегмента и смещения INT 08

int 21h ; Заменить вектор 08h

 

]7.1.5.2. Фаза активизации

Активизация обработки прерываний - это действия МП 80286/80386 по передаче управления программе обработки прерываний.

Таблица 7.31

Прерывания, вызванные
INTR NMI INT n
1. Получить номер вектора n из контроллера прерываний, выполнив два специальных цикла "Распознавание прерываний " . 2. Сохранить регистр флажков в стеке. 3. Сохранить CS в стеке. 4. Сохранить IP в стеке. 5. Сбросить IF. 6. Прочитать вектор прерываний n. Поместить селектор в CS и смещение в IP. 7. Начать выполнение команд во входной точке (CS:IP). 1. Сохранить регистр флажков в стеке. 2. Сохранить CS в стеке. 3. Сохранить IP в стеке. 4. Сбросить IF и запретить NMI. Прочитать вектор прерывания 2. Поместить селектор в CS и смещение в IP. 5. Начать выполнение команд во входной точке (CS:IP). 1. Сохранить регистр флажков в стеке. 2. Сохранить CS в стеке. 3. Сохранить IP в стеке. 4. Прочитать вектор прерывания n. Поместить селектор в CS и смещение в IP. 5. Начать выполнение команд во вход ной точке (CS:IP).

 

При активизации INTR эти действия включают в себя чтение с шины X байта типа прерывания, запоминание состояния текущей программы, чтение соответствующего вектора прерываний и переход по адресу, находящемуся в векторе прерываний. Если запрос на прерывание поступает по входам NMI или INTR, когда прерывания разрешены, его обработка начинается, как только закончится выполнение текущей команды. При появлении команды INT n, обработка прерываний выполняется в этой же команде. В Таблице 7.31 приведена последовательность действий по обработке запроса на прерывание по сигналам INTR, NMI или по команде INT n, выполняемая микропроцессором.

 

Фаза обработки

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

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

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

Чтобы избежать этой конфликтной ситуации, можно воспользоваться недокументированной системной функцией 50h. При этом обработчик еще на стадии инициализации сохраняет свой PID при помощи функции 62h (см. выше). Затем, когда обработчик активизируется, он может использовать функцию 62h, чтобы сохранить PID прерываемой программы (в частности, DOS), и функцию 50h, чтобы отметить себя в качестве активного процесса. Функция 50h DOS заносит в регистр BX адрес сегмента PSP (PID) для указания текущего активного процесса. Перед выходом из обработчика следует вновь воспользоваться функцией 50h, чтобы восстановить PID прерванной программы (DOS).

Чтобы резидентная программа могла определить, можно ли использовать сервис DOS, чтобы открыть (читать)/закрыть файл, следует использовать системную функцию 34h , которая заносит в ES:BX адрес ячейки флажка активности DOS. Когда содержимое этой ячейки равно нулю, резидентная программа не должна пользоваться функциями DOS.

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

Проверяя флажок активности, резидент определяет, когда он может безопасно воспользоваться функциями DOS. Целесообразно использовать этот прием одновременно с перехватом вектора системного прерывания INT 21h. Тогда появляется возможность создать ловушку для системных процедур, имеющих слишком большую длительность выполнения и ориентированных на медленные устройства ввода-вывода (например, функция 0Ah - Ввод строки в буфер), что позволит выполнять процедуры обработчика в "окнах" ожидания ответа устройства.

Следует отметить, что функция 34h относится к недокументированным функциям DOS и, если это вызывает опасения, можно построить процедуру диспетчирования только на основе перехвата системного прерывания, что, конечно же, усложнит процедуру обработки.

 



2015-12-06 586 Обсуждений (0)
Принципы организации обработчика прерываний 0.00 из 5.00 0 оценок









Обсуждение в статье: Принципы организации обработчика прерываний

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

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



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (586)

Почему 1285321 студент выбрали МегаОбучалку...

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

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.007 сек.)