Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Последняя лекция.doc
Скачиваний:
7
Добавлен:
09.09.2019
Размер:
88.06 Кб
Скачать

5.5 Объекты «файл», «драйвер», «устройство».

С запросами ввода-вывода связаны 4 основные структуры данных: объекты «файл», «драйвер», «устройство» и IRP. Каждая из этих структур определена в файле ntddk.h и в документации DDK.

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

Объект «файл» является разделяемым ресурсом ОС и имеет такие атрибуты, как:

  • имя файла;

  • текущее смещение в байтах относительно начала файла;

  • режим разделения, указывающий, могут или нет другие потоки открывать файл для чтения, записи или удаления, пока им пользуется текущий поток;

  • указатель на объект «устройство», указывающий тип устройства, на котором находится файл;

  • флаги режима открытия, указывающие режим ввода-вывода (синхронный-асинхронный, кэшируемый-некэшируемый, с последовательным или прямым доступом);

  • указатель на блок параметров тома, указывает на том или раздел, на котором находится файл;

  • указатель на структуру, описывающую файл.

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

Объект «драйвер» создается диспетчером ввода-вывода при загрузке в систему драйвера. Диспетчер ввода-вывода вызывает процедуру инициализации драйвера DriverEntry, которая формирует атрибуты объекта «драйвер», в частности, адреса точек входа в драйвер (например, адреса процедур диспетчеризации и ISR).

Для представления устройств драйвер после своей загрузки может создать объект «устройство» вызовом функции IoCreateDevice. Создавая объект «устройство», драйвер может присвоить ему внутреннее имя. Внутреннее имя может быть указано явно, а может быть сгенерировано автоматически. По соглашению имена объектов «устройство» помещаются в каталог пространства имен \Device или в его подкаталогах, недоступные приложениям через WIN32 API. Унаследованные драйверы и драйверы файловой системы обычно создают устройство с общепринятым внутренним именем, например, Device\Serial0 (послед.порт), Device\Floppy0 (драйвер дискет). Для сред с динамически меняющимся составом оборудования устройство может быть представлено уникальным идентификатором, и по этому идентификатору приложение может получить внутреннее имя устройства. В API WIN32 для открытия устройства с помощью функции CreateFile необходимо знать не внутреннее имя устройства, а символьную ссылку на внутреннее имя устройства. Символьная ссылка на внутреннее имя объекта «устройство» в каталоге Device создается драйвером устройства в каталоге \??. Например, символьная ссылка COM1 соответствует внутреннему имени устройства Device\Serial0. C: представляет собой символьную ссылку на внутреннее устройство с именем \Device\HardDiskVolume1, т.е. на первый том первого жесткого диска в системе. Только зная символьную ссылку на имя устройства, приложение может открыть устройство.

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

Использование объектов «драйвер» и «устройство» позволяет диспетчеру ввода-вывода не знать деталей реализации драйверов, упростить закрепление драйверов за устройствами.