Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых

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

[Назад] [Содеожание] [Дальше]