Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых

Защищенный режим процессоров Intel 80286/80386/80486

© Александр Фролов, Григорий Фролов
Том 4, М.: Диалог-МИФИ, 1993, 234 стр.

[Назад] [Содеожание] [Дальше]

6.5. DOS-экстендеры

Вы уже наверное заметили, что все программы, приведённые в этой книге, не поддаются отладке с помощью обычных отладчиков, таких как 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-экстендер должен проверять наличие интерфейсов и по возможности использовать более высокоуровневый интерфейс. Проверка должна выполняться в следующем порядке:

  • DPMI
  • EMS/VCPI
  • XMS
  • Функции прерывания INT 15h

К сожалению, не все поставляющиеся 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-экстендер

В состав 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 позволяет разделять ресурсы персонального компьютера между несколькими параллельно работающими программами. При этом в среде WINDOWS могут выполняться три типа программ:

  • Программы, созданные специально для работы под управлением WINDOWS - приложения WINDOWS. Они не могут работать вне WINDOWS, так как для своей работы используют модули, находящиеся в ядре WINDOWS. Приложения WINDOWS всегда начинают своё выполнение и выполняются в защищённом режиме, им доступен интерфейс DPMI.
  • Программы, созданные для работы в среде MS-DOS и ничего не знающие о WINDOWS. Это хорошо знакомые вам программы реального режима. Если WINDOWS работает в стандартном режиме (Standart Mode) на компьютере с процессором i80286, выполнение этих программ происходит в реальном режиме. Если WINDOWS работает в расширенном режиме (Enhanced Mode) на процессорах i80386 или i80486, такие программы выполняются в режиме виртуального процессора 8086.
  • Программы, начинающие свою работу в режиме виртуального процессора 8086 (как обычные программы реального режима) и переключающиеся затем в защищённый режим. Эти программы используют интерфейс DPMI, который доступен им только в том случае, если WINDOWS работает в расширенном режиме на процессорах i80386 или i80486.

Программы первого типа - тема для отдельной книги объёмом в несколько сотен страниц (см. список литературы). Программы второго типа - это обычные программы MS-DOS, о которых мы говорили в предыдущих томах "Библиотеки системного программиста".

Мы займёмся программами последнего типа. Для составления этих программ вы можете использовать обычную технику, применяемую для программ реального режима MS-DOS (за исключением отладки - как и все программы, приведённые в этой книге, программы третьего типа не поддаются отладке стандартными для реального режима средствами).

Наша следующая глава - о WINDOWS и о тех возможностях, которые операционная система WINDOWS предоставляет программам, составленным в старом "стиле" MS-DOS.

[Назад] [Содеожание] [Дальше]