МИНОБРНАУКИ РОССИИ САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ ЭЛЕКТРОТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ «ЛЭТИ» ИМ. В.И. УЛЬЯНОВА (ЛЕНИНА)
Кафедра математического обеспечения и применения ЭВМ
ОТЧЕТ По лабораторной работе № 5
по дисциплине «Операционные системы» Тема: Сопряжение стандартного и пользовательского обработчиков
прерываний
Студент гр. 0303 |
|
Болкунов В.О. |
|
Преподаватель |
|
|
Губкин А. Ф. |
Санкт-Петербург
2022
Цель работы.
Исследование возможности встраивания пользовательского обработчика прерываний в стандартный обработчик от клавиатуры. Пользовательский обработчик прерывания получает управление по прерыванию (int 09h) при нажатии клавиши на клавиатуре. Он обрабатывает скан-код и осуществляет определенные действия, если скан-код совпадает с определенными кодами,
которые он должен обрабатывать. Если скан-код не совпадает с этими кодами,
то управление передается стандартному прерыванию.
Порядок выполнения работы.
Шаг 1. Для выполнения лабораторной работы необходимо написать и отладить программный модуль типа .ЕХЕ, который выполняет такие же функции, как в программе ЛР 4, а именно:
1) Проверяет, установлено ли пользовательское прерывание с вектором
09h.
2) Если прерывание не установлено то, устанавливает резидентную функцию для обработки прерывания и настраивает вектор прерываний. Адрес точки входа в стандартный обработчик прерывания находится в теле пользовательского обработчика. Осуществляется выход по функции 4Сh
прерывания int 21h.
3) Если прерывание установлено, то выводится соответствующее сообщение и осуществляется выход по функции 4Сh прерывания int 21h.
Выгрузка прерывания по соответствующему значению параметра в командной строке /un. Выгрузка прерывания состоит в восстановлении стандартного вектора прерываний и освобождении памяти, занимаемой резидентом. Затем осуществляется выход по функции 4Сh прерывания int 21h.
Для того чтобы проверить установку прерывания, можно поступить следующим образом. Прочитать адрес, записанный в векторе прерывания.
Предположим, что этот адрес указывает на точку входа в установленный
2
резидент. На определенном, известном смещении в теле резидента располагается сигнатура, некоторый код, который идентифицирует резидент.
Сравнив известное значение сигнатуры с реальным кодом, находящимся в резиденте, можно определить, установлен ли резидент. Если значения совпадают, то резидент установлен. Длину кода сигнатуры должна быть достаточной, чтобы сделать случайное совпадение маловероятным. Программа должна содержать код устанавливаемого прерывания в виде удаленной процедуры. Этот код будет работать после установки при возникновении прерывания. Он должен выполнять следующие функции:
1)Сохранить значения регистров в стеке при входе и восстановить их при
выходе.
2)При выполнении тела процедуры анализируется скан-код.
3)Если этот код совпадает с одним из заданных, то требуемый код записывается в буфер клавиатуры.
4)Если этот код не совпадает ни с одним из заданных, то осуществляется передача управления стандартному обработчику прерывания.
Шаг 2. Запустите отлаженную программу и убедитесь, что резидентный обработчик прерывания 09h установлен. Работа прерывания проверяется введением различных символов, обрабатываемых установленным обработчиком и стандартным обработчиком.
Шаг 3. Также необходимо проверить размещение прерывания в памяти.
Для этого запустите программу ЛР 3, которая отображает карту памяти в виде списка блоков МСВ. Полученные результаты поместите в отчет.
Шаг 4. Запустите отлаженную программу еще раз и убедитесь, что программа определяет установленный обработчик прерываний. Полученные результаты поместите в отчет.
3
Шаг 5. Запустите отлаженную программу с ключом выгрузки и убедитесь, что резидентный обработчик прерывания выгружен, то есть
сообщения на экран не выводятся, а память, занятая резидентом освобождена.
Для этого также следует запустить программу ЛР 3. Полученные результаты
поместите в отчет.
Шаг 6. Ответьте на контрольные вопросы.
Выполнение работы.
Использованная память (данные):
Символы перевода строки
• endl db 13, 10, '$'
Строки с информацией о работе программы
•loadInfo db "Interrupt handler has been loaded$"
•unloadInfo db "Interrupt handler has been unloaded$"
•loadedInfo db "Interrupt handler is already loaded$"
•unloadedInfo db "Interrupt handler is not loaded$"
Флаг сравнения прерываний (текущего с загружаемым)
• intEqual db 0
Переменные обработчика прерывания:
Идентификатор обработчика (для сравнения с другими):
• intID dw 0ABCDh
Адрес PSP блока программы которая поставила обработчик (нужно для освобождения памяти):
• handlerPsp dw 0
Сегмент предыдущего обработчика:
• prevHandlerSeg dw 0
Смещение предыдущего обработчика
4
• prevHandlerOffset dw 0
Скан-код требуемой клавиши (в данном случае ‘Q’)
• reqKey db 16
Флаг нажатия нужной клавиши
• keyPressed db 0
Строка с информацией о нажатии
• pressedInfo db "Key <Q> has been pressed"
Счётчик нажатий
• pressCounter dw 0
Смещение счётчика в строке вывода
• numOffset dw 25
Размер строки с информацией
• strSize dw 24
Копии регистров для восстановления при выходе из прерывания:
•keepAx dw 0
•keepSp dw 0
•keepSS dw 0
Стек обработчика:
•intStack dw 100h dup(0)
•stackEnd dw 0
Макроопределения: |
|
|
• |
print _str_ |
- вывод строки на экран |
• |
printl _str_ |
- вывод строки на экран с переводом строки |
• |
printChar _chr_ |
- вывод одного символа на экран |
Функции и процедуры:
Перевод двухбайтового числа в символы 10ичной с/с
• wordToDecStr proc near _num: word, _buff: word
5