Поделиться через


Object-Based

Операционная система на основе Microsoft Windows NT основана на объектной базе. Различные компоненты в исполнительном элементе определяют один или несколько типов объектов. Каждый компонент экспортирует подпрограммы поддержки в режиме ядра, которые управляют экземплярами своих типов объектов. Ни один компонент не может напрямую обращаться к объектам другого компонента. Чтобы использовать объекты другого компонента, компонент должен вызывать экспортированные подпрограммы поддержки.

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

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

Как и операционная система, драйверы также основаны на объектах. Рассмотрим пример.

  • Объекты файлов представляют подключение приложения пользовательского режима к устройству.

  • Объекты устройств представляют логические, виртуальные или физические устройства каждого драйвера.

  • Объекты драйверов представляют образ загрузки каждого драйвера.

Диспетчер ввода-вывода определяет структуру и интерфейсы для файловых объектов, объектов устройств и объектов драйвера.

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

ПрефиксOperationObject

где

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

Операция Описывает, что делается с объектом.

Объект Определяет тип объекта.

Например, подпрограмма IoCreateDevice диспетчера ввода-вывода создает объект устройства для представления физического, логического или виртуального устройства в качестве целевого объекта запросов ввода-вывода.

Один системный компонент может экспортировать подпрограммы, которые вызывают подпрограммы поддержки другого компонента. Это может снизить количество вызовов, которые должен выполнять драйвер. Менеджер ввода-вывода, в частности, экспортирует определенные подпрограммы, которые упрощают разработку драйверов. Например, IoConnectInterruptEx, который драйверы нижнего уровня вызывают для регистрации своих ISR, вызывает подпрограммы поддержки ядра для объектов прерываний.

Непрозрачность объектов

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

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