Операционная система MS DOS (том 2)

         

Управление памятью


В MS-DOS версии 5.0 стал документирован блок управления памятью MCB. Приведем формат этого блока.



(00h) 1 Тип блока: 4Dh для всех блоков, кроме последнего. Для последнего блока используется значение 5Ah.
(01h) 2 Сегментный адрес блока PSP

программы-владельца данного MCB или значение 0008h

для MCB, принадлежащего MS-DOS. Для свободного блока MCB в этом поле находится значение 0000h.

(03h) 2 Размер блока MCB в параграфах.
(05h) 3 Не используются.
(08h) 8 ASCII-имя программы-владельца блока MCB, если это блок PSP.

Самый первый блок MCB является сегментом данных MS-DOS. Он делится на подсегменты, в которых расположены драйверы, системные данные, буфера и т.д.

Приведем формат управляющего блока подсегмента для первого блока MCB. Этот управляющий блок расположен непосредственно перед соотвестсвующим ему подсегментом.

(00h) 1 Тип подсегмента:

"D" - драйвер устройства;

"E" - расширение драйвера устройства;

"I" - драйвер инсталлируемой файловой системы IFS;

"F" - область памяти для управляющего блока оператора "FILES=";

"X" - область памяти для управляющего блока оператора "FCBS=";

"C" - рабочая область для буферов EMS, если используется оператор "BUFFERS /X";

"B" - рабочая область для буферов, если используется оператор "BUFFERS";

"L" - область памяти для массива структур текущих каталогов;

"S" - сегмент памяти для оператора "STACKS=";

"T" - сегмент памяти для оператора "INSTALL=".

(01h) 2 Параграф, начиная с которого располагается данный подсегмент. Обычно это следующий за управляющим блоком параграф.
(03h) 2 Размер подсегмента в параграфах.
(05h) 3 Не используются.
(08h) 8 Для подсегментов "I" и "D"

в этом поле находится имя файла, из которого был загружен драйвер.

Кроме рассмотренных выше, в MS-DOS версии 5.0 появился новый тип управляющего блока памяти - UMCB


- управляющий блок для верхней области памяти UMB (Upper Memory Block):

(00h) 1 Тип блока: 4Dh для всех блоков, кроме последнего. Для последнего блока используется значение 5Ah.
(01h) 2 Первый доступный в верхней памяти UMB
параграф для самого первого блока UMCB, 000Ah - если управляющий блок расположен в конце UMB.
(03h) 2 Размер блока UMB в параграфах.
(05h) 3 Не используются.
(08h) 8 Тип блока: "UMB" для начального блока, "SM" - для конечного.

Начиная с версии 3.0 MS-DOS содержит функцию 58h
прерывания INT21h, позволяющую определять и изменять стратегию выделения памяти запущенным программам. В версии 5.0 добавились новые возможности, в частности, возможность выделения блоков верхней памяти, используемых только в MS-DOS версии 5.0.
Регистры на входе:

Регистр Содержимое
AH 58h
AL Подфункция:
00h - определить используемую стратегию;

01h - установить стратегию;

02h - получить состояние списка блоков верхней памяти UMB;

03h - установить состояние списка блоков верхней памяти UMB.
BL Подфункция 01h - новая стратегия:
00h - первым заполняется первый свободный участок в области младших адресов памяти;

01h - аналогично, но используется участок памяти, наилучшим образом подходящий для запроса;

02h - аналогично, но используется последний свободный участок памяти;

40h ,41h 42h - аналогично 00h, 01h, 02h, но используются старшие адреса памяти;

80h, 81h, 82h - аналогично 00h, 01h, 02h, но сначала делается попытка выделить старшие адреса памяти, а в случае неудачи - младшие.
Подфункция 03h - новое состояние списка блоков верхней памяти:
BX = 0000h - удалить блоки UMB из списка блоков памяти DOS;

BX = 0001h - добавить блоки UMB в список блоков памяти DOS.
BH Подфункция 01h - новая стратегия:
Равен 00h.

Регистры на выходе:

Регистр Содержимое
AX Подфункция 00h - определить стратегию:
AX = код используемой стратегии (см. выше).
Подфункция 02h - определитьсостояние списка блоков верхней памяти:
AL = 00h - блоки UMB удалены из списка блоков памяти DOS;

AL = 01h - блоки UMB входят в список блоков памяти DOS.
<


В версии 5.0 MS- DOS появились функция для непосредственного выделения программам блоков старшей памяти HMA. Это функция 4A02h:
Регистры на входе:

Регистр Содержимое
AX 4A02h
BX Размер выделяемого блока памяти в байтах (после возврата содержимое этого регистра будет уничтожено).

Регистры на выходе:

Регистр Содержимое
ES:DI Адрес выделенного блока памяти или FFFF:FFFF
в случае неудачи.

Прежде чем пользоваться только что описанной функцией, имеет смысл определить размер свободной старшей памяти при помощи функции 4A01h:
Регистры на входе:

Регистр Содержимое
AX 4A01h

Регистры на выходе:

Регистр Содержимое
BX Размер доступной области старшей памяти в байтах или 0000h, если DOS не использует область HMA.
ES:DI Адрес начала доступной области старшей памяти или FFFF:FFFF, если DOS не использует область HMA.
Содержание раздела