ЪДДДДДДДДДД¬ ¦ ¦ ¦ 2¦ ¦ ГДДДДДДДДДДДДДДДДґ О
¦ ¦ ¦ ¦ ¦ 3¦ ¦ ГДДДДДДДДДДДДДДДДґ
¦ E ¦ДДДДДДДДДДДДДДДДДЩ АДДЩ ¦ ГДДДДДДДДДДДДДДДДґ 16Kb
¦ ¦ ¦ ¦ ГДДДДДДДДДДДДДДДДґ
АДДДДДДДДДДЩ АДДДДДДДДДДДДДДДДДДДДЩ АДДДДДДДДДДДДДДДДЩ ДЩ
Рис.7-3. Моментальный снимок расширенной памяти с приоритетной
и фоновой задачами. В настоящий момент активна приоритетная задача
A - программа буферизации принтера (фоновая задача), владеет об-
работчиками 1 и 3;
B - обработчик;
C - номер логической страницы;
D - номер физической страницы;
E - электронная таблица (приоритетная задача), владеет
обработчиком 2 в обычной памяти.
(ки) будет размещен для нее менеджером расширенной памяти, две
программы, разработанные так, чтобы разделять данные в расширен-
ной памяти, должны подготовить некоторые средства для передачи
номеров обработчиков во время выполнения.
В спецификации расширенной памяти LIM 4.0 разделение данных
в расширенной памяти сделано немного более легким путем обеспече-
ния возможности связывания с обработчиком 8-символьного имени.
Для поддержки данной способности были введены две функции менед-
жера расширенной памяти: "Получить/установить имя обработчика"
(функция 20) и "Получить каталог обработчика" (функция 21).
Подфункция 00h функции 20, "Получить имя обработчика", возв-
ращает 8-символьное имя, связанное с обработчиком, переданным
функции. Подфункция 01h, "Установить имя обработчика", связывает
8-символьную строку с указанным номером обработчика. Не сущест-
- 7-40 -
вует ограничений на символы, используемые для формирования имени,
и все 8 символов являются значащими (имя не является строкой
ASCII, завершающейся байтом "Пусто" - нулями). Обработчик без
имени приобретет имя, состоящее из 8 байтов двоичных нулей (или
"Пусто" ASCII, если Вам это предпочтительнее). Имя обработчика
устанавливается в "Пусто" при инициализации менеджера расширенной
памяти, когда обработчик размещается и когда обработчик освобож-
дается. Вы можете изменить имя обработчика в любое время, включая
сброс его в нули. Единственное ограничение состоит в том, что не
разрешается двум обработчикам иметь одинаковые имена.
Менеджер расширенной памяти обеспечивает функцию 21, "Полу-
чить каталог обработчика", для определения того, какой обработчик
связан с конкретным именем или для обеспечения таблицы имен обра-
ботчиков, связанных с каждым активным обработчиком. Подфункция
00h, "Получить каталог обработчика", возвращает эту таблицу в об-
ласть данных, предоставленную пользователем. Поскольку специфика-
ция поддерживает до 255 обработчиков, 8-байтовое имя обработчика
плюс 2-байтовое значение обработчика, целая таблица может потре-
бовать до 2550 байтов. Фактическое число обработчиков, поддержи-
ваемых менеджером расширенной памяти, может быть получено с по-
мощью подфункции 02h, "Получить общее количество обработчиков".
Умножив это число на 10, получаем размер области, необходимой для
сохранения каталога обработчиков. Подфункция 01h, "Искать имено-
ванный обработчик", обеспечивает для программы поиск обработчика,
связанного с данным именем, без необходимости просмотра всего ка-
талога обработчиков или запроса имени, связанного с каждым номе-
ром обработчика.
Выполнение кода в расширенной памяти
Всегда было возможно использовать память спецификации расши-
ренной памяти LIM для хранения и выполнения исполняемого кода, но
не всегда это было просто. Во-первых, максимальный размер в
64 Кбайт кадра страниц спецификаций до 4.0 ограничивал размер
оверлея, который мог бы быть активным в данный момент времени.
Также каждому разработчику приходилось разрабатывать полный меха-
низм связывания, который позволял коду в обычной памяти выполнять
код, находящийся в расширенной памяти.
У спецификации расширенной памяти LIM 4.0 есть потенциал для
смягчения некоторых этих проблем. Теперь могут поддерживаться
кадры страниц, большие 64К, хотя менеджеры расширенной памяти,
написанные для плат, разработанных для спецификации 3.2, вероят-
но, не смогут обеспечивать большие размеры кадра страниц. Для
способствования отображению и связыванию кодовых объектов в рас-
ширенной памяти были введены две новые функции, "Изменить отобра-
жение страниц и перейти" (22) и "Изменить отображение страниц и
вызвать".
"Изменить отображение страниц и перейти" отображает нуль или
более логических страниц (до максимального количества физических
страниц, поддерживаемых менеджером расширенной памяти) в кадр
страниц и передает управление указанному целевому адресу. В отли-
чие от любой другой функции менеджера расширенной памяти данная
функция не возвращает управление команде, следующей за командой
"int 67h" (кроме случаев, когда менеджер расширенной памяти обна-
руживает ошибку перед переходом к целевому адресу). Программа,
которая получает управление в результате выполнения данной функ-
ции отвечает за установление собственного связывания по выходе.
- 7-41 -
Когда целевой адрес получает управление, содержимое регистров
процессора и флаги являются такими, какими они были, когда было
выдано прерывание менеджера расширенной памяти. Таким образом,
программы могут передавать параметры целевой программе в регист-
рах. Контекст отображения, существовавший перед вызовом данной
функции не сохраняется.
Функция "Сменить отображение страниц и вызвать" является
аналогом удаленной команды CALL 80х86. Аналогично функции "Сме-
нить отображение страниц и перейти" данная функция отображает
нуль или более логических страниц (до максимального количества
физических страниц, поддерживаемого менеджером расширенной памя-
ти) в кадр страниц и передает управление целевому адресу. Страни-
цы, отображенные перед тем, как происходит передача управления
называются новым отображением страниц. В отличие от функции "Сме-
нить отображение страниц и перейти" целевая программа возвращает
управление менеджеру расширенной памяти (и по существу, програм-
ме, которая выдала "Сменить отображение страниц и вызвать") путем
выполнения команды удаленного возврата RETURN. Когда менеджер
расширенной памяти вновь получает управление от целевой програм-
мы, множество страниц, называемое старым отображением страниц,
отображается в кадр страниц и менеджер расширенной памяти возвра-
щает управление исходной вызывавшей программе. Содержимое и ново-
го и старого отображения страниц задается вызывавшей программой.
Регистры вызывавшей программы сохраняются в течение процесса. Со-
держимое регистров при входе в целевую программу является тем же,
какое было во время выдачи прерывания менеджера расширенной памяти
вызывавшей программой.
Данная функция способна поддерживать вложенные вызовы -
программа, в которую вошли посредством "Сменить отображение стра-
ниц и вызвать", может сама использовать эту функцию. Для сохране-
ния контекста на каждом уровне вызова менеджер расширенной памяти
использует стек вызывающей программы. Количество байтов стека,
необходимое для менеджера расширенной памяти для выполнения это-
го, получается путем применения подфункции 02, "Получить размер
пространства стека отображения страниц", функции "Сменить отобра-
жение страниц и вызвать".
Освобождение расширенной памяти
Надлежащим образом сконструированные программы перед завер-
шением закрывают файлы и освобождают обычную память, которая была
размещена из DOS. Аналогичным образом, ресурсы расширенной памя-
ти, размещенные Вашей программой, должны возвращаться менеджеру
расширенной памяти перед завершением программы.
Поскольку он работает независимо от операционной системы, у
менеджера расширенной памяти нет способа определения, когда Ваша
программа завершилась. Если Ваша программа не освобождает явно
все страницы расширенной памяти, которые она размещала перед вы-
ходом, следующая программа, которая попытается пользоваться рас-
ширенной памятью, может найти, что расширенная память заполнена,
даже хотя данные в расширенной памяти более не используются.
Если Вы намереваетесь писать здравые приложения с использо-
ванием расширенной памяти, для Вашей программы будет недостаточно
возвращать ресурсы менеджеру расширенной памяти перед нормальными
завершениями. Более совершенное обращение должно включать в себя
код для очистки ресурсов расширенной памяти в драйвере прекраще-
ния программы (Break = Control-C), драйвере критической ошибки и
- 7-42 -
драйвере деления на нуль. Прежде всего обработка этих условий
требует значительного объема программирования на языке ассембле-
ра,вместе со способностью разобрать" Техническое справочное руко-
водство по DOS (DOS Technical Reference Manual)". Правда, недавно
в некоторые продукты языков высокого уровня, включая С 5.0 фирмы
Microsoft и Турбо-Паскаль 4.0 и Турбо-C фирмы Borland, были вве-
дены средства для обработки этих условий в самих языках высокого
уровня. У программистов, пользующимся этими продуктами для напи-
сания приложений спецификации расширенной памяти, более нет ра-
зумных оснований истолковывать процедуры ненормальных завершений.
Системное программное обеспечение
Набор представленных до сих пор функций удовлетворяет нуждам
управления расширенной памятью обычных (нерезидентных) программ
DOS. В среде DOS нерезидентная (transient) относится к програм-
мам, которые выполняются из подсказки DOS или, которые вызываются
из другой такой же программы посредством применения функции
DOS EXEC. Память, занимавшаяся такими программами, возвращается
операционной системе, когда программа завершается, и данная прог-
рамма должна повторно загружаться в память перед тем, как войти в
нее вновь.
Как упоминалось ранее, драйверы устройств, программы обслу-
живания прерываний и программы, остающиеся в памяти после завер-
шения, которые пользуются расширенной памятью, обладают дополни-
тельной ответственностью относительно пользования ею. Эти виды
программ определяются как резидентные, так как они остаются в па-
мяти даже после выхода из них в первый раз, и, следовательно, в