Главная · Поиск книг · Поступления книг · Top 40 · Форумы · Ссылки · Читатели

Настройка текста
Перенос строк


    Прохождения игр    
Demon's Souls |#13| Storm King
Demon's Souls |#12| Old Monk & Old Hero
Demon's Souls |#11| Мaneater part 2
Demon's Souls |#10| Мaneater (part 1)

Другие игры...


liveinternet.ru: показано число просмотров за 24 часа, посетителей за 24 часа и за сегодня
Rambler's Top100
Образование - Различные авторы Весь текст 2311.07 Kb

Программирование и кодирование

Предыдущая страница Следующая страница
1 ... 99 100 101 102 103 104 105  106 107 108 109 110 111 112 ... 198
         программа  не может запоминать области сохранения контекста отоб-
         ражения в расширенной памяти.

              * Не размещайте стек программы в расширенной памяти. Если Вы
         используете  расширенную  память  для хранения и выполнения кода,
         его стек должен размещаться в  обычной  (неотображаемой)  памяти.
         Если  программа  обслуживания  прерывания  получает управление от
         программы,  стек которой находится в расширенной  памяти,  чтение
         или запись данных в стек,  который перестал отображаться, привело
         бы к отказу.

           Применение расширенной  памяти  в  нерезидентных  программах

              Драйверы устройств DOS и программы, остающиеся резидентно по
         завершении, должны  выполнять дополнительные требования для того,
         чтобы пользоваться расширенной памятью без нарушения других прог-
         рамм. Рассмотрение дополнительных требований к пользованию расши-
         ренной памятью в таких программах будет отложено,  пока мы не по-
         лучим твердые навыки в методах программирования,  применяемых для
         управления расширенной памятью в обычных программах DOS.

                 Обнаружение наличия менеджера расширенной памяти

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

                            Метод открытого обработчика
              Для обнаружения  наличия  менеджера расширенной памяти с по-

                                      - 7-31 -
         мощью метода открытого обработчика используется ряд системных вы-
         зовов  файлов DOS,  для выявления присутствия драйвера устройства
         менеджера расширенной памяти и, в случае его присутствия, для оп-
         ределения его способности обслуживать запросы для прерывания 67h.
         Метод действует следующим образом:
              1. Выполняется вызов открытого обработчика DOS (функция DOS-
         3Dh), определяющий доступ только по чтению (режим 0) с именем пу-
         ти  доступа  EMMXXXX0.  Это - имя драйвера символьного устройства
         менеджера расширенной памяти,  который был  установлен  во  время
         первичной загрузки, если для драйвера устройства менеджера расши-
         ренной памяти в файле CONFIG.SYS было указано DEVICE=элемент.
              2. Если  вызов  открытого обработчика не выполняется с кодом
         возврата "не найдено имя файла или пути доступа",  то  Вы  можете
         полагать, что расширенная память отсутствует. Вызов открытого об-
         работчика может также не выполниться, если все обработчики файлов
         DOS  используются перед тестом наличия.  Для предотвращения этого
         Ваша программа должна выполнять тест наличия  расширенной  памяти
         до открытия любого другого файла.
              3. Если вызов открытого обработчика завершается успешно, это
         показывает, что существует файл или устройство с именем менеджера
         расширенной памяти.  Для того, чтобы установить, относится ли об-
         работчик, возвращенный на шаге 1, к устройству или файлу, выдайте
         вызов "Управление ввода/вывода для устройств" (IOCTL)  -  функция
         DOS  44h - с подфункцией "Получить информацию об устройстве" (ре-
         гистр AL=00h) для обработчика файла, возвращенного на шаге 1.
              4. Если обработчик принадлежит устройству, бит 7 регистра DL
         будет равен 1,  что показывает на присутствие менеджера расширен-
         ной памяти.  Если бит 7 равен 0,  обработчик связан с файлом, так
         что Вы можете полагать, что расширенная память отсутствует.
              5. Если  обработчик  ссылается на устройство,  выдайте вызов
         IOCTL  с  подфункцией  "Получить  выходное  состояние"   (регистр
         AL=07h) для данного обработчика, для того чтобы определить готов-
         ность менеджера расширенной памяти обрабатывать запросы на обслу-
         живание расширенной памяти.
              6. Если  менеджер расширенной памяти готов обрабатывать  за-
         просы обслуживания расширенной памяти, по вызову IOCTL возвратит-
         ся значение 0FFh в регистре AL.  В противном случае менеджер рас-
         ширенной памяти отсутствует или неспособен  обрабатывать  запросы
         на обслуживание расширенной памяти.
              7. Если начальный открытый обработчик DOS достиг цели,  зак-
         ройте его с помощью вызова закрытия обработчика (функция DOS 3h).
         Данный  обработчик  более не нужен,  поскольку дальнейшее общение
         между менеджером расширенной памяти и Вашим приложением  происхо-
         дит  через интерфейс прерывания 67h и не использует файловую сис-
         тему DOS.

                 Проверка версии спецификации расширенной памяти,
                   поддерживаемой менеджером расширенной памяти

              Если менеджер расширенной памяти существует и готов обслужи-
         вать запросы, выдайте функцию 7 "Получить версию", для того чтобы
         удостовериться,  что версия менеджера расширенной памяти, с кото-
         рым Ваша программа сообщается,  поддерживает версию  спецификации
         расширенной  памяти,  которая  требуется Вашей программе.  Данная
         функция возвращает число в двоично-десятичном коде из двух цифр в
         регистре AL.  Старшие четыре бита числа показывают основной номер
         версии.  Младшие четыре бита или дробная часть этого числа  могут

                                      - 7-32 -
         использоваться  поставщиками  для  обозначения усовершенствований
         или коррекции ошибок для их менеджеров расширенной памяти. Следо-
         вательно,  Вашей  программе для проверки версии не следует связы-
         ваться с обеими цифрами.  Намного лучшая стратегия заключается  в
         выполнении сравнения на "больше или равно".
              В случае MS-DOS 4.0 пользователь мог бы устанавливать  драй-
         веры  третьей  стороны  для  компенсации недостатков в драйверах,
         обеспечиваемых  более ранними выпусками операционной системы, по-
         этому недостаточно  выполнить  проверку на MS-DOS 4.0 и полагать,
         что драйверы  спецификации  расширенной  памяти  присутствуют.  В
         действительности, драйверы MS-DOS 4.0 могут быть установлены, но,
         однако,  не управлять оборудованием.  В качестве простого  теста,
         вызовите функцию 1, "Получить состояние", поместив значение 40h в
         регистр AH и вызвав прерывание 67h; если аппаратура и программное
         обеспечение работают совместно, функция возвратит значение нуль в
         AH;  если нет,  Вы получите ненулевое значение.  Любое  ненулевое
         значение указывает на отказ, но значения 80h или 81h указывают на
         отказ оборудования, типичный при несоответствии драйверов. В этом
         случае  отобразите пользователю сообщение о том,  что драйверы не
         могут работать правильно. Если Ваше приложение тестирует работос-
         пособность для спецификации расширенной памяти MS-DOS 4.0, помни-
         те,  что ранние версии MS-DOS 4.0 не  поддерживают  функцию  19h,
         "Получить/установить   атрибут обработчика",  спецификации расши-
         ренной памяти LIM.

                 Определение доступного объема расширенной памяти

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

                           Размещение расширенной памяти

              В зависимости от динамического поведения Вашей  программы Вы
         можете  выбирать,  разместить ли всю расширенную память,  которая
         будет необходима единовременно,  или делать отдельные запросы  на
         размещение, когда требования времени выполнения программы меняют-
         ся.  Первый вариант более всего подходит, если количество страниц
         в  течение  времени выполнения варьируется незначительно.  Второй
         вариант более уместен, если ожидается, что требования расширенной
         памяти  программы  будут расти и убывать существенно во время вы-
         полнения  программы.  Этот вариант также более целесообразен, по-
         скольку остается  больше  расширенной  памяти,  доступной  другим
         программам, которые могут выполняться параллельно. Например, одна
         популярная программа электронных таблиц восстанавливает доступный
         объем расширенной памяти и размещает 1/8 этого объема каждый раз,
         когда требуется дополнительная память. Конечно, существует другой
         популярный пакет электронных таблиц,  который размещает целый не-
         размещенный пул расширенной памяти,  когда начинает  выполняться,
         не оставляя ничего другим программам,  которые впоследствии могут
         вызываться самой этой программой.
              При спецификации расширенной памяти LIM  3.2  обеспечивалась
         только  одна  функция размещения расширенной памяти:  "Разместить
         страницы", функция 4 спецификации расширенной памяти. Каждый зап-
         рос на размещение возвращает отдельный обработчик, который следу-
         ет использовать для ссылки на страницы, относящиеся к этому конк-
         ретному  размещению.   Количество   страниц,   связанное  с  этим
         обработчиком,  фиксировано с того момента,  когда  страницы  были
         размещены,  до того, когда они возвращаются менеджеру расширенной
         памяти.  Это ограничение препятствует динамическому размещению  и
         освобождению  расширенной памяти,  так как невозможно вернуть ме-
         неджеру расширенной памяти только некоторые из страниц, принадле-
         жащие конкретному обработчику.
              Данное ограничение было снято в спецификации расширенной па-
         мяти LIM 4.0 с помощью функции "Переразместить страницы", функция
         18 спецификации расширенной памяти. Она позволяет увеличивать или
         уменьшать количество страниц,  связанных с обработчиком,  в любой
         момент после размещения.  Новая функция не снимает всех  проблем,
         связанных  с динамическим управлением структурами данных в памяти
         спецификации расширенной памяти,  поскольку  логические  страницы
         могут добавляться или исключаться только с конца.  Например, если
         бы Вы хотели освободить третью логическую  страницу  обработчика,
         для  которого были размещены шесть логических страниц,  Вам приш-
         лось бы освобождать также логические страницы с четвертой по шес-
         тую. Данная функция также позволяет возвратить все страницы, свя-
         занные с обработчиком,  менеджеру расширенной памяти без возврата
         самого обработчика путем указания нового счетчика страниц, равно-
         го нулю.
              Для того,  чтобы завершить обсуждение размещения расширенной
         памяти,  рассмотрим идею исходных страниц, введенную в специфика-
Предыдущая страница Следующая страница
1 ... 99 100 101 102 103 104 105  106 107 108 109 110 111 112 ... 198
Ваша оценка:
Комментарий:
  Подпись:
(Чтобы комментарии всегда подписывались Вашим именем, можете зарегистрироваться в Клубе читателей)
  Сайт:
 

Реклама