УСТАНОВКА ЗАМЕЩАЮЩЕГО ДРАЙВЕРА КОНСОЛИ ПОСРЕДТВОМ РЕЗИДЕНТНОЙ ПРОГРАМЫ

Дудин Т.С., ДонНТУ, Донецк

Источник: Інформатика та комп'ютерні технології — 2007 / Матеріали V науково-технічної конференції кафедри КЭМ. — Донецьк, ДонНТУ — 2007, с. 125.

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

Также актуальным становиться установка новых драйверов и обновление драйверов под новую аппаратуру. Может потребоваться внести модификацию в работу уже существующего драйвера. Я постараюсь объяснить, каким образом можно это сделать в операционной системе MS-DOS, и покажу один из вариантов установки драйвера в систему.

Вслед за областью данных BIOS в оперативной памяти IBM PC располагается область данных MS-DOS. Здесь располагаются внутренние переменные и структуры MS-DOS. Основные структуры данных организованы в виде дерева. Корнем является векторная таблица связи, которая содержит адреса всех остальных структур: список блоков управления памятью (MCB), список блоков управления устройствами MS-DOS, таблицу файлов, дисковые буфера. Векторная таблица связи содержит и другую полезную информацию, открывающую доступ практически ко всем внутренним структурам данных операционной системы (адрес таблицы можно получить с помощью функции 52h int 21h). И конечно, с помощью этих структур системы осуществляется связь с драйверами.

Какие же именно структуры и их элементы нужны для того чтобы иметь доступ к драйверу консоли, который используется в системе? Мною выделено 3 области. Первая – это поле con_dr векторной таблицы связи, которое содержит указатель на актуальный драйвер консоли. Вторая – цепочка установленных драйверов в системе. Начало цепочки – первый драйвер NUL, указатель на который содержит поле null_dr векторной таблицы связи. Третья - таблица файлов MS-DOS. MS-DOS создает таблицу открытых файлов (DFT или SFT) и помещает ее адрес в поле file_tab векторной таблицы связи. Каждая таблица DFT содержит указатель на следущую таблицу и количество управляющих блоков файлов MS-DOS (DFCB). Сами блоки DFCB (по одному для каждого файла) расположены в конце таблицы DFT. В этой таблице для каждого открытого файла хранится такая информация, как количество файловых чисел, связанных с данным файлом, режим открытия файла, слово информации об устройстве, указатель на заголовок драйвера, обслуживающего данное устройство и т.д. MS-DOS при загрузке открывает стандартные файлы, а именно стандартный файл устройства консоли. Соответственно для него создается блок DFCB, в котором в поле driver содержит указатель на драйвер, обслуживающий устройство, содержащее файл.

Таким образом, чтобы система начала использовать замещающий драйвер консоли, необходимо поместить в указанных полях указатели на замещающий драйвер консоли (con_dr, driver) и вставить драйвер в цепочку драйверов (хотя последнее не обязательно для работы замещающего драйвера)

Возникает проблема получения указателя на драйвер. Сперва нужно иметь загруженный в памяти модуль драйвера. Затем передать указатель на модуль драйвера. Драйвер - особая разновидность программ. Имеется управляющий блок в самом начале модуля драйвера. Это так называемый заголовок драйвера. Этот заголовок создается не редактором связи, а самим программистом и должен быть помещен в самое начало исходного текста программы-драйвера. При загрузке драйвера в память заголовок драйвера тоже помещается в оперативную память. Для драйвера никогда не создается префикс программного сегмента PSP, как для COM или EXE программы.

Если использовать для установки драйвера резидентную COM-программу, которая в своем теле будет содержать модуль драйвера, то отпадает необходимость вручную выделять память и загружать в нее модуль драйвера, т. к. при выполнении COM-программы система загружает ее в память, и внутри COM-программы в память попадает модуль драйвера. В MS-DOS имеется две функции "завершить и оставить резидентной" - int 27h и int 21h AH=31h. Функция int 27h является устаревшей и внутри DOS она отображается в запрос int 31h. Запросы "завершить и оставить резидентной" обрабатываются одной и той же подпрограммой завершения. При выполнении запроса "завершить и оставить резидентной" подпрограмма завершения не закрывает никакие файлы и не освобождает никакую память, но она модифицирует размер блока памяти, содержащий PSP. Завершающая программа указывает размер нового блока памяти в качестве аргумента для запроса "завершить и оставить резидентной".

Всякая COM-программа начинает выполняться с адреса 100h, после PSP. Все сегментные регистры устанавливаются в значение сегмента кода, а максимальный размер COM-программы 64Кбайт. Первой командой будет безусловный переход на метку инициализации (между командой перехода и меткой располагается код драйвера, команда инициализации не нужна, ее код удаляем). Весь код за меткой инициализации не будет резидентным, т.е. будет удален из памяти по завершении. Здесь необходимо произвести запись в описанные ранее поля векторной таблицы связи адрес начала модуля драйвера: смещение 0Ch от начала векторной таблицы связи – поле con_dr, смещение 0EEh– поле driver в DFT. Адрес легко определяется как адрес поля next заголовка драйвера. Далее вставляем драйвер в цепочку драйверов. И выполняем прерывание int 27h – завершить программу и оставить резидентной, которой в качестве параметра передаем смещение метки инициализации (будет воспринято как размер блока).

Данная программа была успешно разработана мною в ходе работы над курсовым проектом. Она довольно четко демонстрирует работу MS-DOS с драйверами. Такая программа является одним из способов установки драйвера. Плюсы программы в том, что ее написание занимает ничтожно мало времени, а также дает разработчику драйвера больший выбор в определении роли драйвера в системе, т.к. полностью контролируется установка драйвера. Такой способ установки драйвера в систему имеет недостаток, т.к. предполагает наличие исходника драйвера. Также резидентный код в памяти становиться больше (добавляется PSP и команда перехода, замена инициализации).




Rambler's Top100