Понять,
что такое драйвер, мы попробуем на
типовом примере взаимодействия прикладной программы с драйвером. В NT существует
два типа драйверов: драйверы пользовательского
режима и драйверы режима ядра. В этом разделе мы рассмотрим, какое программное
обеспечение необходимо для разработки и отладки драйверов, а также его установку
и настройку Для построения драйверов и связанных с ними прикладных программ используется
утилита BUILD, входящая в состав
DDK. Необходимо особо отметить, что драйверы предполагается писать
на С, а не на C++. Microsoft не поддерживает использование C++ для компонентов
ядра.
Общая архитектура Windows NT
В этой главе рассматриваются ключевые
архитектурные особенности и характеристики ОС
Windows NT. Эти сведения необходимы для получения представления о назначении
различных компонентов ОС, их взаимодействии друг с другом, а также для ознакомления
с терминологией При обсуждении архитектуры ОС Windows NT постоянно используются
понятия «режим пользователя» и «режим
ядра», поэтому стоит определить, что это значит. Защищенный
режим является основным и наиболее естественным режимом работы 32-разрядных
процессоров. Этот режим был в полной мере реализован в процессорах серии i386
и с тех пор существенных изменений не претерпел. Основные
характеристики Windows NT На NT иногда ссылаются как на операционную систему
на основе микроядра (microkernel-based
operating system). Идея, лежащая в основе концепции микроядра, состоит в том,
что все компоненты ОС за исключением небольшой основы (собственно, микроядра)
исполняются как процессы пользовательского режима. Базовые компоненты в микроядре
исполняются в привилегированном режиме.
Подсистемы окружения операционной
системы NT реализованы как системы типа
клиент/сервер. Микроядро и Слой
Абстрагирования от Оборудования (HAL) изолируют подсистемы Исполнительной
Системы от конкретной
архитектуры процессора. В исполнительной системе объект
(object) - это отдельный образец статически определенного типа объектов, существующий
во время выполнения. Поток
(thread) - единица исполнения в NT. Поток - это сущность внутри процесса,
которую ядро направляет на исполнение, он может принадлежать только одному процессу.
NT позволяет нескольким единицам исполнения - потокам - выполняться одновременно,
быстро переключаясь между ними. Такое поведение называется многозадачностью
(multitasking).
Виртуальное
адресное пространство (virtual address space) процесса - это набор адресов,
которые могут использовать потоки процесса, оно равно четырем гигабайтам (232
байт), два из которых предназначены для использования программой, а другие два
зарезервированы для ОС. NT поддерживает только архитектуру с симметричной
мультипроцессорной обработкой - SMP Windows NT разработана со
встроенной сетевой поддержкой и включает широкую поддержку сети, интегрированную
с системой ввода/вывода и интерфейсом Win32 API. Структура
Windows NT Серверы Windows NT называются защищенными
подсистемами, так как каждый из них - это отдельный процесс, память которого
защищена от других процессов системой виртуальной памяти исполнительной системы
NT.
Подсистема среды - это
сервер пользовательского режима, реализующий API некоторой ОС Другой тип защищенных
подсистем - неотъемлемые подсистемы
- это серверы, выполняющие важные функции ОС. Надо отметить, что в разных источниках
понятие исполнительной системы интерпретируется
по-разному Диспетчер Объектов (object
manager), который является вероятно наименее известной из подсистем Исполнительной
Системы NT, является также одним из наиболее важных. Система
ввода/вывода исполнительной системы - это часть кода ОС, получающая запросы
ввода/вывода от процессов пользовательского режима и передающая их, в преобразованном
виде, устройствам ввода/вывода. История
развития компьютерной графики
Ядро
ОС Windows NT реагирует на прерывания и исключения, занимается планированием
потоков, сохранением и восстановлением контекстов потоков, направляет потоки на
выполнение, выполняет межпроцессорную синхронизацию, предоставляет набор сервисов,
элементарных объектов и интерфейсов, используемых компонентами исполнительной
системы Слой абстрагирования от оборудования
(Hardware Abstraction Layer, HAL) является относительно тонким слоем кода, взаимодействующим
напрямую с процессором, шинами и другим оборудованием, и отвечает за обеспечение
стандартного интерфейса к платформенно-зависимым ресурсам для ядра, диспетчера
ввода/вывода и драйверов устройств. Windows NT имеет двухуровневую
модель приоритетов В любое время исполняющийся код будет иметь определенный
уровень IRQL. Этот уровень определяет, что позволено делать коду, применяется
ли к коду механизм квантования времени планировщика и каковы его взаимосвязи с
другими потоками исполнения. Динамические
приоритеты и приоритеты реального времени
NT управляет
прерываниями путем отображения уровней прерывания контроллера прерываний в
собственную аппаратно-независимую таблицу уровней прерываний. Сведения об IRQL
показывают, что уровень Dispatch Level связан с операциями
планирования Текущий уровень IRQL свой у каждого CPU. Код режима ядра может
определить IRQL, в котором он выполняется, посредством вызова функции
KeGetCurrentlrql Организация памяти
в защищенном режиме работы процессора Как уже отмечалось, системное
адресное пространство сильно отличается от пользовательского
Как мы
уже отмечали, линейный и виртуальный
адреса в NT совпадают Эта возможность позволяет приложениям совместно использовать
одну и ту же физическую память (обращаясь
при этом к различным виртуальным адресам) Диспетчер Памяти в NT экспортирует единственную
структуру для контроля данных - Объект-Секцию
Диспетчер памяти использует структуру
MDL для описания набора страниц физической памяти, составляющих буфер виртуальной
памяти в контексте памяти некоторого процесса. Функции
работы с памятью
В исполнительной
системе драйвер устройства и файловая система строятся и выглядят для остальной
части ОС одинаково Итак, файловый
объект - это объект, видимый из режима пользователя, который представляет
всевозможные открытые источники или приемники ввода/вывода: файл на диске или
устройство (физическое, логическое, виртуальное). Драйверы
скрыты от программ пользовательского режима. Устройства (физические, логические
и виртуальные), создаваемые и управляемые драйверами, видны программам пользовательского
режима как именованные файловые объекты Диспетчер ввода/вывода определяет тип
объекта - объект-устройство,
используемый для представления физического, логического или виртуального устройства,
чей драйвер был загружен в систему. Что происходит при
успешном открытии объекта-устройства (неважно, с помощью какой функции: CreateFile()
или NtCreateFile()?
Сейчас мы коротко рассмотрим операции
установки и управления драйверами Точки
входа драйвера Драйвер режима ядра не может использовать API пользовательского
уровня или стандартные библиотеки времени исполнения языка С. Можно использовать
только функции ядра. Диспетчер ввода/вывода вызывает точку
входа DriverEntry при загрузке драйвера Код пользовательского уровня не
может напрямую вызвать код режима ядра
Характеристики
подсистемы ввода/вывода При осуществлении операции ввода/вывода диспетчер
ввода/вывода создает специальный пакет, описывающий эту операцию - пакет
запроса ввода/вывода (I/O Request Packet, IRP). Описатель для буфера данных
инициатора запроса находится в фиксированной
части IRP. NT использует коды функции ввода/вывода для определения конкретной
операции ввода/вывода, которая будет иметь место для конкретного объекта-файла.
Информация, требуемая для выполнения запроса ввода/вывода, содержится в различных
элементах как фиксированной части IRP,
так и стека размещения ввода/вывода.
Ранее в качестве одной из характеристик
подсистемы ввода/вывода упоминалась ее
многоуровневость Стек драйверов
обычно создается самими драйверами Подключение фильтра
к устройству Сериализация -
это процесс выполнения различных операций в нужной последовательности Когда немедленное
завершение запроса ввода/вывода в диспетчерской функции невозможно, драйвер
должен указать Диспетчеру ввода/вывода, что обработка запроса продолжается.
Всякий
раз, когда запрос ввода/вывода удерживается
драйвером в течение продолжительного отрезка времени, драйвер должен быть
готов к отмене данного запроса. Механизмы
синхронизации Спин-блокировка
- простейший механизм синхронизации Спин-блокировки абсолютно необходимы в случаях,
когда требуется синхронизация кода,
работающего на повышенных уровнях IRQL. Ресурсы являются вариантом быстрого
мьютекса
Обобщенная таблица
механизмов синхронизации Любой исполняемый код, как и код драйвера, работает в
контексте некоторого потока. В процессе системной
инициализации NT создает несколько потоков в процессе System В случае, когда
использование системных рабочих потоков
невозможно, драйвер должен создать свой собственный поток. Как говорилось в разделе,
посвященном механизмам синхронизации, поток является диспетчерским
объектом, который переходит в сигнальное состояние при своем завершении. Одной
из основных обязанностей NT является сопряжение
компьютера с его периферийными устройствами Драйверам устройств необходим
способ сообщения NT, что они хотят,
чтобы исполнялась определенная функция, когда процессор получает прерывание, относящееся
к их устройствам. Вдобавок к использованию для работы Диспетчера (планировщика)
NT, IRQL dispatch_level также используется для обработки Отложенных
Вызовов Процедур (DPC)