Операционная система MS-DOS© Александр Фролов, Григорий ФроловТом 1, книга 3, М.: Диалог-МИФИ, 1992. 7.6. MS-DOS версии 5.07.6.1. Новое в MS-DOS версии 5.0Версия 5.0 операционной системы MS-DOS не разочаровала пользователей компьютеров и программистов. Преимущества столь значительны и заметны, что уже не может быть оправдания для приверженцев версии 3.30 или даже 4.01. Перечислим только основные нововведения.
Сразу отметим, что функция 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. Приведем формат этой функции. Регистры на входе:
Регистры на выходе:
Функция 30h в версии MS-DOS также претерпела некоторые изменения. Если при вызове этой функции в регистр AL записать значение 00h, все будет аналогично версиям 2.0-4.0. Если в AL записать 01h, после возврата регистр BH будет содержать флаги, по которым можно судить о расположении MS-DOS в ПЗУ или в старших адресах памяти. Приведем полный формат вызова функции 30h прерывания INT 21h. Регистры на входе:
Регистры на выходе:
7.6.2. Изменения в векторной таблице связиФормат векторной таблицы связи для MS-DOS версии 5.0 практически идентичен используемому версией 4.0. В этой таблице добавился указатель на список программ, для которых драйвер SETVER.EXE выполняет подстановку значения версии MS-DOS. Приведем формат векторной таблицы связи для MS-DOS версии 5.0:
7.6.3. Управление памятьюВ MS-DOS версии 5.0 стал документирован блок управления памятью MCB. Приведем формат этого блока.
Самый первый блок MCB является сегментом данных MS-DOS. Он делится на подсегменты, в которых расположены драйверы, системные данные, буфера и т.д. Приведем формат управляющего блока подсегмента для первого блока MCB. Этот управляющий блок расположен непосредственно перед соотвестсвующим ему подсегментом.
Кроме рассмотренных выше, в MS-DOS версии 5.0 появился новый тип управляющего блока памяти - UMCB - управляющий блок для верхней области памяти UMB (Upper Memory Block):
Начиная с версии 3.0 MS-DOS содержит функцию 58h прерывания INT 21h, позволяющую определять и изменять стратегию выделения памяти запущенным программам. В версии 5.0 добавились новые возможности, в частности, возможность выделения блоков верхней памяти, используемых только в MS-DOS версии 5.0. Регистры на входе:
Регистры на выходе:
В версии 5.0 MS-DOS появились функция для непосредственного выделения программам блоков старшей памяти HMA. Это функция 4A02h: Регистры на входе:
Регистры на выходе:
Прежде чем пользоваться только что описанной функцией, имеет смысл определить размер свободной старшей памяти при помощи функции 4A01h: Регистры на входе:
Регистры на выходе:
7.6.4. Управление программамиВ версии 5.0 MS-DOS появились некоторые новые функции, имеющие отношение к управлению программами. Например, функция 4B05h прерывания INT 21h предназначена для подготовки программы к выполнению. Эта функция может использоваться программами, перехватывающими функцию 4B00h (обычный запуск программы), например, для установки версии MS-DOS. Регистры на входе:
Регистры на выходе:
Перед вызовом функции необходимо подготовить управляющую структуру:
После возврата из этой функции до завершения запущенной программы нельзя вызывать прерывания DOS, BIOS или другие программные прерывания. Если MS-DOS работает в верхней области памяти HMA, после возврата из этой функции адресная линия A20 выключается . Некоторые недокументированные функции управления программами были включены в документацию MS-DOS версии 5.0:
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: Регистры на входе:
Регистры на выходе:
Функция 4411h: Регистры на входе:
Регистры на выходе:
7.6.7. Переключатель задачПереключатель задач, входящий в диалоговую оболочку DOSSHELL - одно из значительных усовершенствований MS-DOS версии 5.0. Этото переключатель позволяет запустить на выполнение одновременно несколько программ, хотя в действительности работать будет только одна - та, которая была запущена последней. Неактивные программы выгружаются на диск. Нажимая клавиши <ALT-TAB>, можно выбирать для выполнения одну из запущенных программ. Обратим ваше внимание на одну потенциальную опасность, связанную с использованием переключателя задач. Предположим, что одна из запущенных вами программ устанавливает собственный обработчик какого-либо аппаратного прерывания. Например, вы запустили телекоммуникационную программу и работаете через модем с удаленным компьютером. Не исключено, что ваша программа устанавливает собственный обработчик аппаратного прерывания от асинхронного порта, к которому подключен модем. Так как передача данных через модем - дело не быстрое, у вас может появиться необходимость выполнить на компьютере какую-либо другую работу, например, отредактировать и распечатать текст. Нет проблем, вы переключаетесь на программу редактирования текстов. Но... компьютер почему-то "зависает". А дело оказывается в том, что выгрузив телекоммуникационную программу на диск, переключатель задач "оторвал" обработчик аппаратного прерывания асинхронного порта. Прерывание пришло, а обработчика-то и нет! Для пользователя в данной ситуации есть только один выход - не использовать переключатель программ совместно с телекоммуникационными программами. Однако программист имеет возможность учесть в своих разработках присутствие переключателя задач. Программа, определив наличие переключателя, может либо отказаться от работы, либо запретить переключение, если оно затребовано в неподходящий момент времени, либо выполнить перед переключением некоторые "замораживающие" действия (например, замаскировать аппаратное прерывание). Когда программа вновь получит управление, она может "разморозиться". Последний способ взаимодействия с
переключателем самый удобный. Он возможен
благодаря тому, что переключатель задач имеет
механизм, позволяющий известить работающую
программу о том, что затребовано переключение. |