к содержанию |
Вы уже наверное заметили, что все программы, приведённые в этой книге, не поддаются отладке с помощью обычных отладчиков, таких как Borland Turbo Debugger или Microsoft Code View. Эти отладчики зависают уже на этапе загрузки регистра дескрипторной таблицы прерываний IDTR, до перехода в защищённый режим дело так и не доходит. И это понятно - такие отладчики рассчитаны на обычные программы реального режима.
Другая трудность связана с тем, что программе, работающей в защищённом режиме, недоступны прерывания MS-DOS и BIOS. Программа должна работать с аппаратурой на уровне регистров и аппаратных прерываний.
Для облегчения разработки программ, стартующих из MS-DOS в реальном режиме и переключающихся в защищённый режим разработаны специальные средства, называемые DOS-экстендерами или расширителями DOS.
Эти средства прикомпоновывают к разрабатываемой программе специальный модуль, реализующий интерфейс с защищённым режимом. Программа, созданная с использованием DOS-экстендера, загружается специальным загрузчиком в память и получает управление, когда процессор уже находится в защищённом режиме. Всю работу по переводу процессора в защищённый режим и по обработке прерываний в защищённом режиме берёт на себя экстендер.
Кроме того, DOS-экстендер предоставляет программе возможность обращения к прерываниям MS-DOS и BIOS! В своих программах, работающих в защищённом режиме под управлением DOS-экстендера вы можете пользоваться привычными вам функциями MS-DOS и BIOS (правда, не всеми, а только документированными). Возможности этих функций возрастут. Например, с помощью функции DOS можно будет заказать для программы буфер размером в несколько мегабайт.
Модуль DOS-экстендера, прикомпонованный к программе, может использовать интерфейсы DPMI, VCPI, XMS (драйвер HIMEM.SYS), INT 15h, или может использовать собственную схему управления памятью в защищённом режиме и собственные средства переключения режима процессора или состояния адресной линии A20. В спецификации DPMI приведены рекомендации для разработчиков DOS-экстендеров по использованию перечисленных выше интерфейсов. DOS-экстендер должен проверять наличие интерфейсов и по возможности использовать более высокоуровневый интерфейс. Проверка должна выполняться в следующем порядке:
К сожалению, не все поставляющиеся DOS-экстендеры следуют этим рекомендациям. В результате могут возникнуть проблемы при попытке запустить разработанную с помощью DOS-экстендера программу на виртуальной машине WINDOWS в режиме "Enhanced 386 Mode" или в MS-DOS при установленных драйверах EMM386 или QEMM.
Необходимость обеспечения совместимости с интерфейсами DPMI, VCPI и XMS требует тщательного выбора DOS-экстендера. Так как в настоящее время операционная система WINDOWS находится в состоянии взрывообразного распространения среди пользователей персональных компьютеров, неудачный выбор DOS-экстендера может привести к тому, что огромное количество потенциальных покупателей не смогут использовать вашу программу в среде WINDOWS. То же относится и к значительному количеству пользователей дрйверов расширенной памяти EMM386 и QEMM. В документации на DOS-экстендер должно содержаться подтверждение совместимости с интерфейсами DPMI, VCPI и XMS. Такой DOS-экстендер будет совместим с современными операционными системами и драйверами расширенной памяти.
Примерами программ, созданных с использованием несовместимых с DPMI интерфейсом служат СУБД ORACLE версии 5.1 и FOXPRO версии 2.0. Эти программные продукты не будут работать на виртуальной машине WINDOWS в режиме "Enhanced 386 Mode".
Исходные тексты программ, составленных для DOS-экстендеров, внешне очень похожи на тексты программ реального режима. В них отсутствуют строки, специфические для программ, рассмотренных нами ранее и выполняющие переключение в защищённый режим, либо подготовку системных таблиц, либо перепрограммирование контроллера прерывания.
DOS-экстендеры поставляются в комплекте с трансляторами, редакторами связей, отладчиками и библиотеками стандартных функций (например, библиотеками для транслятора языка Си). Поэтому создание и отладка программ защищённого режима, созданных с использованием DOS-экстендеров, обычно не вызывает затруднений.
Мы кратко рассмотрим возможности двух DOS-экстендеров: 386-DOS/Extender фирмы Phar Lap и виртуальную машину операционной системы WINDOWS в режиме "Enhanced 386 Mode".
В состав Phar Lap DOS-экстендера входят транслятор для языка Си hc386.exe, ассемблер 386asm.exe, редактор связей 386link.exe, отладчик minibug.exe и программа загрузки run386.exe.
С помощью транслятора языка Си или ассемблера получаются объектные модули, которые компонуются редактором связей 386link.exe в загрузочный модуль. Этот загрузочный модуль имеет расширение "exp" и запускается при помощи программы загрузки run386.exe. Полученный загрузочный модуль может работать только на процессорах i80386 или i80486. Версия 2.2 Phar Lap DOS-экстендера не поддерживает интерфейс DPMI, поэтому разработанные с использованием экстендера этой версии программы не будут работать на виртуальной машине WINDOWS в режиме "Enhanced 386 Mode".
Phar Lap DOS-экстендер предоставляет программе, которая получает управление сразу в защищённом режиме, возможность использовать документированные прерывания MS-DOS и BIOS. Кроме того, в рамках прерывания INT 21h DOS-экстендером реализуются дополнительные функции, связанные с работой в защищённом режиме.
Для того, чтобы у вас было представление о возможностях Phar Lap
DOS-экстендера, приведём таблицу дополнительных функций, реализованных
в рамках прерывания INT 21h:
Таблица 13. Функции Phar Lap DOS-экстендера.
Регистр AX | Выполняемая функция |
2501h | Установка в исходное состояние структур данных DOS-экстендера. |
2502h | Получить вектор прерывания защищённого режима. |
2503h | Получить вектор прерывания реального режима. |
2504h | Установить вектор прерывания защищённого режима. |
2505h | Установить вектор прерывания реального режима. |
2506h | Установить режим, при котором прерывание будет всегда обрабатываться в защищённом режиме. |
2507h | Установить вектора прерываний реального и защищённого режима. |
2508h | Установить линейный базовый адрес сегмента. |
2509h | Преобразовать линейный адрес в физический |
250Ah | Отобразить физическую память в конце сегмента. |
250Ch | Получить вектора аппаратных прерываний. |
250Dh | Получить информацию связи с реальным режимом. |
250Eh | Вызвать процедуру реального режима. |
250Fh | Преобразовать адрес защищённого режима в адрес реального режима. |
2510h | Вызвать процедуру реального режима с заданным содержимым регистров. |
2511h | Вызвать прерывание реального режима с заданным содержимым регистров. |
2512h | Загрузить программу для отладки. |
2513h | Создать алиасный дескриптор сегмента (т.е. для заданного дескриптора создаётся ещё один, указывающий на тот же сегмент). |
2514h | Изменить атрибуты сегмента. |
2515h | Получить атрибуты сегмента. |
2516h | Освободить всю память, распределённую при помощи LDT. |
2517h | Получить информацию о буферах данных DOS. |
2518h | Определить драйвер для обработки перемещения сегмента. |
2519h | Получить дополнительную информацию об ошибке памяти. |
251Ah | Зафиксировать страницы в памяти. |
251Bh | Расфиксировать страницы. |
251Ch | Освободить страницы физической памяти. |
251Dh | Прочитать элемент таблицы страниц. |
251Eh | Записать элемент таблицы страниц. |
251Fh | Обменять элементы таблицы страниц. |
2520h | Получить статистическую информацию о памяти. |
2521h | Максимальный размер доступной программам расширенной памяти. |
2522h | Определить альтернативный драйвер, обрабатывающей ситуацию отсутствия страницы в памяти. |
2525h | Максимальный размер доступной программам стандартной памяти. |
25C0h | Получить блок стандартной памяти MS-DOS. |
25C1h | Освободить блок стандартной памяти MS-DOS. |
25C2h | Изменить размер блока стандартной памяти MS-DOS. |
25C3h | Выполнить программу. |
Сравните это с функциями интерфейса DPMI, вы увидите что между этими интерфейсами есть много общего. Есть специальная функция, предназначенная для отладчиков - "Загрузить программу для отладки".
Программе доступны селекторы, облегчающие работу с наиболее часто
используемыми областями данных. Например, таблица LDT содержит
следующие селекторы, готовые для использования:
Таблица 14. Таблица LDT Phar Lap DOS-экстендера.
0008h | Сегмент кода программы. |
0010h | Сегмент данных программы. |
0018h | Сегмент видеопамяти для работы в текстовом режиме. |
0020h | PSP программы. |
0028h | Сегмент строк среды DOS (DOS environment). |
0030h | Сегмент данных для доступа к первому мегабайту памяти, доступен для записи. |
0038h | Сегмент для работы с сопроцессором Weitek 1167. В отличие от сопроцессора i80287/i80387 для обращения к сопроцессору Weitek 1167 используется определённая область адресов памяти. |
0040h | Сегмент видеопамяти для работы в графическом режиме. |
В документации на Phar Lap DOS-экстендер подробно описаны форматы таблиц LDT и GDT. Программы могут пользоваться определёнными в этих таблицах селекторами для адресации системных областей памяти, таких как память видеоадаптера.
В качестве простейшего примера использования Phar Lap DOS-экстендера приведём следующую программу:
Листинг 20. Использование Phar Lap DOS-экстендера Файл pharlap.asm ----------------------------------------------------------- ; --------------------------------------------------- ; Сегмент данных ; --------------------------------------------------- _data segment para public use32 'data' hello db 'PHAR LAP 386/DOS EXTENDER', 0dh,0ah db 'Вызов DOS в защищенном режиме', 0dh,0ah db 0dh,0ah,'© Frolov A.V., 1992',0dh, 0ah db 0dh,0ah,'Для возврата в DOS нажмите любую клавишу','$' _data ends ; --------------------------------------------------- ; Сегмент стека ; --------------------------------------------------- _stack segment byte stack use32 'stack' db 8192 dup (?) _stack ends ; --------------------------------------------------- ; Сегмент кода ; --------------------------------------------------- assume cs:_text,ds:_data _text segment para public use32 'code' public _start_ _start_ proc near ; Выводим строку lea edx,hello mov ah,09h int 21h mov ah,8h int 21h mov ax,04c00h int 21h _start_ endp _text ends end _start_
Эта программа просто выводит сообщение на экран и завершает свою работу после того, как вы нажмёте любю клавишу. Особенность программы заключается в том, что она получает управление сразу в защищённом режиме. Запуск программы должен выполняться специальным загрузчиком, который входит в состав Phar Lap DOS-экстендера. Этот загрузчик находится в файле run386.exe.
Для трансляции программы и её запуска можно использовать следующий командный файл:
386asm pharlap 386link pharlap run386 pharlap
Обратите внимание на то, что в приведённой выше программе не выполняется загрузка сегментного регистра DS. Так как программа стартует сразу в защищённом режиме, загрузчик run386 загружает сам все сегментные регистры. В частности, он загружает в регистр DS селектор сегмента данных.
Операционная система WINDOWS позволяет разделять ресурсы персонального компьютера между несколькими параллельно работающими программами. При этом в среде WINDOWS могут выполняться три типа программ:
Программы первого типа - тема для отдельной книги объёмом в несколько сотен страниц (см. список литературы). Программы второго типа - это обычные программы MS-DOS, о которых мы говорили в предыдущих томах "Библиотеки системного программиста".
Мы займёмся программами последнего типа. Для составления этих программ вы можете использовать обычную технику, применяемую для программ реального режима MS-DOS (за исключением отладки - как и все программы, приведённые в этой книге, программы третьего типа не поддаются отладке стандартными для реального режима средствами).
Наша следующая глава - о WINDOWS и о тех возможностях, которые
операционная система WINDOWS предоставляет программам, составленным
в старом "стиле" MS-DOS.
к содержанию |