Целью работы является ознакомление с механизмами управления памятью в операционной системе MS-DOS и исследование особенностей их использования.
1.1. Операционная система MS-DOS
Операционная система — это совокупность системных управляющих программ совместно с необходимыми массивами данных, предназначенная для планирования исполнения пользовательских программ и управления ресурсами ЭВМ с целью повышения эффективности использования аппаратных и программных средств.
1.1.1. ИСТОРИЯ ВОЗНИКНОВЕНИЯ MS-DOS. MS-DOS расшифровывается как дисковая операционная система. Первой разработкой MS-DOS можно считать операционную систему для персональных ЭВМ, созданную фирмой Seattle Computer Products в 1980 г. В конце 1980 г. система, первоначально названная QDOS, была модифицирована и переименована в 86-DOS.
Право на использование операционной системы 86-DOS было куплено Корпорацией MICROSOFT, заключившей контракт с фирмой IBM, обязуясь разработать операционную систему для новой модели персональных компьютеров, выпускаемых фирмой. Когда в конце 1981 г. новый компьютер IBM PC приобрел широкую популярность, его операционная система представляла собой модифицированную версию системы 86-DOS, названную PC- DOS, версия 1.0, а затем MS-DOS.
1.1.2. КАРТА ПАМЯТИ ПЭВМ. Память состоит из последовательности пронумерованных ячеек (байт). Номер ячейки называется ее адресом. Обычно адрес определяется шестнадцатеричным числом (далее по тексту шестнадцатеричные числа помечаются буквой «Н», например, 10Н). На рис. 1.1 приведена структура памяти ПЭВМ.
1.1.3. СПИСОК СПИСКОВ MS-DOS. MS-DOS предоставляет программам системные данные, которые использует в своей работе. Для получения адреса списка списков необходимо выполнить программное прерывание INT 21H при содержимом регистра AH=52h. По возврату из прерывания, в паре регистров ES: BX содержится этот адрес (адрес типа FAR, состоит из сегментной части в ES и смещения внутри сегмента в BX). На рис. 1.2 представлена структура предоставляемых данных.
Смещение Размер Описание
-2 WORD сегментный адрес первого блока управления памятью
00h DWORD адрес первого блока параметров драйвера (см. AH=32h)
04h DWORD адрес первой системной таблицы файлов (см. ниже)
08h DWORD адрес заголовка устройства CLOCK$ (часы и календарь)
0Ch DWORD адрес заголовка устройства CON (консоль оператора)
10h WORD мах. количество байт в секторе дискового устройства
12h DWORD адрес первого дискового буфера (см. ниже)
16h DWORD адрес данных структуры текущей директории (см. ниже)
1Ah DWORD адрес системной таблицы управления файлами FCB
1Eh WORD кол-во защищенных FCB (параметр y в строке FCBS=x,y)
20h BYTE колич. дисковых устройств
21h BYTE колич. используемых имен дисков (значение LASTDRIVE)
22h 18 BYTEs заголовок устройства NUL — первое в списке устройство
34h BYTE колич. соединенных дисковых устройств
35h WORD смещение внутри кодового сегмента списка имен программ
37h DWORD адрес резидентной подпрограммы для файловая система
3Bh DWORD адрес списка дисков файловой системы
3Fh WORD x из BUFFERS x,y
41h WORD y из BUFFERS x,y
43h BYTE загрузочный диск (1=A:)
44h BYTE 01h, если 80386+, иначе 00h
45h WORD размер расширенной памяти в K
Рис. 1.2. Структура списка списков MS-DOS
1.1.4. ФУНКЦИИ УПРАВЛЕНИЯ ПАМЯТЬЮ. При функционировании системы различные ее составные части и программы пользователя требуют выделения им оперативной памяти. Подсистема управление памятью выполняет выделение, освобождение и перераспределение блока памяти по запросам программ через прерывание INT 21H c кодами запроса соответственно AH=48H, AH=49H и AH=4AH (рис. 1.3).
——————————— ———————————
¦ Распределить память ¦ Освободить память ¦
———————————+———————————
¦AH = 48h ¦AH = 49h ¦
¦BX = размер блока в параграфах ¦ES = сегментный адрес блока ¦
¦Возврат: ¦Возврат: ¦
¦CF сброшен, если блок выделен ¦CF сброшен, если блок освобожден ¦
¦AX = сегментный адрес блока ¦ ¦
——— ———————— ———————- ———-
¦ Перераспределить память ¦
———————————————-
¦AH = 4Ah ¦
¦BX = новый размер блока в параграфах ¦
¦ES = сегментный адрес выделенного блока ¦
¦Возврат: CF сброшен, если блок перераспределен¦
¦BX = максимальный возможный размер этого блока¦
———————————————-
Рис. 1.3. Функции управления памятью MS-DOS
При выделении памяти MS-DOS строит список описателей блоков памяти, каждый из которых имеет структуру, представленную на рис. 1.4. Перед каждым блока памяти располагается описатель. Описатель следующего блока располагается вслед за текущим в сторону увеличения адресов памяти. Адрес следующего описателя блока памяти равен адресу текущего, увеличенному на длину блока памяти и длину его описателя.
Смещение Размер Описание
00h BYTE тип блока: 5Ah если последний блок, иначе 4Dh
01h WORD сегмент PSP владельца, если 0000h — свободен,
если 0008h — блок MS-DOS
03h WORD размер блока памяти в параграфах (16 байт)
05h 3 BYTEs неиспользуется
08h 8 BYTEs имя программы, запросившей блок
Рис. 1.4. Структура описателя блока памяти
При освобождении блока, если это возможно, он объединяется с соседними свободными, образуя единый блок большего размера. Если соседние блоки заняты, то он помечается как свободный. В следствии такого алгоритма возможна ситуация, когда свободные и распределенные блоки чередуются и при наличии достаточного количества суммарной свободной памяти распределить блок требуемого размера не представляется возможным. Такое явление называется фрагментацией памяти.
1.1.5. ПРЕФИКС СЕГМЕНТА ПРОГРАММЫ. Для каждого процесса (программы) MS-DOS строит ее описатель, префикс программного сегмента PSP, в котором хранит данные о текущем процессе. Структура PSP приведена на рис. 1.5. Адрес префикса программного сегмента содержится в описателе блока памяти и позволяет установить владельца (программу) этого блока памяти.
Смещение Размер Описание
00h 2 BYTE код команды INT 20H, вызывающей завершение программы
02h WORD адрес первого свободного байта после программы
04h BYTE не используется
05h BYTE первый байт команды CALL для вызова диспетчера
06h WORD размер сегмента для .COM файла
08h 2 BYTE remainder of FAR JMP at 05h
0Ah DWORD сохраненный адрес INT 22H (завершение)
0Eh DWORD сохраненный адрес INT 23H (Cntrl-Break)
12h DWORD сохраненный адрес INT 24H (обработка ошибки)
16h WORD сегмент родительского PSP
18h 20 BYTE Job File Table (JFT) — таблица файлов
2Ch WORD сегментный адрес окружения (среды) для программы
2Eh DWORD SS:SP при последнем вызове INT 21H
32h WORD количество элементов в JFT (20)
34h DWORD адрес JFT (PSP:0018h)
38h DWORD адрес предыдущего PSP (для программы SHARE)
3Ch 20 BYTE не используется
50h 3 BYTE коды команд INT 21 и RETF
53h 9 BYTE не используется
5Ch 16 BYTE первый блок управления файлом FCB
6Ch 16 BYTE второй блок управления файлом FCB
7Ch 4 BYTE не используется
80h 128 BYTE командная строка вызова программы: первый байт — длина командной строки в символах, далее располагаются строки символов, оканчивающиеся нулевым символом и соответствующие каждому параметру командной строки; после последней строки записан символ 0Dh.
Рис. 1.5. Структура префикса программного сегмента
1.2. ПОРЯДОК ВЫПОЛНЕНИЯ РАБОТЫ N 1
Для подготовки к работе необходимо ознакомится с порядком ее проведения и индивидуальным заданием. Рекомендуется по ходу выполнения работы оформлять отчет с записью результатов в шестнадцатеричной системе счисления.
1.2.1. СПИСОК РАСПРЕДЕЛЕНИЯ ПАМЯТИ. Для получения списка распределения памяти MS-DOS выполните следующие действия:
1) используя отладчик (DEBUG, AFD и др.) выполните прерывание 21H кодом запроса AH=52H и получите адрес списка списков MS-DOS в регистрах ES: BX (см. п. 1.1.3);
2) вычислите сегментный адрес первого блока памяти, для чего от адреса в ES: BX вычтите смещение 2 и прочитайте по этому адресу значение;
3) последовательно просматривая список блоков памяти с помощью отладчика, запишите в отчет данные по следующей форме (п. 1.1.4): тип блока: сегмент PSP владельца: размер блока: имя программы; вычислите объем распределенной и свободной памяти ПЭВМ;
1.2.2. ВЫДЕЛЕНИЕ ПАМЯТИ. Для получения блока памяти от MS-DOS, используя отладчик, выполните прерывание 21H с кодом запроса AH=48H и длиной блока в BX; получите в AX сегментный адрес выделенного блока; проконтролируйте нулевое состояние флага переноса (CF) после возврата из прерывания; запишите в отчет полученный адрес; просмотрите список распределения памяти и удостоверьтесь в появлении нового описателя блока (см. п. 1.2.1).
1.2.3. ПЕРЕРАСПРЕДЕЛЕНИЕ ПАМЯТИ. Для перераспределения памяти выполните прерывание 21H с кодом запроса AH=4AH, сегментным адресом ранее полученного блока в ES и новой его длиной в BX; проконтролируйте нулевое состояние флага переноса (CF) после возврата из прерывания 21H; запишите в отчет максимально возможный размер для блока; просмотрите список распределения памяти и удостоверьтесь в изменении размера блока (см. п. 1.2.1).
1.2.4. ОСВОБОЖДЕНИЕ ПАМЯТИ. Для освобождения блока памяти выполните прерывание 21H с кодом запроса AH=49H и сегментным адресом освобождаемого блока в ES; проконтролируйте успешное завершение операции; просмотрите список распределения памяти и удостоверьтесь в изменении размера блока (см. п. 1.2.1).
1.3. ИНДИВИДУАЛЬНЫЕ ЗАДАНИЯ К РАБОТЕ N 1.
Выполнение индивидуального задания заключается в исследовании особенностей механизма управления памятью и получение системных таблиц операционной системы MS-DOS.
Задание 1. Написать программу вывода на экран списка системных списков MS-DOS.
Задание 2. Написать программу вывода на экран списка распределения памяти.
Задание 3. Написать программу вывода на экран префикса программного сегмента (PSP) текущей программы (используйте прерывание переменную _psp в языке C).
Задание 4. Написать программу вывода на экран префикса программного сегмента (PSP) текущей программы (используйте переменную _psp в языке C).
Задание 5. Написать программу вывода на экран командной строки из префикса программного сегмента (PSP) для всех блоков памяти MS- DOS.
Задание 6. Написать программу вывода на экран переменных среды (массив строк символов) текущей исполняемой программы (используйте переменную _psp в языке C).
Задание 7. Написать программу, моделирующую фрагментацию оперативной памяти MS-DOS.
Задание 8. Написать программу, запрашивающую блок памяти и не освобождающую его перед завершением работы. Получите список распределения памяти для этого случая.
Задание 9. Написать программу, освобождающую не принадлежащий ей блок памяти. Установите последствия работы такой программы.
Задание 10. Написать программу, оценивающую эффективность использования оперативной памяти (вычислить отношение объема свободной памяти к размеру максимально больного блока, который может быть выделен).
Задание 11. Написать программу, сообщающую о фрагментации памяти и о программах, ее вызвавшей.
Задание 12. Написать программу, сообщающую о максимальном размере свободного блока памяти.
Задание 13. Исследовать стратегии распределения памяти в MS- DOS (см. описание прерывания INT 21H с кодом запроса AH=58H) и оценить их эффективность.
Задание 14. Исследовать возможные ситуации при перераспределении памяти и написать моделирующею их программу с отображением результата на экране.
1.4. КОНТРОЛЬНЫЕ ВОПРОСЫ К РАБОТЕ N 1
1). Назначение и функции операционной системы.
2). Карта памяти ПЭВМ при работе с MS-DOS.
3). Вызов операционной системы (запрос на обслуживание).
4). Список списков MS-DOS.
5). Получение адреса первого описателя блока памяти.
6). Описатель блока памяти MS-DOS и его структура.
7). Типы блоков памяти MS-DOS.
8). Функции управления памятью MS-DOS.
9). Список описателей блоков памяти MS-DOS.
10). Вычисление адреса следующего описателя блока памяти.
11). Стратегия выделения, освобождения и перераспределения блока памяти в MS-DOS.
12). Фрагментация памяти в MS-DOS.
13). Префикс программного сегмента.
14). Структура командной строки запуска программы из префикса программного сегмента.
