|
|
|
|
Управление контекстом
Если Вы уже писали программы обслуживания прерываний для
драйверов устройств или программ, остающихся после завершения в
памяти, Вы уже без сомнения знаете, что такие программы должны
сохранять содержимое любого регистра процессора, которое изменяется данной программой, на входе и должны восстанавливать эти регистры перед выходом.
Данная идея сохранения состояния процессора
(регистры, указатель команд и слово флагов составляют его состояние) должна также быть применимой для менеджера расширенной памяти.
В сущности, состояние менеджера расширенной памяти или контекст - содержимое регистров отображения (или их имитации). Ваша
программа должна сохранять контекст менеджера расширенной памяти
перед вызовом любой функции, которая может его изменить, и -
восстанавливать исходный контекст перед передачей управления.
В спецификации расширенной памяти 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. Для сокращения этих затрат была определена функция 16
"Получить/установить частичное отображение страниц". Программа может сохранить контекст только для конкретных
физических страниц, которые она будет изменять, аналогично способности программиста на языке ассемблера сохранять только те регистры, которые
будут изменены программой обслуживания прерывания. Подфункция 00h "Получить частичное отображение страниц"
сохраняет нуль или более регистров отображения страниц в буфере,
поставляемом пользователем. Подфункция 01h "Установить частичное
отображение страниц" восстанавливает нуль или более таких регистров. Подфункция 02h "Получить размер области сохранения
отображения страниц" возвращает размер области сохранения, требуемый для сохранения контекста, состоящего из указанного количества физических
страниц.
|
|