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

INT31h,AX= Выделить память ниже границы 1 Мб

Вход: AX=0100h

ВХ = требуемый размер в 16-байтных параграфах

Выход: если CF = О,

АХ - сегментный адрес выделенного блока для использования в реаль­ном режиме;

DX - селектор выделенного блока для применения в защищенном ре­жиме

Обработчик этой функции выходит в V86 и вызывает функцию DOS 48h для

выделения области памяти, которую потом можно использовать для передачи

данных между нашей программой и обработчиками прерываний, возвращающи­ми структуры данных в памяти.

INT31h,AX= 0101 к Освободить память ниже границы 1 Мб Вход: АХ = 0102h

DX = селектор освобождаемого блока

Выход: CF = 0, если не было ошибок

Ш31кАХ = 0102h: Изменить размер блока, выделенного функцией OlOOh Вход:   AX = 0102h

ВХ - новый размер блока в 16-байтных параграфах DX = селектор модифицируемого блока

Выход: CF = 0, если не было ошибок

INT31h,AX= 0500k Получить информацию о свободной памяти Вход:  АХ = 0500h

ES:EDI = адрес 48-байтного буфера

Выход: CF = 0 всегда, буфер заполняется следующей структурой данных:

+00h: 4 байта - максимальный доступный блок в байтах

+04h: 4 байта - число доступных нефиксированных страниц

+08h: 4 байта - число доступных фиксированных страниц

+0Ch: 4 байта - линейный размер адресного пространства в страницах

+10h: 4 байта - общее число нефиксированных страниц

+14h: 4 байта - общее число свободных страниц

+18h: 4 байта - общее число физических страниц

+1СЬ: 4 байта - свободное место в линейном адресном пространстве

+20h: 4 байта - размер swap-файла или раздела в страницах

+24h: ОСЬ байт- все байты равны FFh

INT 31 h, АХ= 0501k Выделить блок памяти Вход: АХ = 0501Ь

ВХ:СХ = размер блока в байтах, больше нуля Выход: если CF = О,

ВХ:СХ = линейный адрес блока;

SI:DI = идентификатор блока для функций 0502 и 0503

INT31h, АХ = 0502h: Освободить блок памяти Вход:   АХ - 0502h

SI:DI = идентификатор блока Выход: CF = 0, если не было ошибки

INT31h,AX= 0503h: Изменить размер блока памяти Вход:  АХ = 0503h

ВХ:СХ = новый размер в байтах

SLDI = идентификатор блока

Выход: если CF = О,

ВХ:СХ = новый линейный адрес блока;

SLDI = новый идентификатор

Нам потребуются еще две функции DPMI для работы с устройством, которое

отображает свою память в физическое пространство адресов.

Ш3Ш, АХ = 0800h: Отобразить физический адрес выше границы 1 Мб на ли­нейный

Вход:   ВХ:СХ = физический адрес

SI:DI = размер области в байтах

Выход: если CF - О, ВХ:СХ = линейный адрес, который можно использовать для доступа к этой памяти

АХ = OSOlk. Отменить отображение, выполненное функцией

Вход: АХ = 08011т

ВХ:СХ = линейный адрес, возвращенный функцией 0800h

Выход: CF = 0, если не было ошибок