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

Операционная система MS-DOS

© Александр Фролов, Григорий Фролов
Том 1, книга 3, М.: Диалог-МИФИ, 1992.

[Назад] [Содеожание]

7.6. MS-DOS версии 5.0

7.6.1. Новое в MS-DOS версии 5.0

Версия 5.0 операционной системы MS-DOS не разочаровала пользователей компьютеров и программистов. Преимущества столь значительны и заметны, что уже не может быть оправдания для приверженцев версии 3.30 или даже 4.01. Перечислим только основные нововведения.

  • Возможность загрузки ядра DOS в так называемую верхнюю память. Эта память расположена за пределами первого мегабайта оперативной памяти, что позволяет выделить для программ пользователя до 630 (!) килобайт свободного пространства.
  • При работе MS-DOS версии 5.0 на компьютере, оснащенном процессором 80386 или 80486 возможна выгрузка драйверов и резидентных программ в расширенную память. Для этого можно использовать драйвер EMM386.
  • Новая диалоговая оболочка DOSSHELL обеспечивает переключение задач. Это еще не мультизадачность, так как все запущенные программы, кроме одной, приостанавливают свою работу и выгружаются на диск. В любой момент времени работает только одна программа, остальные ждут своей очереди на диске. Возможности переключателя задач будут рассмотрены в разделе "Переключатель задач".
  • Многие функции и прерывания MS-DOS, которые были недокументированы в предыдущих версиях, получили "признание", отныне программисты могут использовать их на законных основаниях. Особенно это относится к функциям, обеспечивающим работу резидентных программ.
  • Появились новые функции и новые возможности для программистов. Мы кратко рассмотрим наиболее полезные, на наш взгляд, новые функции MS-DOS в следующих разделах этой главы.

Сразу отметим, что функция 30h прерывания INT 21h, возвращающая версию MS-DOS, может ввести вас в заблуждение. Возможно, вы будете сильно удивлены, когда в среде MS-DOS версии 5.0 эта функция сообщит о том, что у вас MS-DOS версии 3.30 или даже 1.0. Как это может быть?

В состав MS-DOS версии 5.0 входит драйвер SETVER.EXE. Этот драйвер поддерживает список имен программ, в котором каждому имени поставлен в соответствие номер версии MS-DOS, возвращаемый функцией 30h.

При запуске программы драйвер SETVER.EXE сверяет ее имя со списком (который, кстати, вы можете редактировать) и модифицирует соответствующим образом обработчик функции 30h.

Для чего потребовалось вводить программы в заблуждение относительно используемой версии MS-DOS?

Дело в том, что некоторые программы (а также драйверы) рассчитаны на работу только в среде конкретной версии MS-DOS, например, 4.00 или 4.01. На самом деле эти программы будут правильно работать и в MS-DOS версии 5.0. Но проверив версию, такие программы часто завершают свое выполнение с сообщением об ошибке в номере версии.

Вы можете получить список таких программ, просто запустив SETVER.EXE как обычную программу.

Как же получить "правильный" номер версии MS-DOS?

Для этого необходимо использовать функцию 3306h прерывания INT 21h.

Приведем формат этой функции.

Регистры на входе:

Регистр Содержимое
AX 3306h

Регистры на выходе:

Регистр Содержимое
BH Верхний (major) номер версии.
BL Нижний (minor) номер версии.
DL Биты 0..2 содержат номер изменения (revision), остальные биты равны 0.
DH Флаги:
Бит 3 - DOS находится в ПЗУ;
Бит 4 - DOS загружен в старшие
адреса памяти (область HMA)

Функция 30h в версии MS-DOS также претерпела некоторые изменения. Если при вызове этой функции в регистр AL записать значение 00h, все будет аналогично версиям 2.0-4.0. Если в AL записать 01h, после возврата регистр BH будет содержать флаги, по которым можно судить о расположении MS-DOS в ПЗУ или в старших адресах памяти.

Приведем полный формат вызова функции 30h прерывания INT 21h.

Регистры на входе:

Регистр Содержимое
AH 30h
AL 00h - получить код ОЕМ (код фирмы-изготовителя DOS) и версию DOS;

01h - получить флаги расположения DOS.

Регистры на выходе:

Регистр Содержимое
AL Верхний (major) номер версии.
AH Нижний (minor) номер версии.
BX:CL 24-битовый серийный номер конкретного экземпляра MS-DOS
BH Если при вызове функции AL был равен 0:

Код фирмы-изготовителя:

