Открыть сервис

Стек драйверов

Стек драйверов — это иерархическая структура программных компонентов (драйверов), обеспечивающая взаимодействие между операционной системой (ОС) и аппаратным устройством или набором устройств, а также между различными уровнями подсистем ввода-вывода. В отличие от единого драйвера, стек драйверов разбивает обработку запросов на несколько последовательных или параллельных этапов, каждый из которых выполняется отдельным модулем. Такая архитектура характерна для современных операционных систем, в первую очередь семейства Windows (модель WDM — Windows Driver Model, а также более новые WDF и KMDF), а также для UNIX-подобных систем (Linux, FreeBSD) и сетевых протоколов.

Архитектура и принцип работы

Стек драйверов строится по принципу клиент-серверной модели, где каждый драйвер является «фильтром» или «обработчиком» для запросов ввода-вывода (I/O). Запрос от приложения или подсистемы ОС передаётся в виде пакета (IRP — I/O Request Packet в Windows, или struct bio/struct sk_buff в Linux) через цепочку драйверов. Каждый драйвер в стеке может модифицировать, перенаправлять, блокировать или завершать запрос, а также создавать новые запросы для нижележащих уровней.

Основные уровни стека (на примере Windows)

  1. Драйверы верхнего уровня (функциональные драйверы). Отвечают за реализацию логики работы устройства, обработку команд от подсистем ОС (например, файловой системы, сетевого стека, диспетчера ввода-вывода). Они взаимодействуют с драйверами нижнего уровня через стандартные интерфейсы.
  2. Драйверы-фильтры. Располагаются между функциональными драйверами и аппаратным обеспечением. Могут выполнять мониторинг, шифрование, сжатие данных, кэширование, проверку безопасности. В Windows существуют фильтры для файловых систем (например, антивирусные фильтры), для шин (USB, PCI) и для устройств ввода.
  3. Драйверы шины (bus drivers). Отвечают за обнаружение устройств, подключённых к конкретной шине (PCI, USB, SCSI, ATA), управление питанием и перечисление устройств. Они являются самыми нижними в стеке, непосредственно взаимодействуя с контроллером шины.
  4. Драйверы минипорта (miniport drivers). В некоторых моделях (например, для сетевых карт или SCSI-адаптеров) используются облегчённые драйверы, которые работают в паре с порт-драйвером (port driver), предоставляющим общие функции для класса устройств.

Стек в Linux

В Linux стек драйверов реализован через модули ядра, которые могут быть динамически загружены и выгружены. Для каждого класса устройств существует своя подсистема: например, для блочных устройств — стек с драйверами дисков, RAID-контроллеров, файловых систем; для сетевых устройств — стек с драйверами сетевых карт, протокольными модулями (TCP/IP, UDP) и сетевыми фильтрами (netfilter). Взаимодействие между драйверами осуществляется через вызовы функций ядра и очереди запросов.

История и развитие

Концепция стека драйверов возникла в 1980-х годах с развитием многозадачных операционных систем. Ранние ОС (MS-DOS, ранние версии Unix) использовали монолитные драйверы, которые напрямую управляли аппаратурой. С появлением Windows NT (1993) и её модели WDM была введена строгая иерархия драйверов, что повысило стабильность и безопасность системы. В Linux стек драйверов формировался постепенно, начиная с ядра версии 2.4 (2001), когда была введена унифицированная модель драйверов (Linux Device Model). В 2000-х годах Microsoft представила WDF (Windows Driver Foundation) — упрощённую модель для разработки драйверов, которая также поддерживает стеки.

Классификация стеков драйверов

Стеки драйверов классифицируются по типу обслуживаемых устройств и подсистем:

  • Стек драйверов блочных устройств — управляет дисками, SSD, RAID-массивами, оптическими накопителями. Включает драйверы файловых систем (NTFS, ext4), драйверы дисков, драйверы шин (ATA, SATA, SCSI).
  • Стек драйверов сетевых устройств — обеспечивает работу сетевых интерфейсов, протоколов (TCP/IP, UDP, ICMP), фильтрацию трафика (брандмауэры, NAT). В Windows включает драйверы NDIS (Network Driver Interface Specification), в Linux — подсистему netdev.
  • Стек драйверов устройств ввода — обрабатывает сигналы от клавиатуры, мыши, тачпада, сенсорных экранов. В Windows — драйверы HID (Human Interface Device), в Linux — подсистема input.
  • Стек драйверов графических устройств — управляет видеокартами, дисплеями, графическими API (DirectX, Vulkan, OpenGL). Включает драйверы ядра (например, DRM/KMS в Linux) и пользовательские драйверы.
  • Стек драйверов звуковых устройств — обеспечивает воспроизведение и запись аудио, работу с кодеками. В Windows — драйверы WDM Audio, в Linux — ALSA (Advanced Linux Sound Architecture).
  • Стек драйверов USB — управляет контроллерами USB, хабами и устройствами (клавиатуры, флешки, принтеры). Включает драйверы хост-контроллера (EHCI, xHCI), драйверы классов (HID, mass storage).

