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

lab3 / 0303_Болкунов_ВО_ЛР3

.pdf
Скачиваний:
0
Добавлен:
12.08.2022
Размер:
305.78 Кб
Скачать

МИНОБРНАУКИ РОССИИ САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ ЭЛЕКТРОТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ «ЛЭТИ» ИМ. В.И. УЛЬЯНОВА (ЛЕНИНА)

Кафедра математического обеспечения и применения ЭВМ

ОТЧЕТ По лабораторной работе № 3

по дисциплине «Операционные системы» Тема Исследование организации управления основной памятью

Студент гр. 0303

 

Болкунов В.О.

Преподаватель

 

 

Губкин А. Ф.

Санкт-Петербург

2022

Цель работы.

Для исследования организации управления памятью необходимо ориентироваться на тип основной памяти, реализованный в компьютере и способ организации, принятый в ОС. В лабораторной работе рассматривается нестраничная память и способ управления динамическими разделами. Для реализации управления памятью в этом случае строится список занятых и свободных участков памяти. Функции ядра, обеспечивающие управление основной памятью, просматривают и преобразуют этот список. В лабораторной работе исследуются структуры данных и работа функций управления памятью ядра операционной системы.

Порядок выполнения работы.

Шаг 1. Для выполнения лабораторной работы необходимо написать и отладить программный модуль типа .COM, который выбирает и распечатывает следующую информацию:

1)Количество доступной памяти.

2)Размер расширенной памяти.

3)Выводит цепочку блоков управления памятью. Адреса при выводе представляются шестнадцатеричными числами. Объем памяти функциями управления памятью выводится в параграфах. Необходимо преобразовать его в байты и выводить в виде десятичных чисел. Последние восемь байт МСВ выводятся как символы, не следует преобразовывать их в шестнадцатеричные числа. Запустите программу и внимательно оцените результаты. Сохраните результаты, полученные программой, и включите их в отчет в виде скриншота.

Шаг 2. Измените программу таким образом, чтобы она освобождала память, которую она не занимает. Для этого используйте функцию 4Аh

прерывания 21h (пример в разделе «Использование функции 4АH»). Повторите эксперимент, запустив модифицированную программу. Сравните выходные данные с результатами, полученными на предыдущем шаге. Сохраните результаты, полученные программой, и включите их в отчет в виде скриншота.

2

Шаг 3. Измените программу еще раз таким образом, чтобы после освобождения памяти, программа запрашивала 64Кб памяти функцией 48H

прерывания 21H. Повторите эксперимент, запустив модифицированную программу. Сравните выходные данные с результатами, полученными на предыдущих шагах. Сохраните результаты, полученные программой, и

включите их в отчет в виде скриншота.

Шаг 4. Измените первоначальный вариант программы, запросив 64Кб памяти функцией 48H прерывания 21H до освобождения памяти. Обязательно обрабатывайте завершение функций ядра, проверяя флаг CF. Сохраните результаты, полученные программой, и включите их в отчет в виде скриншота.

Шаг 5. Оцените результаты, полученные на предыдущих шагах. Ответьте на контрольные вопросы и оформите отчет.

Выполнение работы.

Использованная память (данные):

символы перевода строки: endl db 13, 10, "$"

буфер для чисел в строковом представлении numBuff db 16 DUP(" ")

строки для вывода информации о памяти: memSizeStr db "Size of available memory$" extMemSizeStr db "Size of extended memory $" bytesStr db " bytes$"

parStr db " paragraphs$" kbStr db " Kbytes $" eqStr db " = $"

3

размер свободной памяти: freeMem dw 0

строки для вывода информации о выделении памяти: memCompres db "Memory compressed successfully.$" memAlloc db "Memory allocated succesfully.$" memNAlloc db "Memory allocation fail.$" maxAllocSize db "Max memory size can be allocated$"

строки для вывода информации о MCB блоках: mcbInfoStr db "MCB List:$"

mcbStr db "MCB block $" fByte db "First byte: $"

mcbAddrStr db "Block addres: $" mcbSizeStr db "Block size $" mcbOwnerStr db "Owner: $" sysDataStr db "System data: $"

строки возможных владельцев блока: free db "free$"

