Главная страница
Навигация по странице:

  • Смещение, байт Размер, байт Имя поля Описание

  • ос и с. ОСиС. 1. Классификация программного обеспечения


    Скачать 2.7 Mb.
    Название1. Классификация программного обеспечения
    Анкорос и с
    Дата11.12.2022
    Размер2.7 Mb.
    Формат файлаdoc
    Имя файлаОСиС.doc
    ТипДокументы
    #839260
    страница17 из 29
    1   ...   13   14   15   16   17   18   19   20   ...   29


    Все драйверы связаны в цепочку. Самый первый драйвер находится сразу за векторной таблицей связи. Поле next заголовка драйвера указывает на следующий драйвер (на его заголовок). Это поле имеет формат дальнего указателя и состоит из адреса сегмента и смещения. Признаком того, что данный драйвер является последним в цепочке, служит значение 0FFFFh в компоненте смещения поля next.

    Программист, когда он составляет программу-драйвер, заносит в это поле либо 0FFFFh:0FFFFh, если исходный текст содержит только один драйвер, либо адрес следующего драйвера (в виде дальней ссылки на метку заголовка следующего драйвера). Если исходный текст содержит несколько драйверов, то в заголовке последнего драйвера в поле next должно находиться значение 0FFFFh:0FFFFh.
    При загрузке драйверов в память операционная система изменит содержимое поля next в заголовках драйверов для того, чтобы это поле указывало на заголовок следующего драйвера в цепочке (в памяти, а не в файле драйвера).

    Обычно исходный текст программы содержит один драйвер, и поле next задается следующим образом:
    next DD 0FFFFFFFFh
    Следующее поле в заголовке драйвера - поле атрибутов драйвера atrib.

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

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

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

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

    С помощью блочных драйверов можно организовать защиту информации, расположенной в файлах, от несанкционированного доступа. Для этого ваш драйвер может шифровать данные, которые записываются на диск, и предоставлять их по предъявлению пароля.

    Мы рассмотрим драйверы обоих типов, при этом мы каждый раз будем отмечать особенности символьных и блочных устройств.

    Приведем назначение отдельных битов слова атрибутов символьного драйвера :


    Бит

    Назначение

    0

    1 - драйвер обслуживает стандартное устройство ввода;
    0 - этот драйвер не обслуживает стандартное устройство ввода

    1

    1 - драйвер обслуживает стандартное устройство вывода;
    0 - драйвер не обслуживает стандартное устройство вывода

    2

    1 - драйвер стандартного устройства NUL;
    0 - драйвер не обслуживает устройство NUL

    3

    1 - драйвер обслуживает часы

    4

    Для работы с устройством можно использовать средство быстрого символьного вывода - прерывание INT 29h. Это прерывание предназначено для быстрого вывода символа на консоль, код символа необходимо записать в регистр AL

    5

    Зарезервировано, бит должен быть равен 0

    6

    1 - разрешено использование драйвером функций IOCTL ;
    0 - функции IOCTL не поддерживаются

    7

    1 - устройство может принимать запросы IOCTL (интерфейс IOCTL будет описан позже)

    8-10

    Эти биты зарезервированы и должны быть равны 0

    11

    1 - поддерживаются функции открытия/закрытия устройства (OPEN/CLOSE);
    0 - функции OPEN/CLOSE для символьных устройств не поддерживаются

    12

    Зарезервировано, бит должен быть равен 0

    13

    1 - для символьных устройств поддерживается функция вывода до получения состояния занятости устройства;
    0 - функция вывода до состояния занятости не поддерживается

    14

    1 - поддерживаются функции чтения и записи через интерфейс IOCTL ;
    0 - функции чтения/записи через интерфейс IOCTL не поддерживаются

    15

    1 - символьное устройство;
    0 - блочное устройство


    Для драйверов блочных устройств формат слова атрибутов другой:


    Бит

    Назначение

    0

    Зарезервировано, бит должен быть равен 0

    1

    1 - драйвер поддерживает 32-битовую адресацию сектора (для MS-DOS версии 4.00 и более поздних версий).Если установлен этот бит, поле номера сектора всех запросов является двойным словом, добавляемым в конец заголовка запроса, старое поле номера сектора должно содержать -1;
    0 - используется 16-битовая адресация сектора

    2-5

    Эти биты зарезервированы и должны быть равны 0

    6

    1 - поддерживаются логические дисковые устройства;
    0 - логические устройства не поддерживаются

    7

    1 - устройство может принимать запросы

    8-10

    Эти биты зарезервированы и должны быть равны 0

    11

    1 - единица в этом бите означает, что драйвер поддерживает функцию проверки замены носителя данных в устройстве (например, замены дискеты);
    0 - функция проверки замены носителя данных не поддерживается

    12

    Зарезервировано, бит должен быть равен 0

    13

    1 - драйверу необходимо выдать запрос на построение блока параметров BIOS BPB (для выполнения этого запроса драйвер считывает сектор логического диска, содержащий начало таблицы FAT , в этом секторе находится байт идентификации носителя данных);
    0 - запрос не требуется, драйвер пользуется FAT

    14

    1 - поддерживаются функции чтения и записи через интерфейс IOCTL ;
    0 - функции чтения/записи через интерфейс IOCTL не поддерживаются

    15

    1 - символьное устройство;
    0 - блочное устройство


    Более подробно назначение отдельных бит слова атрибутов драйвера мы рассмотрим позже при описании функций, выполняемых драйвером. Приведем пример определения слова атрибутов для символьного драйвера нестандартного устройства с минимальными функциональными возможностями:
    attrib DW 8000h
    После слова атрибутов драйвера находятся два очень важных поля: смещение программы стратегии драйвера strateg и смещение программы обработки прерывания interrupt. Эти две программы используются MS-DOS для организации вызова драйвера.

    Для обращения к драйверу MS-DOS формирует в своей области данных запрос, состоящий из заголовка стандартного формата и дополнительной структуры данных (переменной части запроса), длина и формат которой зависят от типа запроса. После этого MS-DOS считывает из заголовка драйвера смещение программы стратегии и передает ей управление, записав в регистры ES:BX адрес заголовка запроса.

    Задача программы стратегии - запомнить этот адрес внутри тела драйвера для дальнейшего использования или организовать очередь запросов обслуживания.

    Сразу после вызова программы стратегии MS-DOS вызывает программу обработки прерываний, определив ее адрес из поля interrupt заголовка драйвера.

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

    Формат заголовка запроса будет приведен ниже, а сейчас покажем, как в заголовке драйвера задаются смещения программ стратегии и прерывания:
    strateg DW strateg_proc

    interrupt DW interrupt_proc
    Последнее поле заголовка драйвера dev_name имеет различную интерпретацию для символьных и блочных устройств.
    Для символьных устройств в этом поле должно располагаться имя устройства, выровненное по левому краю. Если длина имени меньше 8 байт, его нужно дополнить пробелами. Это имя будет использоваться для обращения к драйверу. Если вы собираетесь заменить драйвер стандартного символьного устройства MS-DOS на свой, нужно записать имя устройства прописными буквами:
    dev_name DB 'AUX '
    Для блочных устройств первый байт поля dev_name содержит количество устройств, обслуживаемых данным драйвером, остальные семь байт не используются:
    dev_name DB 1

    DB 7 dup(?)
    Таким образом, мы выяснили, что драйвер содержит в самом начале заголовок, и где-то дальше должны располагаться программы стратегии и прерывания. Не следует путать программу прерывания драйвера с программой обслуживания аппаратных или программных прерываний. Хотя программа прерывания драйвера немного похожа на обработчик программных прерываний, назначение этой программы и механизм ее использования совершенно другой.

    Это могут быть области данных, используемые драйвером, и функции, вызываемые программами стратегии и прерывания. Иногда стандартные драйверы переключают на себя некоторые векторы прерываний, и тогда они содержат в себе обработчики этих прерываний. В области памяти, отведенной операционной системой драйверу, может располагаться стек драйвера, если размер системного стека недостаточен.

    На длину драйвера накладывается такое же ограничение, как и на длину com-программ - 64 Кбайт, то есть один сегмент.


    1. Процесс загрузки драйверов


    Системный файл MS-DOS с именем io.sys содержит драйверы для некоторых устройств. Эти драйверы появляются в памяти при загрузке операционной системы и связаны в цепочку через поля next в своих заголовках. Такие драйверы мы будем называть резидентными драйверами MS-DOS.

    Резидентные драйверы можно заменить драйверами пользователя. Кроме того, пользователь может добавить в список драйверов новые.

    Для подключения драйвера к операционной системе файл config.sys должен содержать строку следующего вида:
    DEVICE=<путь_файла_драйвера>_<параметры>.
    Например:
    DEVICE=c:\dos\smartdrv.sys 120
    В этом примере подключается драйвер smartdrv.sys, который находится в каталоге dos на диске C:. В качестве параметра инициализации драйверу передается число 120. Параметры считываются драйвером один раз в процессе инициализации драйвера.

    Загружаемые дополнительно драйверы находятся в списке драйверов перед резидентными драйверами.

    Для каждого драйвера выводится адрес его расположения в памяти, слово атрибутов драйвера и имя устройства (либо количество обслуживаемых блочным драйвером устройств).

    Первым в этом списке всегда является драйвер устройства с именем NUL. Это так называемое нуль-устройство, которое можно использовать для отладки. Драйвер псевдоустройства NUL не может быть переназначен, он всегда расположен непосредственно за векторной таблицей связи MS-DOS.

    Дальше идут драйверы, описанные в файле config.sys .

    Начиная с драйвера консоли CON , в списке расположены резидентные драйверы, имеющие сегментный адрес 0070. Это драйвер последовательного канала связи AUX , драйвер устройства печати PRN , драйвер часов CLOCK$ , драйверы последовательных каналов COM1 , COM2 , COM3, COM4 и драйверы устройств печати LPT1 , LPT2 , LPT3 .

    Если ваш драйвер должен заменить стандартный, укажите имя устройства заглавными буквами (например, LPT1). Система разместит ваш драйвер в цепочке драйверов до стандартного драйвера с именем LPT1.

    Когда операционная система загружает драйвер, она создает заголовок запроса и помещает в него команду инициализации. Затем она вызывает программу стратегии драйвера, которой передается адрес подготовленного заголовка запроса. После этого управление передается программе прерывания драйвера. Эта программа просматривает заголовок запроса и выполняет указанную в ней команду инициализации.

    Инициализирующая часть выполняется только один раз при загрузке драйвера. Она может считать параметры инициализации из файла config.sys , выдать инициализирующие команды на периферийное устройство, выполнить инициализацию внутренних областей данных и т. д. Перед завершением своей работы инициализирующая часть драйвера записывает в заголовок запроса размер резидентной части драйвера. Фрагмент драйвера, который выполняет инициализацию, больше не будет нужен, поэтому его не следует оставлять в памяти.

    Более подробно процесс инициализации будет рассмотрен при описании команды инициализации драйвера.



    1. Связь драйвера с операционной системой


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

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

    Запрос операционной системы к драйверу содержит заголовок, имеющий фиксированный формат и длину 13 байт, а также структуру переменного размера и формата, которые зависят от выполняемой функции (переменная область запроса).
    Приведем формат заголовка запроса :


    Смещение, байт

    Размер, байт

    Имя поля

    Описание

    0

    1

    size

    Общий размер блока запроса в байтах (длина заголовка запроса плюс длина переменной части запроса)

    1

    1

    unit

    Номер устройства. Используется для блочных устройств; указывает, с каким именно устройством (из числа обслуживаемых данным драйвером) будет работать операционная система

    2

    1

    cmd

    Код команды, которую требуется выполнить. Может иметь значение от 00h до 18h

    3

    2

    status

    Слово состояния устройства. Заполняется драйвером перед возвращением управления операционной системе

    5

    8

    reserved

    Зарезервировано


    После вызова программы стратегии MS-DOS передает управление программе прерывания (без параметров). Задача программы прерывания - выполнить команду, код которой находится в поле cmd заголовка запроса. Если драйвер блочного устройства обслуживает несколько логических устройств, то в поле unit находится номер устройства, для которого необходимо выполнить команду.

    В зависимости от выполняемой команды запрос может содержать и другую информацию, необходимую для выполнения команды.

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


    Бит

    Назначение

    0-7

    Код ошибки устройства. Если команда выполнена с ошибкой и драйвер установил признак ошибки (бит 15) в единицу, он должен записать в это поле код ошибки

    8

    Команда выполнена. Этот бит всегда устанавливается драйвером перед возвращением управления операционной системе

    9

    Занято. Этот бит устанавливается обработчиком команды, когда физическое устройство занято выполнением предыдущей операции и поэтому не может выполнить новую команду. Данный бит используется также для передачи информации о том, что буфер клавиатуры содержит данные или о том, что среда носителя данных может быть заменена (в команде проверки возможности замены среды носителя данных)

    10-14

    Зарезервировано

    15

    Признак ошибки. Устанавливается драйвером, когда он не может обработать запрос или произошла физическая либо логическая ошибка при обработке правильного запроса. Биты 0-7 при этом должны содержать код ошибки
    1   ...   13   14   15   16   17   18   19   20   ...   29


    написать администратору сайта