00h - IBM;
05h - Zenith;
16h - DEC;
23h - Olivetti;
29h - Toshiba;
4Dh - Hewlett Packard;
99h - архитектура STARLITE;
FFh - Microsoft, Phoenix.

Если при вызове функции AL был равен 1:

08h - DOS расположен в ПЗУ;

10h - DOS загружен в старшие адреса памяти (область HMA).

7.6.2. Изменения в векторной таблице связи

Формат векторной таблицы связи для MS-DOS версии 5.0 практически идентичен используемому версией 4.0. В этой таблице добавился указатель на список программ, для которых драйвер SETVER.EXE выполняет подстановку значения версии MS-DOS.

Приведем формат векторной таблицы связи для MS-DOS версии 5.0:

(-02h) 2 mcb_seg сегмент первого управляющего блока памяти (MCB)
(00h) 4 dev_cb указатель на первый блок управления устройствами DOS (DOS Device Control Block)
(+04h) 4 file_tab указатель на таблицу файлов DOS
(+08h) 4 clock_dr указатель на драйвер CLOCK$, установленный или резидентный
(+0Ch) 4 con_dr указатель на актуальный драйвер CON, установленный или резидентный
(+10h) 2 max_btbl максимальное число байт в блоке блочного устройства
(+12h) 4 disk_buf указатель на структуру, описывающую дисковые буфера
(+16h) 4 drv_info укзатель на массив информации об устройствах
(+1Ah) 4 fcb_tabl указатель на таблицу FCB
(+1Eh) 2 fcb_size размер таблицы FCB, для версии MS-DOS 5.0 в этом поле находится значение 00h
(+20h) 1 num_bdev число блочных устройств
(+21h) 1 lastdriv значение LASTDRIVE в файле CONFIG.SYS (по умолчанию равно 5)
(+22h) 18 null_dr заголовок драйвера NUL - первого драйвера в списке драйверов DOS
(+34h) 1 joined количество устройств, подсоединенных при помощи команды JOIN
(+35h) 2 special_prg смещение внутри сегмента кода IBMDOS списка специальных программ, для MS-DOS 5.0 в этом поле находится 0000h
(+ 37h) 4 setver_list указатель на список программ, для которых драйвер SETVER.EXE выполняет подстановку значения версии MS-DOS
(+3Bh) 4 internal_1 используется MS-DOS
(+3Fh) 2 buffers_x значение x в команде BUFFERS x,y
(+41h) 2 buffers_y значение y в команде BUFFERS x,y
(+43h) 1 boot_drive номер дискового устройства, использованного для загрузки MS-DOS (1 - A:)
(+44h) 1 cpu_type 01h, если используется процессор 80386 или 80486, 00h для 8086 - 80286.
(+45h) 2 extended_mem размер установленной расширенной памяти в килобайтах

7.6.3. Управление памятью

В MS-DOS версии 5.0 стал документирован блок управления памятью MCB. Приведем формат этого блока.

(00h) 1 Тип блока: 4Dh для всех блоков, кроме последнего. Для последнего блока используется значение 5Ah.
(01h) 2 Сегментный адрес блока PSP программы-владельца данного MCB или значение 0008h для MCB, принадлежащего MS-DOS. Для свободного блока MCB в этом поле находится значение 0000h.
(03h) 2 Размер блока MCB в параграфах.
(05h) 3 Не используются.
(08h) 8 ASCII-имя программы-владельца блока MCB, если это блок PSP.

Самый первый блок MCB является сегментом данных MS-DOS. Он делится на подсегменты, в которых расположены драйверы, системные данные, буфера и т.д.

Приведем формат управляющего блока подсегмента для первого блока MCB. Этот управляющий блок расположен непосредственно перед соотвестсвующим ему подсегментом.

(00h) 1 Тип подсегмента:

"D" - драйвер устройства;
"E" - расширение драйвера устройства;
"I" - драйвер инсталлируемой файловой системы IFS;
"F" - область памяти для управляющего блока оператора "FILES=";
"X" - область памяти для управляющего блока оператора "FCBS=";
"C" - рабочая область для буферов EMS, если используется оператор "BUFFERS /X";
"B" - рабочая область для буферов, если используется оператор "BUFFERS";
"L" - область памяти для массива структур текущих каталогов;
"S" - сегмент памяти для оператора "STACKS=";
"T" - сегмент памяти для оператора "INSTALL=".

