Машинно-зависимые языки / Лабораторная работа No
.1.docЛАБОРАТОРНАЯ РАБОТА №1
УПРАВЛЕНИЕ ПАМЯТЬЮ В ОС MS DOS
1. ЦЕЛЬ РАБОТЫ
Целью работы является изучение системы управления памятью ОС MS DOS, приобретение навыков в программировании операций управления и распределения стандартной памяти в операционной системе MS DOS.
2. ОСНОВНЫЕ СВЕДЕНИЯ
В MS DOS реализована упрощенная схема управления памятью (без контроля границ, прав доступа и перемещения сегментов) , характерная для однозадачных ОС.
Cистема управления памятью MS DOS распределяет оперативную память фрагментами , каждому из которых предшествует специальная структура данных - блок управления памятью (МСВ). Каждый раз при создании нового процесса , система управления памятью MS DOS выделяет для него два блока памяти - один для переменных окружения ДОС (MS DOS Environment) , второй - собственно для программного модуля. Затем в выделенный участок оперативной памяти загружается следующая информация:
- МСВ для блока памяти окружения;
- блок памяти окружения;
- МСВ программного блока памяти;
- префикс программного сегмента PSP;
- программный модуль.
Под программный модуль всегда выделяется блок максимально возможного размера.
Блок окружения состоит из ASCIIZ-строк (строк , закрытых двоичным нулем) , каждая из которых содержит текущие значения переменных среды (например: COMSPEC = C:\command.com). Список переменных также заканчивается двоичным нулем. Затем следует слово , содержащее количество дополнительных строк окружения (обычно 0001h), после которого обычно размещается ASCIIZ-стро-
ка , содержащая полный путь к файлу программы. Именно этой
строкой пользуются многие программы для определения пути своего запуска , а также программы - просмотрщики оперативной памяти для определения имени программы , которой принадлежит блок памяти. В PSP со смещением 44 (Dec) размещается сегментный адрес МСВ блока окружения. По смещению 2 в PSP расположена нижняя граница доступной в системе памяти в параграфах.
Прикладная программа имеет возможность запросить дополнительные блоки памяти для своих данных. Таким способом отводится память для динамических структур данных.
После завершения процесса MS DOS освобождает всю выделенную для него память (кроме случая резидентных программ).
Во всех случаях минимальной порцией распределения памяти является параграф ( 1П=16 байт ), поэтому начальный адрес и размер каждого блока памяти кратны 16.
Отслеживание текущего состояния памяти осуществляется ОС с помощью односвязного, упорядоченного по возрастанию адреса блоков, списка. Доступ к голове этого списка можно получить с помощью функции 52h прерывания MS DOS, которая возвращает в ES:BX указатель на начало недокументированной cтруктуры данных MS DOS - векторной таблицы связи (списка списков MS DOS). Указатель на селектор первого блока спискa после вызова данной функции располагается по адресу ES:[BX-2].
mov ah,52h --------------- ---------------
int 21h ---- МСВ 1 ----- МСВ 2 ---- ...
............. | --------------- ---------------
ES:[BX-2] | | | | |
------------- | | Block1 | | Block2 |
| | | | | |
----------------- | --------------- | |
|Адрес 1-го МСВ | | | |
----------------- | | |
------------- ---------------
Рис 1. Список блоков памяти MS DOS.
МСВ представляет собой следующую структуру данных:
bMarker db ? ; Маркер блока
wOwner dw ? ; Идентификатор владельца
wSizePara dw ? ; Размер блока в параграфах
; ( без заголовка )
bUnused db 11 dup(?) ; не используется
Маркер блока bMarker равен 'М' у промежуточных блоков списка и 'Z'- у последнего блока. В противном случае МСВ и сам блок считается разрушенным. Последнее становится возможным из-за отсутствия защиты памяти (контроля границ сегментов).
Идентификатор блока wOwner = 0, если блок свободен, или содержит идентификатор (сегментный адрес PSP) процесса-владельца блока.
Поле bUnused зарезервировано , однако последние 8 байт этого поля часто содержат имя файла программы , которой принадлежит данный блок.
МСВ не содержит в явном виде указателя на следующий блок, но последний легко может быть получен суммированием указателя текущего блока с wSizePara+1.
Заметим также, что MS DOS не поддерживает таблиц сегментов и не работает с ними, поэтому каждый процесс содержит в теле своей программы в том или ином виде свою таблицу сегментов и самостоятельно формирует содержимое сегментных регистров CS, DS, ES и SS.
Система управления памятью MS DOS реализует 4 функции управления памятью, которые вызываются из прикладных программ через прерывание 21h.
Таблица 1 Функции распределителя памяти MS DOS
Код функции |
Код подфункции |
Назначение |
|
58h |
00h |
Получить стратегию распределения |
|
01h |
Установить стратегию распределения |
||
48h |
|
|
Выделить блок памяти |
49h |
|
|
Освободить блок памяти |
4Ah |
|
|
Изменить размер блока |
1) 58h - установить/получить стратегию распределения памяти. Данная функция имеет две подфункции.
а) установить стратегию выделения памяти:
Вызов:
AH = 58h - код функции;
AL = 01h - код подфункции;
BL - код стратегии: 0 (первый подходящий блок),
1 (наиболее подходящий) или 2 (последний подходящий по размеру свободный блок);
int 21h
Описание. Заданный в регистре BL код стратегии запоминается в байте текущей стратегии (для дальнейшего использования при выделении памяти).
Возврат: если CF=0 - стратегия установлена, если CF=1 - ошибка (AX=1 - неправильно задан код подфункции).
б) получить стратегию выделения памяти.
Вызов:
AH = 58h - код функции;
AL = 00h - код подфункции; int 21h
Описание. Код текущей стратегии считывается из байта текущей стратегии в регистр AL.
Возврат: если CF=0, то в AL - код текущей стратегии, если CF=1, то AX=1 - неправильно задан код подфункции.
2) 48h - выделить блок памяти.
Вызов:
AH = 48h - код функции;
BX - размер блока в параграфах; int 21h
Описание. ОС просматривает список блоков (от начала до конца). При просмотре производится слияние соседних свободных блоков и отбор кандидата по всем трем стратегиям распределения. По окончании просмотра анализируется текущая стратегия и осуществляется окончательный выбор одного из трех кандидатов. После того, как оптимальный свободный блок отобран, его размер еще раз сопоставляется с размером запрашиваемого блока: если размеры совпадают, блок помечается как занятый (в поле идентификатора владельца вписывается идентификатор текущего процесса DOS), если размер отобранного блока больше (на N параграфов), то от него предварительно отрезается свободный блок (N-1 параграф).
Возврат: если CF=0, то ошибок нет, в AX - сегментный адрес выделенного блока памяти; если CF=1, блок не выделен: разрушены МСВ (AX=7) или нет блока подходящего размера (AX=8, BX - максимальный размер блока, который может быть выделен).
Заметим, что для того чтобы получить доступ к ячейкам памяти выделенного блока, процесс должен сам загрузить сегментный адрес блока в один из сегментных регистров микропроцессора, например, ES.
3) 49h - освободить блок памяти
Вызов:
AH = 49h - код функции;
ES - сегментный адрес освобождаемого блока; int 21h
Описание. По заданному селектору в списке блоков памяти отыскивается блок и в поле идентификатора владельца блока устанавливается 0 ( блок свободен ).
Возврат: если CF=0 - блок освобожден, иначе AX=9 (разрушены дескрипторы или неверно задан селектор блока).
4) 4Ah - изменение размера блока
Вызов:
AX = 4Ah - код функции;
ES - сегментный адрес изменяемого блока;
BX - новый размер блока (в параграфах); int 21h
Описание. ОС всегда начинает с того, что расширяет блок настолько, насколько это возможно (за счет примыкающих сверху свободных блоков). Затем размер увеличенного блока сравнивается с требуемым. Если расширенный блок меньше, то его размер помещается в регистр ВХ и осуществляется выход с признаком ошибки (т.е. блок увеличивается, хотя и не настолько, насколько задано). Если же расширенный блок меньше запрашиваемого (на N параграфов), то предварительно от него отрезается свободный блок (размером в N-1 параграф).
Возврат: если CF=0 - все нормально, ошибок нет; если CF=1, то разрушены дескрипторы блоков ( AX=7 ), неверно задан селектор блока ( AX=9 ) или мало памяти ( AX=8, BX - установленный, максимально возможный на данный момент времени, размер блока).
На практике данная функция чаще всего применяется для того, чтобы уменьшить ( сжать ) блок памяти, содержащий программный сегмент процесса, поскольку при создании процесса под программный сегмент всегда отводится наибольший из имеющихся в наличии свободный блок (для .com - программ). При создании процесса ОС вызывает функцию выделения памяти, запрашивая 0FFFFh параграфов (1 Мбайт ) памяти и всегда получает отказ.
Однако, вместе с признаком отказа ОС получает в регистре BX размер максимального свободного блока, который и использует при повторном запросе на выделение памяти.
3. ВЫПОЛНЕНИЕ РАБОТЫ
Написать программу на языке ассемблера согласно варианту задания , представленному в разделе 5 (табл.2). Каждый вариант предусматривает программную реализацию некоторой последовательности операций управления памятью: установки стратегии, выделения, изменения, освобождения блоков. При этом все варианты включают следующие, не описанные в табл.2, общие операции с памятью:
- сжатие блока памяти программного сегмента до минимального размера (это самая первая операция каждого варианта);
- освобождение всех затребованных блоков и восстановление исходной стратегии распрeделения (это заключительные операции каждого варианта).
Каких-либо действий с выделенной памятью (чтение, запись ячеек блока и т.п.) задания не предусматривают, поскольку эти операции не относятся к функциям управления памятью. Для просмотра результатов выполнения работы студенту предлагается разработать в своей программе процедуру вывода на экран списка блоков MCB. Эта процедура просматривает и выводит на экран цепочку МСВ: сегментный адрес начала каждого блока памяти (без МСВ), размер блока в параграфах, сегментный адрес владельца блока (без МСВ). Просмотр результатов должен производиться после каждого действия , изменяющего текущее распределение памяти.
Создать с помощью текстового редактора файл с текстом программы.
Оттранслировать программу, добиться отсутствия ошибок трансляции.
Запустить и отладить программу.
4. ВАРИАНТЫ ЗАДАНИЙ
Таблица 2 Варианты заданий к лабораторной работе
--------------------------------------------------------------- Управление памятью
1 |
Установить стратегию "первый подходящий", выделить блоки памяти размером 4П, 3П, 2П, 1П, освободить блоки памяти 4П и 2П, увеличить размер блока 3П до 9П |
2 |
Установить стратегию "последний подходящий", выделить блоки памяти 10П и 100П, освободить блок 10П, выделить блок 256б |
3 4 |
Установить стратегию "наиболее подходящий", выделить блоки памяти 100К и 100П, освободить блок 100К, выделить блок 100б Установить стратегию "первый подходящий", выделить блоки памяти размером 100К и 200К, освободить блок 100К, выделить блок 150К |
5 |
Установить стратегию "первый подходящий",выделить блоки памяти размером 1К, 2К, 3К, освободить блок памяти 2К, увеличить блок 1К до максимально возможного размера |
6 |
Установить стратегию "последний подходящий", выделить блоки памяти размером в 3К, 5К, 8К, затем обьединить блоки 3К и 5К в один блок |
7+ |
Установить стратегию "последний подходящий", выделить блок памяти размером 16П, увеличить его размер до 64П |
8 |
Установить стратегию "первый подходящий", выделить блоки памяти размером 32б, 48б, 1б, затем обьединить первые два блока в один блок |
9 10 |
Установить стратегию распределения "наиболее подходящий", выделить блок 1б, установить стратегию "первый подходящий", выделить блок 1П, установить стратегию "последний подходящий", выделить блок 1К Освободить блок памяти окружения ДОС , установить стратегию "первый подходящий", выделить блок размером 0б и затем увеличить его до максимально возможного размера |
11 |
Освободить блок памяти окружения ДОС , установить стратегию "наиболее подходящий", выделить блок размером 1б, затем увеличить его до 1К |
12 |
Освободить блок памяти окружения ДОС , установить стратегию "наимболее подходящий", выделить блок памяти размером 8П и затем уменьшить его размер в 2 раза |
13 |
Найти максимальный свободный блок и выделить в его адресном пространстве блок размером в половину максимального свободного блока |
14 |
Установить стратегию "последний подходящий", выделить блок памяти 8К, уменьшить его размер в 2 раза, установить стратегию "наиболее подходящий", выделить блок памяти размером 4К |
15 |
Установить стратегию "последний подходящий", выделить блок памяти размером 64П, уменьшить его размер до 1П, выделить блок памяти 10П |
16 |
Освободить блок памяти окружения ДОС , установить стратегию "последний подходящий", выделить блок 6П, затем уменьшить его размер до 4П, установить стратегию "наиболее подходящий" и выделить блок 2П |
17 |
Выделить блок максимально возможного размера, уменьшить его размер на 3П, освободить блок памяти окружения ДОС , установить стратегию "последний подходящий" и выделить блок размером в 3П |
18 |
Установить стратегию "первый подходящий", выделить блок памяти 1б, увеличить на 1П размер блока памяти программного сегмента |
19 |
Установить стратегию "последний подходящий", выделить блок памяти размером 1К, увеличить вдвое размер блока памяти программного сегмента |
20 |
Установить стратегию "наиболее подходящий", выделить блок памяти размером 1136б, увеличить на 1П размер блока памяти программного сегмента |
21 |
Для каждой из трех стратегий распределения памяти, выделить, затем увеличить вдвое, блок памяти размером 50П |
22 |
Выделить блок на 2П меньший наибольшего свободного блока, освободить блок памяти окружения ДОС , установить стратегию "последний подходящий", выделить блок размером 2П |
23 |
Освободить блок памяти окружения ДОС , установить стратегию "наиболее подходящий", выделить два блока памяти размером 8П, затем увеличить каждый из них в 10 раз |
6. ФОРМА ОТЧЕТА
Отчет по лабораторной работе должен включать:
- вариант задания;
- текст программы ( желательно в виде листинга трансляции );
- результаты работы программы в виде карт памяти.
7. КОНТРОЛЬНЫЕ ВОПРОСЫ
1. Какой метод управления памятью используется в MS DOS?
2. Какие таблицы используются в ОС для отслеживания текущего состояния распределения памяти? Опишите формат таблицы блоков памяти.
3. Где хранятся "таблицы" сегментов процесса? Как выглядят эти таблицы?
4. Каким образом ОС определяет, что МСВ разрушен? Почему содержимое памяти может быть разрушено и какие действия следует предпринять процессу, пользователю ПЭВМ в таком случае?
5. Перечислите функции управления памятью, реализованные в системе управления памятью MS DOS?
6. Назовите и охарактеризуйте стратегии распределения памяти, поддерживаемые MS DOS?
7. В каких случаях возникает фрагментация памяти в системе?
8. Как с помощью функции выделения памяти определить размер наибольшего свободного блока?
9. Может ли функция изменения размера блока увеличить блок памяти за счет свободного блока, примыкающего снизу (со стороны младших адресов)?
СПИСОК ЛИТЕРАТУРЫ
1. Фролов А.В. , Фролов Г.В. MS DOS для программиста -М.: ДИАЛОГ-МИФИ , 1995. - 256 с. (Библиотека системного программиста , т.18).
2. Чижов А.А. Системные программные средства ПЭВМ: Справочник.- М.: Финансы и статистика, 1990.-415с.
3. Джордейн Р. Справочник программиста персональных компьютеров типа IBM PC, XT и AT.- M.: Финансы и статистика,
1992.- 544c.
4. Скэнлон Л. Персональные ЭВМ IBM PC и XT. Программирование на языке ассемблера.-М.: Радио и связь, 1990.-336с.