Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Машинно-зависимые языки / Лабораторная работа No

.1.doc
Скачиваний:
23
Добавлен:
17.04.2015
Размер:
72.19 Кб
Скачать

ЛАБОРАТОРНАЯ РАБОТА №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с.