Оперативная память

         

но в это же время Microsoft



Примерно в это же время Microsoft в связи с разработкой Windows заинтересовалась EMS и принимала активное участие в разработке ее последующих версий. В 1987 году была опубликована версия 4.0, которая предусматривала возможность размещения и выполнения нескольких задач в расширенной памяти. Автору неизвестно существование более поздних версий EMS, но для изложения материала это не существенно, т. к. соблюдается строгая преемственность версий и то, что описано в данном разделе может использоваться в ваших программах.

Менеджер расширенной памяти (Expanded Memory Manager или EMM) оформлен в виде драйвера, который располагается в оперативной памяти при загрузке DOS и остается резидентным до выключения ПК. Обычно его имя EMM386.EXE, оно обязательно указывается в файле config.sys, например, так:

DEVICE = C:\DOS\EMM386.EXE

В данном случае предполагается, что файл Еммзвб.ЕХЕ расположен на диске С, в каталоге DOS. Драйвер многофункциональный, поэтому после его имени в командной строке могут указываться параметры, которые используются при загрузке. Описание всех параметров вы найдете в файле HELP, входящем в комплект DOS

Важно
Один из параметров, а именно NOEMS запрещает поддержку описываемых ниже функций драйвера, поэтому его указание в командной строке недопустимо.

EMS 4.0 исполняет 30 различных функций, разделенных на три группы: стандартные (standard), расширенные (advanced) и для многозадачных режимов (os). Нас будут интересовать только стандартные функции, необходимые для работы с данными, расположенными в расширенной памяти, их всего 7. Описание остальных функций вы найдете в TECH HELP или в специальной литературе по работе с DOS.

Доступ к драйверу осуществляется через прерывание int 67h. Перед выдачей запроса код функции помещается в регистр ah (старший байт регистра ах). Регистр ai используется либо для уточнения запрашиваемой функции (для advanced и os), либо для указания параметров функции. В случае успешного исполнения запроса EMM возвращает в регистре ah 0, а случае неудачного — 1.

EMS 4.0 фиксирует 36 различных ошибок, им присваиваются коды от 80п до ОА4п включительно. Полный список ошибок содержится в TECH HELP, некоторые из них будут названы при описании функций. Ошибки возникают по разным причинам. На стадии отладки они, чаще всего, вызваны некорректностью программы. Если корректность программы не вызывает сомнений и задача неоднократно выполнялась успешно, то имеет смысл посмотреть, какие параметры EMM386 заданы в файле config.sys. Например, если указан параметр NOEMS, то при запросах памяти обязательно будет возникать "внутренняя ошибка EMM драйвера", имеющая код еоь.

Описание стандартных функций. К категории стандартных относятся следующие функции драйвера EMM.

Функция 40h Get EMM status предназначена для получения информации о состоянии драйвера. Входные параметры отсутствуют. Результат проверки возвращается в регистре ah. Если он очищен, то все в порядке. Код 8lh означает неисправность расширенной памяти, других кодов ошибки в данном случае не должно быть. В случае ошибки надо прекратить выполнение задачи и проверить состояние системного программного обеспечения.

Функция 41h Get Physical Segment Address of EMS Frame возвращает зна-
чение сегмента, используемого для доступа к расширенной памяти. Входные параметры отсутствуют, код сегмента указан в регистре bx. Его надо сохранить и при чтении или записи данных помещать в один из сегментных регистров. Код сегмента зависит от конфигурации оборудования, установленного на компьютере, в процессе выполнения задачи он не может и не должен изменяться. Размер сегмента 64 Кбайт, он делится на 4 страницы по 16 Кбайт каждая. Адреса (смещения) страниц равны 0, 4000h, s000h и осоооь.

Функция 42h Get EMS Memory size позволяет определить общее и свободное пространство expanded memory. Входные параметры у нее отсутствуют. Общий размер памяти возвращается в регистре dx, а размер свободного пространства — в bx. Обе величины указаны в виде количества страниц, размер страницы равен 16 Кбайт.

Обычно не вся внешняя память ПК используется как expanded memory. Часть ее занимает DOS и другие резидентные программы. Кроме того, при установке EMM (в файле config.sys) может быть указан размер доступного для него пространства ОЗУ. Поэтому не следует ожидать, что находящееся в регистре dx количество страниц всегда соответствует размеру старшей памяти ПК.

Для выполнения задачи важно знать размер свободной части памяти, т. е. количество страниц, указанное в регистре bx. При программировании задачи необходимо предусмотреть проверку доступного размера памяти и выбор дальнейших действий в зависимости от его значения.



ФуНКЦИЯ 43h Allocate Memory and Open EMM handle запрашивается для выделения требуемого пространства расширенной памяти. Входным параметром является необходимое количество страниц, указываемое в регистре bx. При успешном выполнении функции в регистре dx возвращается EMM Handle — идентификатор выделенного блока, который используется при запросах других функций драйвера. Его обязательно надо сохранить.

Два специальных кода ошибок означают, что запрошено слишком много страниц. Код 87h выдается, если общее пространство expanded memory меньше запрошенного размера, а код 88h означает, что недостаточно свободного пространства памяти. Если вы предварительно проверяли свободную память с помощью функции 42h, то эти две ошибки не должны возникать, в противном случае надо прекратить выполнение задачи.
Выделенное пространство закреплено за задачей, но перед записью или чтением данных надо отображать его конкретную часть на рабочий сегмент, значение которого возвращает функция 4ih. Как уже говорилось ранее, в этом сегменте размещается 4 страницы. Для отображения 16 Кбайт ОЗУ на одну из этих страниц предназначена функция 44h.

Функция 44h Map Memory связывает физическую страницу с логической. Входными параметрами являются номера физической (ai) и логической (bx) страниц и EMM handle (dx). Номер физической страницы может изменяться от 0 до 3, а номер логической страницы — от 0 до n-i, где n — количество страниц, выделенное функцией 43h.
Возможные ошибки имеют следующие коды: 83h — неверно задан идентификатор блока (EMM handle), 8Ah — логическая страница вне диапазона значений, выделенных функцией 43h, 8Bh — недопустимая физическая страница.

После отображения логическая страница доступна для использования. Для работы с полным сегментом (65 536 байт) функция 44h выполняется 4 раза. При этом не обязательно указывать физические и логические страницы в порядке увеличения их номеров.

Функция 45h Release Memory освобождает пространство памяти, выделенное для задачи функцией 43п. Входным параметром является идентификатор блока, указываемый в регистре dx. Отказ от выполнения функции может быть связан только с его неправильным заданием.

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

Функция 46h Get EMM version number позволяет определить версию менеджера EMM. Входные параметры отсутствуют, номер версии в двоично-десятичном коде возвращается в регистре ai. Например, версии 6.2 соответствует КОД 62п.
Таким образом, при использовании стандартного набора функций дра EMM задача получает возможность резервирования нужного простран в дополнительной памяти ПК и размещения в нем данных.



Содержание раздела