MetodUkОС. Методические указания к лабораторным работам по дисциплине "Операционные системы " СанктПетербург 2011 введение
Скачать 289.53 Kb.
|
Порядок выполнения работы Шаг 1. Для выполнения лабораторной работы необходимо написать и отладить программный модуль типа .COM, который выбирает и распечатывает следующую информацию: 1) Количество доступной памяти. 2) Размер расширенной памяти. 3) Выводит цепочку блоков управления памятью. Адреса при выводе представляются шестнадцатеричными числами. Объем памяти функциями управления памятью выводится в параграфах. Необходимо преобразовать его в байты и выводить в виде десятичных чисел. Последние восемь байт МСВ выводятся как символы, не следует преобразовывать их в шестнадцатеричные числа. Запустите программу и внимательно оцените результаты. Сохраните результаты, полученные программой, и включите их в отчет в виде скриншота. Шаг 2. Измените программу таким образом, чтобы она освобождала память, которую она не занимает. Для этого используйте функцию 4Аh прерывания 21h (пример в разделе «Использование функции 4АH»). Повторите эксперимент, запустив модифицированную программу. Сравните выходные данные с результатами, полученными на предыдущем шаге. Сохраните результаты, полученные программой, и включите их в отчет в виде скриншота. Шаг 3. Измените программу еще раз таким образом, чтобы после освобождения памяти, программа запрашивала 64Кб памяти функцией 48H прерывания 21H. Повторите эксперимент, запустив модифицированную программу. Сравните выходные данные с результатами, полученными на предыдущих шагах. Сохраните результаты, полученные программой, и включите их в отчет в виде скриншота. Шаг 4. Измените первоначальный вариант программы, запросив 64Кб памяти функцией 48H прерывания 21H до освобождения памяти. Обязательно обрабатывайте завершение функций ядра, проверяя флаг CF. Сохраните результаты, полученные программой, и включите их в отчет в виде скриншота. Шаг 5. Оцените результаты, полученные на предыдущих шагах. Ответьте на контрольные вопросы и оформите отчет. Необходимые сведения для составления программы Учет занятой и свободной памяти ведется при помощи списка блоков управления памятью MCB (Memory Control Block). MCB занимает 16 байт (параграф) и располагается всегда с адреса кратного 16 (адрес сегмента ОП) и находится в адресном пространстве непосредственно перед тем участком памяти, которым он управляет. MCB имеет следующую структуру: Смещение Длина поля (байт) Содержимое поля 00h 1 тип MCB: 5Ah, если последний в списке, 4Dh, если не последний 01h 2 Сегментный адрес PSP владельца участка памяти, либо 0000h - свободный участок, 0006h - участок принадлежит драйверу OS XMS UMB 0007h - участок является исключенной верхней памятью драйверов 0008h - участок принадлежит MS DOS FFFAh - участок занят управляющим блоком 386MAX UMB FFFDh - участок заблокирован 386MAX FFFEh - участок принадлежит 386MAX UMB 03h 2 Размер участка в параграфах 05h 3 Зарезервирован 08h 8 "SC" - если участок принадлежит MS DOS, то в нем системный код "SD" - если участок принадлежит MS DOS, то в нем системные данные По сегментному адресу и размеру участка памяти, контролируемого этим MCB можно определить местоположение следующего MCB в списке. Адрес первого MCB хранится во внутренней структуре MS DOS, называемой "List of Lists" (список списков). Доступ к указателю на эту структуру можно получить используя функцию f52h "Get List of Lists" int 21h. В результате выполнения этой функции ES:BX будет указывать на список списков. Слово по адресу ES:[BX-2] и есть адрес самого первого MCB. Размер расширенной памяти находится в ячейках 30h, 31h CMOS. CMOS это энергонезависимая память, в которой хранится информация о конфигурации ПЭВМ. Объем памяти составляет 64 байта. Размер расширенной памяти в Кбайтах можно определить обращаясь к ячейкам CMOS следующим образом: mov AL,30h ; запись адреса ячейки CMOS out 70h,AL in AL,71h ; чтение младшего байта mov BL,AL ; размера расширенной памяти mov AL,31h ; запись адреса ячейки CMOS out 70h,AL in AL,71h ; чтение старшего байта ; размера расширенной памяти Контрольные вопросы по лабораторной работе №3 1) Что означает "доступный объем памяти"? 2) Где МСВ блок Вашей программы в списке? 3) Какой размер памяти занимает программа в каждом случае? ЛАБОРАТОРНАЯ РАБОТА № 4 «Обработка стандартных прерываний» Цель работы: В архитектуре компьютера существуют стандартные прерывания, за которыми закреплены определенные вектора прерываний. Вектор прерываний хранит адрес подпрограммы обработчика прерываний. При возникновении прерывания, аппаратура компьютера передает управление по соответствующему адресу вектора прерывания. Обработчик прерываний получает управление и выполняет соответствующие действия. В лабораторной работе № 4 предлагается построить обработчик прерываний сигналов таймера. Эти сигналы генерируются аппаратурой через определенные интервалы времени и, при возникновении такого сигнала, возникает прерывание с определенным значением вектора. Таким образом, управление будет передано функции, чья точка входа записана в соответствующий вектор прерывания. Порядок выполнения работы Шаг 1. Для выполнения лабораторной работы необходимо написать и отладить программный модуль типа .ЕХЕ, который выполняет следующие функции: 1) Проверяет, установлено ли пользовательское прерывание с вектором 1Сh. 2) Устанавливает резидентную функцию для обработки прерывания и настраивает вектор прерываний, если прерывание не установлено, и осуществляется выход по функции 4Сh прерывания int 21h. 3) Если прерывание установлено, то выводится соответствующее сообщение и осуществляется выход по функции 4Сh прерывания int 21h. 4) Выгрузка прерывания по соответствующему значению параметра в командной строке /un. Выгрузка прерывания состоит в восстановлении стандартного вектора прерываний и освобождении памяти, занимаемой резидентом. Затем осуществляется выход по функции 4Сh прерывания int 21h. Для того, чтобы проверить установку прерывания, можно поступить следующим образом. Прочитать адрес, записанный в векторе прерывания. Предположим, что этот адрес указывает на точку входа в установленный резидент. На определенном, известном смещении в теле резидента располагается сигнатура, некоторый код, который идентифицирует резидент. Сравнив известное значение сигнатуры с реальным кодом, находящимся в резиденте, можно определить, установлен ли резидент. Если значения совпадают, то резидент установлен. Длину кода сигнатуры должна быть достаточной, чтобы сделать случайное совпадение маловероятным. Программа должна содержать код устанавливаемого прерывания в виде удаленной процедуры. Этот код будет работать после установки при возникновении прерывания. Он должен выполнять следующие функции: 1) Сохраняет стек прерванной программы (регистры SS и SP) в рабочих переменных и восстановить при выходе. 2) Организовать свой стек. 3) Сохранить значения регистров в стеке при входе и восстановить их при выходе. 4) При выполнении тела процедуры накапливать общее суммарное число прерываний и выводить на экран. Для вывода на экран следует использовать прерывание int 10h, которое позволяет непосредственно выводить информацию на экран. 5) Функция прерывания должна содержать только переменные, которые она использует. Шаг 2. Запустите отлаженную программу и убедитесь, что резидентный обработчик прерывания 1Сh установлен. Работа прерывания должна отображаться на экране, а также необходимо проверить размещение прерывания в памяти. Для этого запустите программу ЛР 3, которая отображает карту памяти в виде списка блоков МСВ. Полученные результаты поместите в отчет. Шаг 3. Запустите отлаженную программу еще раз и убедитесь, что программа определяет установленный обработчик прерываний. Полученные результаты поместите в отчет. Шаг 4. Запустите отлаженную программу с ключом выгрузки и убедитесь, что резидентный обработчик прерывания выгружен, то есть сообщения на экран не выводятся, а память, занятая резидентом освобождена. Для этого также следует запустить программу ЛР 3. Полученные результаты поместите в отчет. Шаг 5. Ответьте на контрольные вопросы. Необходимые сведения для составления программы Резидентные обработчики прерываний - это программные модули, которые вызываются при возникновении прерываний определенного типа (сигнал таймера, нажатие клавиши и т.д.), которым соответствуют определенные вектора прерывания. Когда вызывается прерывание, процессор переключается на выполнение кода обработчика, а затем возвращается на выполнение прерванной программы. Адрес возврата в прерванную программу (CS:IP) запоминается в стеке вместе с регистром флагов. Затем в CS:IP загружается адрес точки входа программы обработки прерывания и начинает выполняться его код. Обработчик прерывания должен заканчиваться инструкцией IRET (возврат из прерывания). Вектор прерывания имеет длину 4 байта. В первом хранится значение IP, во втором - CS. Младшие 1024 байта памяти содержат 256 векторов. Вектор для прерывания 0 начинается с ячейки 0000:0000, для прерывания 1 – с ячейки 0000:0004 и т.д. Обработчик прерывание - это отдельная процедура, имеющая следующую структуру: ROUT PROC FAR PUSH AX ; сохранение изменяемых регистров <действия по обработке прерывания> POP AX ; восстановление регистров MOV AL, 20H OUT 20H,AL IRET ROUT ENDP Две последние строки необходимы для разрешения обработки прерываний с более низкими уровнями, чем только что обработанное. Для установки написанного прерывания в поле векторов прерываний используется функция 25H прерывания 21H, которая устанавливает вектор прерывания на указанный адрес. PUSH DS MOV DX, OFFSET ROUT ; смещение для процедуры в DX MOV AX, SEG ROUT ; сегмент процедуры MOV DS, AX ; помещаем в DS MOV AH, 25H ; функция установки вектора MOV AL, 1CH ; номер вектора INT 21H ; меняем прерывание POP DS Программа, выгружающая обработчик прерываний должна восстанавливать оригинальные векторы прерываний. Функция 35 прерывания 21H позволяет восстановить значение вектора прерывания, помещая значение сегмента в ES, а смещение в BX. Программа должна содержать следующие инструкции: ; -- хранится в обработчике прерываний KEEP_CS DW 0 ; для хранения сегмента KEEP_IP DW 0 ; и смещения прерывания ; -- в программе при загрузке обработчика прерывания MOV AH, 35H ; функция получения вектора MOV AL, 1CH ; номер вектора INT 21H MOV KEEP_IP, BX ; запоминание смещения MOV KEEP_CS, ES ; и сегмента ; -- в программе при выгрузке обработчика прерываний CLI PUSH DS MOV DX, KEEP_IP MOV AX, KEEP_CS MOV DS, AX MOV AH, 25H MOV AL, 1CH INT 21H ; восстанавливаем вектор POP DS STI Для того, чтобы оставить процедуру прерывания резидентной в памяти, следует воспользоваться функцией DOS 31h прерывания 21h. Эта функция оставляет память, размер которой указывается в качестве параметра, занятой, а остальную память освобождает и осуществляет выход в DOS. Функция 31h int 21h использует следующие параметры: AH - номер функции 31h; AL - код завершения программы; DX - размер памяти в параграфах, требуемый резидентной программе. Пример обращения к функции: mov DX,offset LAST_BYTE ; размер в байтах от начала сегмента mov CL,4 ; перевод в параграфы shr DX,CL inc DX ; размер в параграфах mov AH,31h int 21h Вывод на экран информации обработчиком прерываний осуществляется с помощью функций прерывания 10h. ;функция вывода символа из AL outputAL proc push ax push bx push cx mov ah,09h ;писать символ с текущей позиции курсора mov bh,0 ;номер видео страницы mov cx,1 ;число экземпляров символа для записи int 10h ;выполнить функцию pop cx pop bx pop ax ret ; ; ;функция вывода строки по адресу ES:BP на экран outputBP proc push ax push bx push dx push CX mov ah,13h ; функция mov al,1 ; sub function code ; 1 = use attribute in BL; leave cursor at end of string mov bh,0 ; видео страница mov dh,22 ; DH,DL = строка, колонка (считая от 0) mov dl,0 int 10h pop CX pop dx pop bx pop ax ret outputBP endp ; ; Установка позиции курсора ; установка на строку 25 делает курсор невидимым setCurs proc push ax push bx push dx push CX mov ah,02h mov bh,0 mov dh,22 ; DH,DL = строка, колонка (считая от 0) mov dl,0 int 10h ; выполнение. pop CX pop dx pop bx pop ax ret ; ; 03H читать позицию и размер курсора ; вход: BH = видео страница ; выход: DH,DL = текущие строка, колонка курсора ; CH,CL = текущие начальная, конечная строки курсора getCurs proc push ax push bx push dx push CX mov ah,03h mov bh,0 int 10h ; выполнение. ; выход: DH,DL = текущие строка, колонка курсора ; CH,CL = текущие начальная, конечная строки курсора pop CX pop dx pop bx pop ax ret Контрольные вопросы по лабораторной работе №4 1) Как реализован механизм прерывания от часов? 2) Какого типа прерывания использовались в работе? ЛАБОРАТОРНАЯ РАБОТА № 5 «Сопряжение стандартного и пользовательского обработчиков прерываний» Цель работы: Исследование возможности встраивания пользовательского обработчика прерываний в стандартный обработчик от клавиатуры. Пользовательский обработчик прерывания получает управление по прерыванию (int 09h) при нажатии клавиши на клавиатуре. Он обрабатывает скан-код и осуществляет определенные действия, если скан-код совпадает с определенными кодами, которые он должен обрабатывать. Если скан-код не совпадает с этими кодами, то управление передается стандартному прерыванию. Порядок выполнения работы Шаг 1. Для выполнения лабораторной работы необходимо написать и отладить программный модуль типа .ЕХЕ, который выполняет такие же функции, как в программе ЛР 4, а именно: 1) Проверяет, установлено ли пользовательское прерывание с вектором 09h. 2) Если прерывание не установлено то, устанавливает резидентную функцию для обработки прерывания и настраивает вектор прерываний. Адрес точки входа в стандартный обработчик прерывания находится в теле пользовательского обработчика. Осуществляется выход по функции 4Сh прерывания int 21h. 3) Если прерывание установлено, то выводится соответствующее сообщение и осуществляется выход по функции 4Сh прерывания int 21h. Выгрузка прерывания по соответствующему значению параметра в командной строке /un. Выгрузка прерывания состоит в восстановлении стандартного вектора прерываний и освобождении памяти, занимаемой резидентом. Затем осуществляется выход по функции 4Сh прерывания int 21h. Для того чтобы проверить установку прерывания, можно поступить следующим образом. Прочитать адрес, записанный в векторе прерывания. Предположим, что этот адрес указывает на точку входа в установленный резидент. На определенном, известном смещении в теле резидента располагается сигнатура, некоторый код, который идентифицирует резидент. Сравнив известное значение сигнатуры с реальным кодом, находящимся в резиденте, можно определить, установлен ли резидент. Если значения совпадают, то резидент установлен. Длину кода сигнатуры должна быть достаточной, чтобы сделать случайное совпадение маловероятным. Программа должна содержать код устанавливаемого прерывания в виде удаленной процедуры. Этот код будет работать после установки при возникновении прерывания. Он должен выполнять следующие функции: 1) Сохранить значения регистров в стеке при входе и восстановить их при выходе. 2) При выполнении тела процедуры анализируется скан-код. 3) Если этот код совпадает с одним из заданных, то требуемый код записывается в буфер клавиатуры. 4) Если этот код не совпадает ни с одним из заданных, то осуществляется передача управления стандартному обработчику прерывания. Шаг 2. Запустите отлаженную программу и убедитесь, что резидентный обработчик прерывания 09h установлен. Работа прерывания проверяется введением различных символов, обрабатываемых установленным обработчиком и стандартным обработчиком. Шаг 3. Также необходимо проверить размещение прерывания в памяти. Для этого запустите программу ЛР 3, которая отображает карту памяти в виде списка блоков МСВ. Полученные результаты поместите в отчет. Шаг 4. Запустите отлаженную программу еще раз и убедитесь, что программа определяет установленный обработчик прерываний. Полученные результаты поместите в отчет. Шаг 5. Запустите отлаженную программу с ключом выгрузки и убедитесь, что резидентный обработчик прерывания выгружен, то есть сообщения на экран не выводятся, а память, занятая резидентом освобождена. Для этого также следует запустить программу ЛР 3. Полученные результаты поместите в отчет. Шаг 6. Ответьте на контрольные вопросы. Необходимые сведения для составления программы Клавиатура содержит микропроцессор, который воспринимает каждое нажатие на клавишу и посылает скан-код в порт микросхемы интерфейса с периферией. Когда скан- код поступает в порт, то вызывается аппаратное прерывание клавиатуры (int 09h). Процедура обработки этого прерывания считывает номер клавиши из порта 60h, преобразует номер клавиши в соответствующий код, выполняет установку флагов в байтах состояния, загружает номер клавиши и полученный код в буфер клавиатуры. В прерывании клавиатуры можно выделить три основных шага: 1. Прочитать скан-код и послать клавиатуре подтверждающий сигнал. 2. Преобразовать скан-код в номер кода или в установку регистра статуса клавиш- переключателей. 3. Поместить код клавиши в буфер клавиатуры. Текущее содержимое буфера клавиатуры определяется указателями на начало и конец записи. Расположение в памяти необходимых данных представлено в таблице. Адрес в памяти Размер в байтах Содержимое 0040:001A 2 Адрес начала буфера клавиатуры 0040:001C 2 Адрес конца буфера клавиатуры 0040:001E 32 Буфер клавиатуры 0040:0017 2 Байты состояния Флаги в байтах состояния устанавливаются в 1, если нажата соответствующая клавиша или установлен режим. Соответствие флагов и клавиш показано ниже. ┌─┬─┬─┬─┬─┬─┬─┬─╥─┬─┬─┬─┬─┬─┬─┬─┐ │ │ │ │ │ │ │ │ ║ │ │ │ │ │ │ │ │ └┬┴┬┴┬┴┬┴┬┴┬┴┬┴┬╨┬┴┬┴┬┴┬┴┬┴┬┴┬┴┬┘ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └─ Shift (правая) │ │ │ │ │ │ │ │ │ │ │ │ │ │ └─── Shift (левая) │ │ │ │ │ │ │ │ │ │ │ │ │ └───── Ctrl (правая или левая) │ │ │ │ │ │ │ │ │ │ │ │ └─────── Alt (правая или левая) │ │ │ │ │ │ │ │ │ │ │ └───────── ScrollLock │ │ │ │ │ │ │ │ │ │ └─────────── NumLock │ │ │ │ │ │ │ │ │ └───────────── CapsLock │ │ │ │ │ │ │ │ └─────────────── Ins │ │ │ │ │ │ │ └───────────────── Ctrl (правая) │ │ │ │ │ │ └─────────────────── Alt (правая) │ │ │ │ │ └───────────────────── SysReq │ │ │ │ └─────────────────────── уст. режим "Пауза" │ │ │ └───────────────────────── ScrollLock │ │ └─────────────────────────── NumLock │ └───────────────────────────── CapsLock └─────────────────────────────── Ins В момент вызова прерывания скан-код будет находиться в порте 60h. Поэтому сначала надо этот код прочитать командой IN и сохранить на стеке. Затем используется порт 61H, чтобы быстро послать сигнал подтверждения микропроцессору клавиатуры. Надо просто установить бит 7 в 1, а затем сразу изменить его назад в 0. Заметим, что бит 6 порта 61H управляет сигналом часов клавиатуры. Он всегда должен быть установлен в 1, иначе клавиатура будет выключена. Эти адреса портов применимы и к AT, хотя он и не имеет микросхемы интерфейса с периферией 8255. Сначала скан-код анализируется на предмет того, была ли клавиша нажата (код нажатия) или отпущена (код освобождения). Код освобождения состоит из двух байтов: сначала 0F0H, а затем скан-код. Все коды освобождения отбрасываются, кроме случая клавиш-переключателей, для которых делаются соответствующие изменения в байтах их статуса. С другой стороны, все коды нажатия обрабатываются. При этом опять могут изменяться байты статуса клавиш-переключателей. В случае же символьных кодов, надо проверять байты статуса, чтобы определить, например, что скан-код 30 соответствует нижнему или верхнему регистру буквы A. После того как введенный символ идентифицирован, процедура ввода с клавиатуры должна найти соответствующий ему код ASCII или расширенный код. Приведенный пример слишком короток, чтобы рассмотреть все случаи. В общем случае скан-коды сопоставляются элементам таблицы данных, которая анализируется инструкцией XLAT. XLAT принимает в AL число от 0 до 255, а возвращает в AL 1-байтное значение из 256-байтной таблицы, на которую указывает DS:BX. Таблица может находиться в сегменте данных. Если в AL находился скан-код 30, то туда будет помещен из таблицы байт номер 30 (31-й байт, так как отсчет начинается с нуля). Этот байт в таблице должен быть установлен равным 97, давая код ASCII для "a". Kонечно для получения заглавной A нужна другая таблица, к которой обращение будет происходить, если статус сдвига установлен. Или заглавные буквы могут храниться в другой части той же таблицы, но в этом случае к скан-коду надо будет добавлять смещение, определяемое статусом клавиш-переключателей. Номера кодов должны быть помещены в буфер клавиатуры. Процедура должна сначала проверить, имеется ли в буфере место для следующего символа. Буфер устроен как циклическая очередь. Ячейка памяти 0040:001A содержит указатель на голову буфера, а 0040:001C - указатель на хвост. Эти словные указатели дают смещение в области данных BIOS (которая начинается в сегменте 40H) и находятся в диапазоне от 30 до 60. Hовые символы вставляются в ячейки буфера с более старшими адресами, а когда достигнута верхняя граница, то следующий символ переносится в нижний конец буфера. Когда буфер полон, то указатель хвоста на 2 меньше указателя на голову - кроме случая, когда указатель на голову равен 30 (начало области буфера), а в этом случае буфер полон, когда указатель хвоста равен 60. Для вставки символа в буфер, надо поместить его в позицию, на которую указывает хвост буфера и затем увеличить указатель хвоста на 2; если указатель хвоста был равен 60, то надо изменить его значение на 30. Код для отработки прерывания 09H push ax in al,60H ;читать ключ cmp al,REQ_KEY ;это требуемый код? je do_req ; да, активизировать обработку REQ_KEY ; нет, уйти на исходный обработчик pop ax jmp cs:[int9_vect] ;переход на первоначальный обработчик do_req: ;следующий код необходим для отработки аппаратного прерывания in al,61H ;взять значение порта управления клавиатурой mov ah,al ; сохранить его or al,80h ;установить бит разрешения для клавиатуры out 61H,al ; и вывести его в управляющий порт xchg ah,al ;извлечь исходное значение порта out 61H,al ;и записать его обратно mov al,20H ;послать сигнал "конец прерывания" out 20H,al ; контроллеру прерываний 8259 ;------ дальше - прочие проверки Записать символ в буфер клавиатуры можно с помощью функции 05h прерывания 16h: mov ah,05h ; Код функции mov cl,'D' ; Пишем символ в буфер клавиатуры mov ch,00h ; int 16h ; or al,al ; проверка переполнения буфера jnz skip ; если переполнен идем skip ; работать дальше skip: ; очистить буфер и повторить |