Управление памятью
В 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. |