толкнулся на какие-либо проблемы, пытаясь выполнить выбранную
функцию. Значения кодов ошибок и их смысл перечислены далее в
этой главе.
- 7-24 -
Конфликт прерываний
Программисты должны знать, что прерывание 67h не зарезерви-
ровано "официально" для спецификации расширенной памяти LIM; мно-
гие другие доступные в продаже программы также используют его.
Конфликты в использовании этого прерывания часто озадачивают раз-
работчиков и пользователей программного обеспечения спецификации
расширенной памяти, когда приложение, которое работает на одной
машине, перестает работать на другой с идентичной конфигурацией
оборудования. Возможно для прерывания 67h, чтобы оно совместно
разделялось более, чем одной программой, хотя менеджеры расширен-
ной памяти не программируются для выполнения этого. Даже, если
менеджер расширенной памяти способен разделять использование пре-
рывания 67h с другим программным обеспечением, один из двух доку-
ментированных методов обнаружения присутствия менеджера расширен-
ной памяти может не сработать, если другой обработчик прерывания
встанет в цепь перед обработчиком прерывания менеджера расширен-
ной памяти.
Поскольку применение прерывания 67h встроено в спецификацию
расширенной памяти LIM, любое приложение, написанное для исполь-
зования расширенной памяти, связывается с менеджером расширенной
памяти путем выдачи этого прерывания. Таким образом, конфликты
из-за прерывания 67h между менеджером расширенной памяти и други-
ми программами могут быть разрешены только, если программное
обеспечение, не относящееся к спецификации расширенной памяти,
может быть реконфигурировано или модифицировано, чтобы использо-
вать другой вектор прерывания.
Языки высокого уровня
Как и в случае с системными вызовами DOS, не существует
стандартного интерфейса между языками высокого уровня, такими как
Си, Паскаль или ФОРТРAH и спецификацией расширенной памяти LIM.
Однако, разработчики, которые желают обращаться к расширенной па-
мяти из приложений, написанных на языках высокого уровня, обычно
имеют несколько жизнеспособных альтернатив. В продаже доступны
несколько библиотек функций спецификации расширенной памяти для
некоторых различных языков. Многие популярные языковые системы
обладают подпрограммами или функциями, которые обеспечивают общие
средства для доступа к регистрам микропроцессора и выдачи прог-
раммных прерываний. Кроме того, языки высокого уровня должны так-
же обеспечивать какой-либо способ для определения удаленных ука-
зателей (регистр сегмента плюс смещение) для адресации структур
данных, передаваемых для менеджера расширенной памяти.
Программисты, знающие язык ассемблера 808х, знакомые со свя-
зыванием подпрограмм и соглашениями о передаче параметров их язы-
ка высокого уровня, найдут, что несложно создать набор программ
сопряжения для спецификации расширенной памяти. Пример такого на-
бора, написанного на языке Си фирмы Microsoft версия 5.0, приво-
дится в конце данной главы вместе с другими программами.
Обработка условий ошибок
Каждый программист, пытающийся написать надежное программное
обеспечение, должен ожидать, что придется обрабатывать неизбежно
появляющиеся ошибки. Спецификация расширенной памяти LIM 4.0 оп-
ределяет 36 различных условий ошибок, которые может возвращать
- 7-25 -
менеджер расширенной памяти, так же как и код, который сигнализи-
рует об успешном завершении функции. Листинг 7-1 содержит опреде-
ления для кодов ошибок спецификации расширенной памяти LIM 4.0, а
в табл. 7-3 перечислены коды состояний ошибок.
Менеджер расширенной памяти возвращает детализированный код
состояния завершения в регистре AH для каждого запроса на обслу-
живание при возврате из прерывания. По отношению к обнаружению и
сообщению об ошибках интерфейс программирования спецификации рас-
ширенной памяти более последовательный и менее сложный, чем DOS.
Для обнаружения и сообщения условия ошибки, последовавшего при
вызове DOS, программист должен проанализировать регистр или флаг
переноса и затем выдать другой системный вызов для возвращения
детализированного кода ошибки.
Таблица 7-3
Коды состояний спецификации расширенной памяти
Lotus/Intel/Microsoft 4.0
ДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Код ¦ Описание
ДДДД†ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
00H ¦Указанная функция завершилась без ошибок
80H ¦Отказ программного обеспечения драйвера менеджера расширенной
¦памяти
81H ¦Драйвер менеджера расширенной памяти обнаружил аппаратурный
¦отказ
82H ¦Драйвер менеджера расширенной памяти занят (ничего другого не
¦произошло)
83H ¦Hельзя отыскать указанного обработчика
84H ¦Код функции неопределен
85H ¦В настоящий момент нет доступных обработчиков
86H ¦Произошла ошибка восстановления контекста отображения
87H ¦Для запроса недостаточно общего числа страниц
88H ¦Для запроса недостаточно числа неразмещенных страниц
89H ¦Был запрос на нуль логических страниц из функции, совместимой
¦с LIM 3.2
8AH ¦Логическая страница вне диапазона указанного обработчика
8BH ¦Физическая страница вне диапазона
8CH ¦Переполнение области сохранения контекста регистров отображе-
¦ния
8DH ¦У стека контекста регистров отображения уже есть контекст,
¦связанный с указанным обработчиком
8EH ¦У стека контекста регистров отображения нет контекста, связан-
¦ного с указанным обработчиком
8FH ¦Была запрошена неопределенная подфункция
90H ¦Тип атрибута не определен
91H ¦Система не поддерживает неразрушаемость (энергонезависимость)
92H ¦При передвижении области произошла частичная перезапись ис-
¦точника
93H ¦Область расширенной памяти слишком велика для указанного об-
¦работчика
94H ¦Области обычной и расширенной памяти перекрываются
95H ¦Смещение в пределах логической страницы превосходит длину ло-
¦гической страницы
96H ¦Длина области превышает предел в 1 Мбайт
97H ¦Области расширенной памяти источника и приемника имеют один и
¦тот же обработчик и перекрываются
98H ¦Hеопределенные/неподдерживаемые типы памяти источника и при-
¦емника
- 7-26 -
9AH ¦Указанный альтернативный набор регистров отображения не су-
¦ществует
9BH ¦Все альтернативные наборы регистров отображения/ПДП исполь-
¦зуются
9CH ¦Hе поддерживаются альтернативные наборы регистров отображения
¦/ПДП
9DH ¦Указанный альтернативный набор регистров отображения/ПДП не
¦определен, не размещен или является текущим
9EH ¦Закрепленные каналы ПДП не поддерживаются
9FH ¦Указанный закрепленный канал ПДП не существует
A0H ¦Hе может быть найдено значение обработчика, соответствующее
¦указанному имени обработчика
A1H ¦Обработчик с указанным именем уже существует
A2H ¦Попытка перехода к началу 1-Мбайтного адресного пространства
¦во время передвижения или обмена
A3H ¦Содержимое структуры данных пользователя, переданное для
¦функции искажено или бессмысленно
A4H ¦Операционная система не допускает обращения к функции
ДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Листинг 7-1.EMMERR.H
------------------------------------------------------------------
/*
Продукт: Диск над;
Версия: 2.00
Наименование: emmerr.h
Содержание: определения кодов ошибок спецификации расширенной па-
мяти LIM 4.0
Ссылка: спецификация расширенной памяти LIM версия 4.0 стр.А5-А10
*/
#defineFRSTEMERR 0x80 /*номер первой ошибки менеджера расширенной
памяти*/
#defineLASTEMERR 0xA4 /*номер последней ошибки менеджера расши-
ренной памяти*/
#defineFUNCCOC 0x00 /*указанн. функция завершилась без ошибок*/
#defineEMDRVSWF 0x80 /*отказ программного обеспечения драйвера
менеджера расширенной памяти*/
#defineEMDRVHWF 0x81 /*драйвер менеджера расширенной памяти
обнаружил аппаратурный отказ*/
#defineEMDRVBSY 0x82 /*драйвер менеджера расширенной памяти
занят (ничего другого не произошло)*/
#defineHANDLNFD 0x83 /*нельзя отыскать указанного обработчика */
#defineFUNCCUND 0x84 /*код функции неопределен */
#defineHANDLINS 0x85 /*в настоящий момент нет доступных обра-
ботчиков*/
#defineMAPCXPRO 0x86 /*произошла ошибка восстановления контекста
отображения*/
#defineTOTPGINS 0x87 /*для запроса недостаточно общего
числа страниц*/
#defineUNAPGINS 0x88 /*для запроса недостаточно числа
неразмещенных страниц*/
#defineLPAGE2SM 0x89 /*был запрос на нуль логических страниц из
функции, совместимой с LIM 3.2*/
- 7-27 -
#defineLPAGERNG 0x8A /*логическая страница вне диапазона ука-
занного обработчика*/
#definePPAGE2BG 0x8B /*физическая страница вне диапазона*/
#defineMRCSAFUL 0x8C /*переполнение области сохранения контекста
регистров отображения*/
#defineMRCSTDUP 0x8D /*у стека контекста регистров отображения
уже есть контекст, связанный с указанным
обработчиком*/
#defineMRCSTNFD 0x8E /*у стека контекста регистров отображения
нет контекста, связанного с указанным об-
работчиком*/
#defineSFUNCUND 0x8F /*была запрошена неопределенн. подфункция*/
#defineATTRBUND 0x90 /*тип атрибута не определен*/
#defineNVSTGUNS 0x91 /*система не поддерживает неразрушаемость
(энергонезависимость)*/