(01h) 2 Параграф, начиная с которого располагается данный подсегмент. Обычно это следующий за управляющим блоком параграф.
(03h) 2 Размер подсегмента в параграфах.
(05h) 3 Не используются.
(08h) 8 Для подсегментов "I" и "D" в этом поле находится имя файла, из которого был загружен драйвер.

Кроме рассмотренных выше, в MS-DOS версии 5.0 появился новый тип управляющего блока памяти - UMCB - управляющий блок для верхней области памяти UMB (Upper Memory Block):

(00h) 1 Тип блока: 4Dh для всех блоков, кроме последнего. Для последнего блока используется значение 5Ah.
(01h) 2 Первый доступный в верхней памяти UMB параграф для самого первого блока UMCB, 000Ah - если управляющий блок расположен в конце UMB.
(03h) 2 Размер блока UMB в параграфах.
(05h) 3 Не используются.
(08h) 8 Тип блока: "UMB" для начального блока, "SM" - для конечного.

Начиная с версии 3.0 MS-DOS содержит функцию 58h прерывания INT 21h, позволяющую определять и изменять стратегию выделения памяти запущенным программам. В версии 5.0 добавились новые возможности, в частности, возможность выделения блоков верхней памяти, используемых только в MS-DOS версии 5.0.

Регистры на входе:

Регистр Содержимое
AH 58h
AL Подфункция:

00h - определить используемую стратегию;
01h - установить стратегию;
02h - получить состояние списка блоков верхней памяти UMB;
03h - установить состояние списка блоков верхней памяти UMB.

BL Подфункция 01h - новая стратегия:

00h - первым заполняется первый свободный участок в области младших адресов памяти;
01h - аналогично, но используется участок памяти, наилучшим образом подходящий для запроса;
02h - аналогично, но используется последний свободный участок памяти;

40h ,41h 42h - аналогично 00h, 01h, 02h, но используются старшие адреса памяти;

80h, 81h, 82h - аналогично 00h, 01h, 02h, но сначала делается попытка выделить старшие адреса памяти, а в случае неудачи - младшие.

Подфункция 03h - новое состояние списка блоков верхней памяти:

BX = 0000h - удалить блоки UMB из списка блоков памяти DOS;
BX = 0001h - добавить блоки UMB в список блоков памяти DOS.

BH Подфункция 01h - новая стратегия:

Равен 00h.

Регистры на выходе:

Регистр Содержимое
AX Подфункция 00h - определить стратегию:

AX = код используемой стратегии (см. выше).

Подфункция 02h - определитьсостояние списка блоков верхней памяти:

AL = 00h - блоки UMB удалены из списка блоков памяти DOS;
AL = 01h - блоки UMB входят в список блоков памяти DOS.

В версии 5.0 MS-DOS появились функция для непосредственного выделения программам блоков старшей памяти HMA. Это функция 4A02h:

Регистры на входе:

Регистр Содержимое
AX 4A02h
BX Размер выделяемого блока памяти в байтах (после возврата содержимое этого регистра будет уничтожено).

Регистры на выходе:

Регистр Содержимое
ES:DI Адрес выделенного блока памяти или FFFF:FFFF в случае неудачи.

Прежде чем пользоваться только что описанной функцией, имеет смысл определить размер свободной старшей памяти при помощи функции 4A01h:

Регистры на входе:

Регистр Содержимое
AX 4A01h

Регистры на выходе:

Регистр Содержимое
BX Размер доступной области старшей памяти в байтах или 0000h, если DOS не использует область HMA.
ES:DI Адрес начала доступной области старшей памяти или FFFF:FFFF, если DOS не использует область HMA.

7.6.4. Управление программами

В версии 5.0 MS-DOS появились некоторые новые функции, имеющие отношение к управлению программами. Например, функция 4B05h прерывания INT 21h предназначена для подготовки программы к выполнению. Эта функция может использоваться программами, перехватывающими функцию 4B00h (обычный запуск программы), например, для установки версии MS-DOS.

Регистры на входе:

Регистр Содержимое
AX 4B05h
DS:DX Адрес управляющей структуры (см. ниже)

Регистры на выходе:

Регистр Содержимое
AX 00h, если сброшен флаг CF и, соответственно, функция выполнилась без ошибок;
код ошибки, если установлен флаг CF.

Перед вызовом функции необходимо подготовить управляющую структуру:

(00h) 2 Зарезервировано и равно 00h.
(02h) 2 Флаги типа программы:

Бит 0 - программа типа .EXE;
Бит 1 - оверлей.

