Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаб_01 (XMS) Управление XMA.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
423.94 Кб
Скачать

3. Использование драйвера himem.Sys для программирования.

Спецификация XMS содержит описание программного интерфейса драйвера HIMEM.SYS и рекомендации по использованию области памяти НМА.

3.1. Проверка подключения драйвера

Первое, что должна сделать программа, которая собирается вызывать драйвер HIMEM.SYS, - проверить, был ли установлен этот драйвер при загрузке операционной системы.

Для этого надо загрузить в регистр АХ значение 4300h и вызвать прерывание INT 2Fh. Если регистр AL будет содержать значение 80h, драйвер установлен, в противном случае - нет. Приведем фрагмент программы, проверяющей подключение драйвера:

Проверяем, установлен ли драйвер HIMEM.SYS:

mov ax. 4300h

int 2fh

cmp aI, 80h

je hmm_installed; Выполняем переход, если драйвер установлен.

3.2. Получение адреса управляющей программы

Для вызова драйвера программа должна получить адрес специальной управляющей программы, которая выполняет все функ­ции по обслуживанию расширенной памяти и области НМА.

Этот адрес можно получить, если загрузить в регистр АХ значение 4310h и вызвать прерывание INT 2Fh. Прерывание возвратят сегментный адрес управляющей программы в регистре ES, смещение - в регистре ВХ:

Получаем адрес управляющей функции драйвера

mov ax, 4310h

int 2fh

mov word ptr cs:[HMMEntry][0]. bx

mov word ptr cs : [HMMEntry][2], es

В дальнейшем полученный адрес используется для выполнения функций по обслуживанию расширенной памяти. Программы, которые обращаются к управляющей функции, должны перед вызовом функции иметь размер стека не менее 256 байтов.

3.3. Описание функции драйвера h1mem.Sys

Все функции драйвера H1MEM.SYS могут быть разделены на следующие пять групп:

- функции получения информации о драйвере (0h);

- функции управления областью НМА (lh, 2h);

- функции управления линией А20 (3h...7h);

- функции управления расширенной памятью (8h,.Fh);

- функции управления блоками UMB (10h,.llh).

Приведем подробное описание этих функций в соответствии со спецификацией XMS версии 2.0.

Получить версию XMS:

На входе AH = 00h.

На выходе AX = номер версии XMS

BX = номер внутренней модификации драйвера;

DX = 0001h –если существует область HMA;

0000h – если область HMA не существует

Ошибки: Нет

Функция возвращает номера версии и модификации XMS в двоично-десятичном (BCD) формате. Например, если AX=0250h, это означает, что драйвер реализует спецификацию XMS версии 2.50. Дополнительно функция позволяет проверить наличие в системе области НМА.

Запросить область НМА

На входе: АН =0lh;

DX = размер памяти в байтах в области НМА, которая будет использоваться резидентными программами или драйверами, обычная программа должна использовать значение DX = FFFFh.

На выходе АХ = 000lh - если функция выполнена успешно,

0000h - если произошла ошибка.

Ошибки: BL = 80h, 81h, 90h, 91h, 92h (описание кодов ошибок будет приведено после описания всех функций).

С помощью этой функции программа может зарезервировать для себя область НМА. Задаваемый в регистре DX размер памяти сравнивается с указанным в параметре драйвера /HMAMIN=. Область НМА распределяется запросившей программе только в том случае, если запрошенный в регистре DX размер больше или равен указанному в параметре /HMAMIN. Такой механизм позво­ляет ограничить использование области НМА только теми программами, которые используют ее наилучшим образом,

Поясним это на примере. Пусть при инициализации операционной системы из файла AUTOEXEC.BAT запускаются две программы. Одна из них использует 10 килобайт из области НМА и запускается первой (в регистре DX функции 0lh эта программа указывает значение 10240). Вторая запускаемая программа использует 40 килобайт и запускается после первой. Очевидно, что вторая программа использует область НМА более эффективно. Но т. к. область НМА уже распределена первой программе, вторая программа не сможет ее использовать.

Задавая параметр /HMAMIN=40, мы запретим распределение области НМА тем программам, которые используют в ней меньше 40 килобайт. Теперь первая программа не получит доступ к области нма, даже если она будет запускаться до второй, использующей 40 килобайт памяти из области НМА.

Освободить область НМА:

На входе: АН = 02h.

На выходе: AX = 000lh - если функция выполнена успешно,

0000h - если произошла ошибка.

Ошибки: BL= 80h, 81h, 90h,93h.

Программы, которые запрашивали область НМА, должны освободить ее с использованием этой функции. При этом данные, которые находились в этой области, будут потеряны.

После того как программа освободила область НМА, эта область становится доступной другим программам.

Глобальное открывание линии А20

На входе: АН = 03h.

На выходе: AX = 000lh - если функция выполнена успешно,

0000h - если произошла ошибка.

Ошибки: BL = 80h, 81h, 82h.

Эта функция предназначена для тех программ, которые будут использовать область НМА. Она разрешает работу заблокирован­ной по умолчанию 21-й адресной линии процессора. Перед возвратом управления системе программа должна закрыть линию А20 с помощью функции 04h.

Следует отметить, что на многих типах компьютеров переключение линии А20 достаточно медленная операция.

Глобальное закрывание линии. А20

На входе: AH = 05h

На выходе: AX = 000lh - если функция выполнена успешно,

0000h - если произошла ошибка.

Ошибки: 80h, 81h, 82h, 94h.

Эта функция предназначена для тех программ, которые используют область НМА. Она должна выполняться перед завершением работы такой программы.