них возможно войти повторно в любой момент - даже, когда выполня-
ется другая программа.
Сравнение нерезидентных и резидентных программ
Резидентность или нерезидентность в памяти в действительнос-
ти не является важным вопросом при использовании расширенной па-
мяти. Существенная разница состоит в том, что нерезидентные прог-
раммы выполняются синхронно, то есть явно по запросу
пользователя. DOS управляет переходом между программами, так что
состояние машины и операционная система - управляемые ресурсы яв-
ляются управляемыми надлежащим образом.
Программы обслуживания прерываний (включая встроенные в
драйверы устройства и в программы, остающиеся в памяти по завер-
шении) получают управление асинхронно, откликаясь на аппаратурные
события. DOS не играет никакой роли в переходе между выполняемой
в данный момент программой и программой обслуживания прерывания.
Таким образом, отдельная программа обслуживания прерывания отве-
чает за сохранение состояния процессора перед его изменением и за
восстановление исходного состояния перед возвратом управления
прерванной программе. У менеджера расширенной памяти также есть
состояние, на которое часто ссылаются как на контекст. Программы
обслуживания прерываний, использующие расширенную память, должны
сохранять этот контекст перед тем, как изменить его, и должны
восстанавливать его перед выходом.
Заметная доля набора функций спецификации расширенной памяти
4.0 посвящена требованиям резидентных программ, операционных сис-
тем и рабочих сред. Кроме того, в функции, требующиеся для сохра-
нения и восстановления контекста менеджера расширенной памяти
- 7-43 -
спецификации расширенной памяти 4.0, также были введены несколько
функций, специально разработанных для обеспечения совместной ком-
поновки между операционными системами или многозадачными средами
(OS/E на языке спецификации расширенной памяти) и менеджером рас-
ширенной памяти. Это компоновка должна была бы позволить прог-
раммному обеспечению операционных систем и многозадачных сред ис-
пользовать средства, которые могут быть включены в новые
разработки аппаратуры спецификации расширенной памяти, такие как
механизмы быстрого переключения задач и неразрушаемая память.
С нашим пониманием идей расширенной памяти, представленных
до сих пор в данной главе, мы теперь может рассматривать более
сложные средства спецификации расширенной памяти LIM, которые
поддерживают резидентные программы и программное обеспечение,
ориентированное системно.
Обнаружение наличия менеджера расширенной памяти
Драйверам устройств, которые загружаются до того, как DOS
полностью инициализирована, не полагается выдавать вызовы файло-
вой системы DOS. Большинство вызовов DOS также являются неразре-
шенными для резидентных программ, которые не обрабатывают специ-
альным образом проблему отсутствия повторного входа DOS. Таким
образом, метод открытого обработчика, представленный ранее в дан-
ной главе, не является подходящим средством для этих программ,
чтобы выявлять наличие расширенной памяти.
Альтернативный метод, который может применяться любой прог-
раммой - метод получения вектора прерывания. Данный метод работа-
ет следующим образом:
1. Выдается функция DOS "Получить вектор" (прерывание 21h,
функция 35h) для получения адреса программного прерывания менед-
жера расширенной памяти (67h).
2. Менеджер расширенной памяти находится внутри драйвера
символьного устройства DOS, у которого заголовок устройства нахо-
дится по нулевому смещению в сегменте, возвращаемом в регистре
ES, предыдущим шагом. У всех драйверов символьных устройств есть
8-символьное поле имени устройства, размещающееся по смещению 0Ah
в заголовке устройства, которое DOS использует для указания уст-
ройства, когда вызовы файловой системы ссылаются на него. Сравни-
те имя устройства по смещению 0Ah в сегменте, возвращенном в ре-
гистре ES на шаге 1, со строкой "EMMXXXX0." (Вспомните, что на
это имя устройства была ссылка на вызове открытия, использованном
как часть метода открытого обработчика.) Если строки совпадают,
менеджер расширенной памяти присутствует.
Управление контекстом
Если Вы уже писали программы обслуживания прерываний для
драйверов устройств или программ, остающихся после завершения в
памяти, Вы уже без сомнения знаете, что такие программы должны
сохранять содержимое любого регистра процессора, которое изменя-
ется данной программой, на входе и должны восстанавливать эти ре-
гистры перед выходом. Данная идея сохранения состояния процессора
(регистры, указатель команд и слово флагов составляют его состоя-
ние) должна также быть применимой для менеджера расширенной памя-
ти.
В сущности, состояние менеджера расширенной памяти или кон-
текст - содержимое регистров отображения (или их имитации). Ваша
- 7-44 -
программа должна сохранять контекст менеджера расширенной памяти
перед вызовом любой функции, которая может его изменить, и -
восстанавливать исходный контекст перед передачей управления.
В спецификации расширенной памяти LIM 3.2 предусмотрены два
набора функций для данной цели. Наиболее проста для использования
пара функций 8/9, именуемых "Сохранить отображение страниц" и
"Восстановить отображение страниц". Первая для данного номера
обработчика сохраняет текущий контекст во внутренней для менед-
жера расширенной памяти области; внутри Вашей программы памяти не
требуется. Последняя функция для данного такого же номера обра-
ботчика восстанавливает контекст, ранее запомненный для этого
обработчика во внутренней области сохранения менеджера расширен-
ной памяти. Хотя ими несложно пользоваться, у этих функций есть
некоторые ограничения, которые ведут к рекомендации избегать их
применения в новых программах.
Первое ограничение заключается в том, что для каждого обра-
ботчика обеспечивается максимальная область сохранения, а некото-
рые менеджеры расширенной памяти не поддерживают область сохране-
ния для всех возможных обработчиков. Результат состоит в том, что
Ваша программа перестает быть полностью реентерабельной, если в
ней для сохранения и восстановления контекста менеджера расширен-
ной памяти используются эти функции, поскольку каждое сохранение
для данного обработчика должно сопровождаться восстановлением для
этого же обработчика, перед тем как отображение страниц может
быть вновь сохранено с помощью того же обработчика. Еще одно
ограничение состоит в том, что эти функции сохраняют и восстанав-
ливают контекст четырех физических страниц, определенных в специ-
фикации расширенной памяти LIM 3.2.
Для преодоления этих ограничений в спецификации расширенной
памяти LIM 3.2 имеется функция 15 "Получить/установить отображе-
ние страниц". В отличие функций 8 и 9, которые сохраняют и вос-
станавливают контекст из внутренней области менеджера расширенной
памяти, данная функция сохраняет и восстанавливает контекст из
области, обеспечиваемой вызывающей программой. Подфункция 00h
"Получить отображение страниц", запоминает контекст менеджера
расширенной памяти в буфере пользователя, указываемом регистрами
ES:DI. Подфункция 01h "Установить отображение страниц" загружа-
ет контекст менеджера расширенной памяти из буфера пользователя,
указываемом регистрами DS:SI. Подфункция 02h "Получить и устано-
вить отображение страниц" делает то, что подразумевает ее наиме-
нование, сохраняя контекст менеджера расширенной памяти в буфере,
указываемом ES:DI, и загружая новый контекст из области, указыва-
емой DS:SI. Не следует делать никаких допущений о размере буфера,
необходимого для получения сохраненного контекста. Получайте его
от менеджера расширенной памяти с помощью подфункции 03h "Полу-
чить размер массива отображения страниц". Формат области сохране-
ния контекста зависит от внутренней реализации менеджера расши-
ренной памяти и не предназначен для понимания Вашей программой.
Даже предполагая, что Вы можете определить положение регистров
отображения страниц внутри области сохранения, Вы не можете на-
дежно определить, какие логические страницы были отображены в
каждую физическую страницу.
Поскольку спецификация расширенной памяти LIM 4.0 поддержи-
вает до 36 физических страниц, затраты памяти на сохранение и
восстановление полного контекста могут существенно превысить то,
что имело место для 64-Кбайтного кадра страниц спецификации рас-
ширенной памяти LIM 3.2. Для сокращения этих затрат была опреде-
- 7-45 -
лена функция 16 "Получить/установить частичное отображение стра-
ниц". Программа может сохранить контекст только для конкретных
физических страниц, которые она будет изменять, аналогично спо-
собности программиста на языке ассемблера сохранять только те ре-
гистры, которые будут изменены программой обслуживания прерыва-
ния. Подфункция 00h "Получить частичное отображение страниц"
сохраняет нуль или более регистров отображения страниц в буфере,
поставляемом пользователем. Подфункция 01h "Установить частичное
отображение страниц" восстанавливает нуль или более таких ре-
гистров. Подфункция 02h "Получить размер области сохранения
отображения страниц" возвращает размер области сохранения, тре-
буемый для сохранения контекста, состоящего из указанного коли-
чества физических страниц.
Переключение задач
Явная поддержка переключения задач с помощью менеджера рас-
ширенной памяти была добавлена в спецификации расширенной памяти
LIM 4.0. Нижеописанный набор функций предназначен для использова-
ния операционными системами или операционными средами такими, как
DESQView фирмы Quarterdeck или Windows фирмы Microsoft, и не
должны использоваться типичными прикладными программами специфи-
кации расширенной памяти. Конкретные детали, касающиеся использо-
вания этих функций, выходят за рамки данной главы, но некоторое
обсуждение их целей и реализации целесообразно.
Функции операционных сред будут способны использовать преи-
мущества усовершенствованных аппаратурных средств спецификации
расширенной памяти. Одно из средств, которое может быть включено