(04h) 4 Указатель на ASCII-имя файла с программой.
(08h) 2 PSP сегмента новой программы.
(0Ah) 4 Стартовый адрес CS:IP новой программы.
(0Eh) 4 Размер программы с учетом PSP.

После возврата из этой функции до завершения запущенной программы нельзя вызывать прерывания DOS, BIOS или другие программные прерывания. Если MS-DOS работает в верхней области памяти HMA, после возврата из этой функции адресная линия A20 выключается .

Некоторые недокументированные функции управления программами были включены в документацию MS-DOS версии 5.0:

Функция Назначение
50h Установить PSP для текущей программы.
51h Получить PSP текущей программы.

7.6.5. Резидентные программы

К сожалению, версия 5.0 операционной системы MS-DOS не порадовала разработчиков какими-либо новыми возможностями в плане создания резидентных программ. Это, в частности, говорит о неперспективности данного класса программ. Очевидно, что при наличии переключателя программ и таких средств, как Microsoft Windows, обеспечивающих одновременное (или псевдо-одновременное) выполнение программ, актуальность резидентных программ падает.

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

Взяв на себя обязательства поддерживать эти возможности, фирма Microsoft гарантирует, что и в следующих версиях MS-DOS вы по-прежнему сможете использовать свои старые добрые резидентные программы.

7.6.6. Драйверы

Что касается драйверов устройств, то версия 5.0 операционной системы содержит расширения для работы с командами общего ввода/вывода - GENERIC IOCTL.

В заголовке драйвера в слове атрибутов определен зарезервированный ранее бит 7. Если этот бит установлен в 1, драйвер поддерживает новую команду с кодом 19h. Эта команда позволяет операционной системе определить, спосбен ли данный драйвер работать с командами общего ввода/вывода (GENERIC IOCTL).

Для проверки возможности использования GENERIC IOCTL программа может вызвать одну из двух новых функций - 4410h или 4411h. Первая функция определяет поддержку GENERIC IOCTL для устройства, заданного своим индексом (handle), вторая - для устройства, заданного своим адресом (номером).

Функция 4410h:

Регистры на входе:

Регистр Содержимое
AX 4410h
BX Индекс (handle) устройства.
CH Код категории:

00h неизвестное устройство
01h COMn:
03h CON
05h LPTn:

CL Код функции, для которого необходимо выполнить проверку поддержки:

45h установить счетчик повторов
4Ah выбрать кодовую страницу
4Ch начать подготовку кодовой страницы
4Dh завершить подготовку кодовой страницы
5Fh установить информацию для отображения
65h получить счетчик повторов
6Ah запросить выбранную кодовую страницу
6Bh запросить подготовленный список
7Fh получить информацию для отображения

Регистры на выходе:

Регистр Содержимое
AX 0000h, флаг CF сброшен - данная функция GENERIC IOCTL поддерживается драйвером.

xx01h, флаг CF установлен в 1 - функция не поддерживается.

Функция 4411h:

Регистры на входе:

Регистр Содержимое
AX 4410h
BL Номер устройства.
CH Код категории (08h - диск)
CL Код функции, для которого необходимо выполнить проверку поддержки.

Регистры на выходе:

Регистр Содержимое
AX 0000h, флаг CF сброшен - данная функция GENERIC IOCTL поддерживается драйвером.

xx01h, флаг CF установлен в 1 - функция не поддерживается.

7.6.7. Переключатель задач

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

Нажимая клавиши <ALT-TAB>, можно выбирать для выполнения одну из запущенных программ.

Обратим ваше внимание на одну потенциальную опасность, связанную с использованием переключателя задач.

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

Так как передача данных через модем - дело не быстрое, у вас может появиться необходимость выполнить на компьютере какую-либо другую работу, например, отредактировать и распечатать текст. Нет проблем, вы переключаетесь на программу редактирования текстов. Но... компьютер почему-то "зависает".

А дело оказывается в том, что выгрузив телекоммуникационную программу на диск, переключатель задач "оторвал" обработчик аппаратного прерывания асинхронного порта. Прерывание пришло, а обработчика-то и нет!

Для пользователя в данной ситуации есть только один выход - не использовать переключатель программ совместно с телекоммуникационными программами.

Однако программист имеет возможность учесть в своих разработках присутствие переключателя задач. Программа, определив наличие переключателя, может либо отказаться от работы, либо запретить переключение, если оно затребовано в неподходящий момент времени, либо выполнить перед переключением некоторые "замораживающие" действия (например, замаскировать аппаратное прерывание). Когда программа вновь получит управление, она может "разморозиться".

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

[Назад] [Содеожание]