Аппаратное обеспечение IBM PC© Александр Фролов, Григорий ФроловТом 2, книга 1, М.: Диалог-МИФИ, 1992. 11.5. Дополнительные функции EMMДополнительные функции используются резидентными программами, драйверами и мультизадачными приложениями. Кроме того, с помощью этих функций можно выполнять пересылку массивов в дополнительной и стандартной памяти, а также организовать подкачку и выполнение программных модулей в дополнительной памяти. Обратите внимание, что использование расширенной памяти в спецификации XMS позволяет выполнять программные модули (с ограничениями) только в области HMA размером примерно 64 килобайта. Остальная расширенная память может быть использована только для хранения данных. Специальные функции с номерами 47h - 4Eh поддерживаются EMM версии 3.2, функции с номерами 4Fh - 58h - только EMM версии 4.0. 11.5.1. Сохранить контекст отображения
На входе: AX = 4700h;
DX = индекс EMM.
На выходе: AH = байт состояния EMM.
Эта функция предназначена для использования драйверами и резидентными программами. Прежде чем работать с дополнительной памятью, такие программы должны сохранить текущий контекст отображения логических страниц. Перед возвратом управления прикладной программе контекст должен быть восстановлен с помощью функции 48h. 11.5.2. Восстановить контекст отображения
На входе: AX = 4800h;
DX = индекс EMM.
На выходе: AH = байт состояния EMM.
Функция позволяет восстановить контекст отображения логических страниц пула, сохраненный предыдущей функцией. 11.5.3. Определить количество страниц в пуле
На входе: AX = 4B00h;
DX = индекс EMM.
На выходе: AH = байт состояния EMM;
BX = количество логических страниц в пуле.
Функция возвращает количество логических страниц дополнительной памяти для выбранного пула. 11.5.4. Определить количество активных пулов
На входе: AX = 4C00h;
DX = индекс EMM.
На выходе: AH = байт состояния EMM;
BX = количество активных пулов дополнительной
памяти.
Функция предназначена для определения количества текущих активных пулов и может вызываться перед использованием следующей функции (с номером 4Dh). 11.5.5. Получить информацию о пулах
На входе: AX = 4D00h;
ES:DI = адрес буфера для информации.
На выходе: AH = байт состояния EMM;
BX = количество активных пулов дополнительной
памяти.
После вызова функции буфер заполняется как массив структур, содержащих два 16-битовых слова. Первое слово содержит индекс пула, второе - количество логических страниц в этом пуле. 11.5.6. Получить/установить отображение всех страниц
На входе: AH = 4Eh;
AL = код подфункции:
0 - получить содержимое всех регистров
отображения в буфер ES:DI;
1 - восстановить содержимое всех регистров
отображения из буфера ES:DI;
2 - получить и установить все регистры
отображения в буфер ES:DI
или восстановить из буфера ES:DI
(т.е. комбинация подфункций 0 и 1);
3 - Определить размер требуемого буфера;
ES:DI = адрес буфера для информации;
На выходе: AH = байт состояния EMM;
AL = для подфункции 3 - размер буфера.
Эта функция предназначена для поддержки мультизадачности. Она позволяет быстро изменять контекст дополнительной памяти при переключении с одного процесса на другой. 11.5.7. Получить/установить отображение части страниц
На входе: AH = 4Fh;
AL = код подфункции:
0 - получить содержимое регистров
отображения в буфер ES:DI;
1 - восстановить содержимое регистров
отображения из буфера ES:DI;
2 - определить размер требуемого буфера;
ES:DI = адрес буфера для информации;
DS:SI = адрес массива 16-битовых слов,
содержащих сегментные адреса страниц,
для которых необходимо сохранить
контекст отображения; самое первое
слово массива - это размер массива
в словах.
На выходе: AH = байт состояния EMM;
AL = для подфункции 2 - размер буфера.
Функция работает аналогично предыдущей, но позволяет сохранять контексты только для некоторых страниц. Это экономит время, необходимое для сохранения/восстановления. 11.5.8. Отображение/запрещение группы страниц
На входе: AH = 50h;
AL = код подфункции:
0 - разрешить или запретить отображение
страниц, используя номера страниц;
1 - аналогично подфункции 0, но
используются не номера страниц, а
адреса сегментов;
DS:SI = адрес массива структур, состоящий из
двух слов, первое слово - номер
логической страницы, второе -
номер физической страницы;
указание логической страницы 0FFFFh
запрещает отображение страницы;
CX = размер массива DS:SI в количестве
структур.
На выходе: AH = байт состояния EMM.
Функция позволяет за один вызов разрешить и запретить использование нескольких страниц. 11.5.9. Изменение размера пула
На входе: AX = 5100h;
BX = новый размер пула в логических страницах;
DX = индекс EMM.
На выходе: AH = байт состояния EMM.
С помощью этой функции программа может изменить размер уже заказанного ранее пула страниц дополнительной памяти. 11.5.10. Получить/установить атрибуты пула
На входе: AH = 52h;
AL = код подфункции:
0 - получить атрибуты пула;
1 - установить атрибуты пула;
2 - определить возможность использования
атрибута неразрушаемой памяти;
BL = новые атрибуты;
DX = индекс EMM.
На выходе: AH = байт состояния EMM;
AL = для подфункции 0: атрибуты пула;
для подфункции 2:
0 - атрибут неразрушаемой памяти
недоступен;
1 - атрибут неразрушаемой памяти
доступен.
Функция дает возможность установить для некоторых пулов атрибут неразрушаемой памяти. Содержимое таких пулов не исчезает при теплой перезагрузке операционной системы (после нажатии комбинации клавиш Ctrl-Alt-Del). 11.5.11. Установить/прочитать имя пула
На входе: AH = 53h;
AL = код подфункции:
0 - получить имя пула;
1 - установить имя пула;
ES:DI = адрес буфера имени пула, длина
этого буфера должна быть 8 байтов;
DX = индекс EMM.
На выходе: AH = байт состояния EMM.
Функция предназначена для использования в мультизадачной среде. Она позволяет нескольким процессам, работающим одновременно, использовать одни и те же именованные пулы дополнительной памяти. 11.5.12. Найти имя пула
На входе: AH = 54h;
AL = код подфункции:
0 - получить каталог пулов;
1 - найти пул по имени;
2 - определить количество открытых пулов;
DS:SI = адрес буфера имени пула для
подфункции 1, длина
этого буфера должна быть 8 байтов;
ES:DI = адрес массива 10-байтовых элементов;
в первое слово элемента будет
записан индекс пула, в остальные 8 -
имя пула.
На выходе: AH = байт состояния EMM;
AL = количество элементов в массиве
(подфункция 0);
DX = индекс найденного пула (для
подфункции 1);
BX = количество открытых пулов (для
подфункции 2).
Эта функция позволяет определить индекс пула по его имени или получить каталог всех именованных пулов. 11.5.13. Отобразить страницу и перейти по адресу
На входе: AH = 55h;
AL = код подфункции:
0 - использовать массив номеров
физических страниц;
1 - использовать массив сегментных
адресов;
DS:SI = адрес структуры MapAndJump длиной
9 байтов.
На выходе: AH = байт состояния EMM.
Эта функция предназначена для перекачки страниц исполняемого кода в память и последующего выполнения этого кода. Первые четыре байта структуры MapAndJump содержат смещение и сегментный адрес, по которым должен быть выполнен переход. Следующий байт - количество элементов в таблице отображения. Последние 4 байта содержат FAR-адрес таблицы отображения, состоящей из 4-байтовых элементов. Первое слово элемента таблицы отображения - номер логической страницы, второе - номер физической страницы. 11.5.14. Отобразить страницу и вызвать процедуру
На входе: AH = 56h;
AL = код подфункции:
0 - использовать массив номеров
физических страниц;
1 - использовать массив сегментных
адресов;
2 - получить размер стека, необходимого
для использования подфункций 0 и 1;
DS:SI = адрес структуры MapAndCall длиной
22 байта.
На выходе: AH = байт состояния EMM;
BX = требуемый размер стека (заполняется при
выполнении подфункции 2).
Функция работает аналогично предыдущей, но не передает управление исполняемому коду, а вызывает его как процедуру. Первые 9 байтов структуры MapAndCall соответствуют структуре MapAndJump. Далее идет еще один байт длины таблицы отображения и 4 байта адреса другой таблицы отображения. Вторая таблица описывает отображение страниц, которое будет установлено после вызова процедуры. Последние 8 байтов структуры зарезервированы для дальнейшего использования. 11.5.15. Переслать/обменять область памяти
На входе: AH = 57h;
AL = код подфункции:
0 - переслать область памяти;
1 - обменять область памяти;
DS:SI = адрес структуры MoveInfo длиной
18 байтов.
На выходе: AH = байт состояния EMM.
Функция предназначена для выполнения перемещения или обмена содержимого областей стандартной или дополнительной памяти. Возможно перекрытие исходной и результирующей областей памяти. Максимальный размер блоков, над которыми эта функция может выполнять операции - 1 мегабайт. Структура MoveInfo содержит всю необходимую информацию о расположении блоков памяти:
Смещение Размер Описание
(+0) 4 Размер блока в байтах
(+4) 1 Тип исходной памяти:
0 - стандартная, 1 - EMS
(+5) 2 Индекс исходной памяти:
0 для стандартной памяти,
индекс пула для EMS
(+7) 2 Смещение для исходной памяти (внутри
сегмента или страницы)
(+9) 2 Адрес исходного сегмента или номер
для исходной страницы
(+11) 1 Тип результирующей памяти:
0 - стандартная, 1 - EMS
(+12) 2 Индекс результирующей памяти:
0 для стандартной памяти,
индекс пула для EMS
(+14) 2 Смещение для результирующей памяти
(внутри сегмента или страницы)
(+16) 2 Адрес результирующего сегмента или
номер для исходной страницы
Получить массив адресов отображения
На входе: AH = 58h;
AL = код подфункции:
0 - получить массив отображения;
1 - получить размер массива отображения;
ES:DI = адрес буфера для массива отображения.
На выходе: AH = байт состояния EMM;
CX = количество элементов в массиве
отображения (для подфункции 1)
Массив отображения, получаемый при помощи этой функции, состоит из 4-байтовых элементов. Первое слово элемента содержит адрес сегмента, второе - номер физической страницы, соответствующей этому адресу. |

