Аппаратное обеспечение 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-байтовых элементов. Первое слово элемента содержит адрес сегмента, второе - номер физической страницы, соответствующей этому адресу. |