OS_XMS_UMB db "OS XMS UMB driver$" excDriver db "Excluded driver`s memory$" MSDOS db "MS DOS memory$"

_386MAX_UMB_control db "control block of 386MAX UMB$" _386MAX_UMB_blocked db "blocked by 386MAX" _386MAX_UMB db "386MAX UMB"

ownerAddr db " (owner addres)$"

4

Макроопределения:

 

print _str_

- вывод строки на экран

printl _str_

- вывод строки на экран с переводом строки

printChar _chr_

- вывод одного символа на экран

Функции и процедуры:

перевод половины байта в символ в 16ричной с/с tetrToHexStr PROC

перевод байта в символы 16ричной с/с

byteToHexStr PROC near _num: byte, _buff: word

перевод двухбайтового числа в символы 16ричной с/с wordToHexStr PROC near _num: word, _buff: word

перевод четырёхбайтового числа в символы 16ричной с/с dwordToHexStr PROC near _num: dword, _buff: word

перевод двухбайтового числа в символы 10ичной с/с wordToDecStr PROC near _num: word, _buff: word

перевод двухбайтового числа в символы 10ичной с/с dwordToDecStr PROC near _num: dword, _buff: word

(существует некоторый предел числа у реализованного алгоритма, но для данной задачи такого предела хватает)

обрезание числа в буферной строке по его размеру

cutNum PROC near _buff: word, _len: word, _base: byte

вывод списка MCB printMCBInfo PROC near

вывод информации о доступной памяти printMemSize PROC near

вывод информации о расширенной памяти printExtMemSize PROC near

5

Сборка

Загрузочные модули собираются из файлов prog[1, 2, 3, 4].asm с

помощью утилит “masm”, “link” и “exe2bin”, для автоматизации сборки написан скрипт build_module.bat. Для сборки всех модулей сразу используется скрипт build.bat.

1. Исходный вариант программы

Результат работы программы показан на рисунке 1.

Рисунок 1: исходная программа

Как можно заметить блок №6 является памятью занимаемой программой, так как в соответствии со стратегией однопрограммных ОС запущенному модулю выделяется вся доступная память. Этот блок и явлется доступной памятью

6

2. 1-ая модификация (освобождение памяти)

Результат работы программы показан на рисиунке 2.

Рисунок 2: первая модификация

В данной модификации освобождается неиспользованная память. Как видно на скриншоте, действительно появляется крупный блок свободной памяти.

7

3. 2-ая модификация (освобождение и выделение памяти)

Результат работы программы показан на рисиунке 3.

Рисунок 3: 2-ая модификация

В данной модификации после освобождения неиспользованной памяти выделяется новый блок размером 64Кб. На скриншоте видно, что действительно появляется новый блок MCB размером 64Кб принадлежащий программе (адрес владельца 0548h как раз является адресом PSP программы,

если к адресу MCB программы прибавить размер самого MCB равный одному параграфу).

8

4. 3-ая модификация (выделение и освобождение памяти)

Результат работы программы показан на рисиунке 4.

Рисунок 4: 3-ая модификация

Как можно увидеть, была обработана ошибка выделения памяти (через флаг переноса) и память не выделилась, а максимально возможный размер памяти для выделения был возвращён в регистре bx и выведен (07h параграфов или 112 байт). По блокам MCB также видно, что эти самые свободные 112 байт находятся в блоке №3.

9

Выводы:

В ходе лабораторной работы была исследована организация управления динамическими разделами нестраничной памяти с помощью функций ядра

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

Контрольные вопросы

1)Что означает "доступный объем памяти"?

-память которая выделяется операционной системой программе при её запуске.

2)Где МСВ блок Вашей программы в списке?

-во всех случаях программа находится в блоке №6 по адресу 0547h.

3)Какой размер памяти занимает программа в каждом случае?

1)в исходном варианте 633712 байт (что равно доступной памяти)

2)при освобождении неиспользуемой 1840 байт

3)при последующем выделении:

1888 + 65536 (занятые 64 Кб) = 67424 байт

4) при попытке выделить 64 Кб без освобождения - так же как в исходном варианте: 633712 байт

10

Соседние файлы в папке lab3