Применение и значение

Стеки драйверов используются во всех современных операционных системах общего назначения, а также во встраиваемых системах (Android, VxWorks, QNX). Основные преимущества:

  • Модульность. Разработчики могут создавать драйверы для отдельных уровней, не затрагивая остальные. Например, антивирусный фильтр может быть реализован как драйвер-фильтр файловой системы, не требуя изменений в драйвере диска.
  • Переносимость. Одна и та же архитектура стека позволяет поддерживать различные аппаратные реализации (например, разные модели сетевых карт) через единый интерфейс.
  • Безопасность. Изоляция уровней предотвращает прямое воздействие драйвера на ядро ОС. В Windows драйверы могут выполняться в режиме ядра или пользовательском режиме (UMDF).
  • Управляемость. Система может динамически загружать и выгружать драйверы, переключать их порядок, добавлять фильтры без перезагрузки.

Примеры стеков драйверов

Стек драйверов USB в Windows

  1. Драйвер хост-контроллера (USB Host Controller Driver) — управляет регистрами контроллера USB (UHCI, OHCI, EHCI, xHCI).
  2. Драйвер хаба (USB Hub Driver) — обрабатывает подключение/отключение устройств, управление питанием портов.
  3. Драйвер класса (USB Class Driver) — реализует протокол для конкретного типа устройств (HID, mass storage, audio).
  4. Драйвер-фильтр (USB Filter Driver) — может выполнять дополнительные функции, например, шифрование данных или мониторинг.

Стек драйверов сетевой карты в Linux

  1. Драйвер сетевого адаптера (netdev driver) — управляет физическим устройством, передаёт/принимает кадры.
  2. Сетевой стек ядра (net/core) — обрабатывает протоколы канального уровня (Ethernet, ARP).
  3. Протокольные модули (TCP/IP, UDP, ICMP) — реализуют транспортный и сетевой уровни.
  4. Сетевые фильтры (netfilter) — позволяют изменять или блокировать пакеты (iptables, nftables).
  5. Сокетный интерфейс (socket API) — предоставляет доступ приложениям.

Критика и ограничения

Стеки драйверов, особенно в Windows, критикуются за сложность и высокие требования к ресурсам. Каждый дополнительный уровень вносит задержку в обработку запросов, что может снижать производительность в реальном времени (например, в аудио- или видеообработке). Кроме того, ошибки в драйверах-фильтрах могут приводить к сбоям всей системы, так как они выполняются в режиме ядра. В Linux и Windows существуют механизмы изоляции (например, пользовательские драйверы в Windows UMDF или модули ядра с ограниченными правами), но они не всегда применимы для высоконагруженных устройств.

Интересные факты

  • В Windows 10 и 11 стек драйверов для графических устройств включает до 10 уровней, включая драйверы DirectX, WDDM (Windows Display Driver Model) и драйверы GPU.
  • В Linux существует проект «ZFS on Linux», который реализует стек драйверов для файловой системы ZFS, включая драйверы для пулов хранения и кэширования.
  • Некоторые вредоносные программы (руткиты) используют технику внедрения в стек драйверов, чтобы скрыть своё присутствие от антивирусных фильтров.

Источники

  • Microsoft Docs. «Windows Driver Model (WDM)». Архитектура драйверов Windows.
  • Linux Kernel Documentation. «Linux Device Model». Официальная документация ядра Linux.
  • Таненбаум Э., Бос Х. «Современные операционные системы». 4-е издание, 2015.
  • Руссинович М., Соломон Д., Ионеску А. «Внутреннее устройство Microsoft Windows». 7-е издание, 2017.
  • Corbet J., Rubini A., Kroah-Hartman G. «Linux Device Drivers». 3-е издание, 2005.

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →