
- •Введение
- •Подсистема ввода-вывода: общие принципы построения и работы
- •1.1. Взаимодействие процессора с внешними устройствами
- •1.2. Прямой доступ к памяти
- •Драйверы
- •Роль драйверов в операционной системе
- •Взаимодействие драйверов с компонентами операционной системы и пользовательскими программами
- •Стек обработки запросов ввода-вывода
- •Основы организации и работы подсистемы ввода-вывода unix
- •2.1. Драйверы в операционных системах семейства unix
- •Стратегическая функция драйвера блочного устройства
- •Функция обработки прерывания
- •Функция опроса устройства
- •Другие функции драйверов
- •Буферизация в символьных драйверах
- •Терминальный драйвер
- •2.2. Потоковая подсистема ввода-вывода в unix
- •Архитектура и принципы работы подсистемы streams
- •Архитектура и работа модулей потока
- •Функция модуля put
- •Функция модуля service
- •Структура сообщения
- •Основы организации и работы подсистемы ввода-вывода windows
- •3.1. Классификаций драйверов Windows
- •Драйверы пользовательского режима
- •Драйверы режима ядра
- •3.2. Объекты подсистемы ввода-вывода
- •Объект файл
- •Объект устройство
- •Объект драйвер
- •Объект пакет запроса ввода-вывода
- •Объект блок стека запросов ввода-вывода
- •3.3. Передача данных между пользовательским адресным пространством и пространством ядра
- •Буферизированный ввод-вывод
- •Прямой ввод-вывод
- •Ввод-вывод под управлением драйвера
- •3.4. Обработка запросов ввода-вывода
- •Прохождение запроса ввода-вывода вниз через стек обработки запросов ввода-вывода
- •Обработка прерывания по завершению ввода-вывода
- •Обратное прохождение запроса ввода-вывода вверх через стек запросов ввода-вывода
- •3.5. Буферизация запросов ввода-вывода
- •Системная очередь запросов
- •Очереди запросов под управлением драйвера
- •3.6. Диспетчер Plug-And-Play, установка и запуск драйверов
- •3.7. Диспетчер электропитания
- •3.8. Среда сетевых драйверов ndis
- •Драйверы среды ndis Минипорт-драйверы сетевых адаптеров
- •Драйверы протоколов
- •Промежуточные драйверы
- •Структура ndis пакета
- •Запросы к сетевым адаптерам
- •3.9. Порты завершения ввода-вывода
- •Заключение
- •Библиографический список
- •Оглавление
- •394026 Воронеж, Московский просп., 14
3.8. Среда сетевых драйверов ndis
Модель драйвера WDM является универсальной и позволяет реализовать драйвер для любого внешнего устройства. Однако платой за универсальность является громоздкость и относительная сложность интерфейса WDM. В этой связи для драйверов типовых устройств, таких как драйверы видео или сетевых адаптеров, Windows предоставляет специализированный интерфейс, скрывающий универсальный интерфейс WDM. Для драйверов сетевых адаптеров такой интерфейс реализует среда NDIS – Network Driver Interface Specification.
Использование среды NDIS не только упрощает разработку драйверов, но и позволяет писать драйверы, независимые от операционной системы. NDIS переопределяет все необходимые функции интерфейса режима ядра операционной системы, например, NdisAllocateMemory можно вызывать вместо функции диспетчера памяти Windows MmAllocateMemory, NdisAllocateSpinLock – вместо KeInitializeSpinLock и т.п. В результате драйвер (по крайней мере, на уровне исходного кода) может быть перенесен в любую операционную систему, поддерживающую NDIS, например, в Linux.
В среде NDIS представлено три типа драйверов: драйверы протоколов, минипорт-драйверы сетевых адаптеров и промежуточные драйверы. Для каждого типа драйверов предусмотрен интерфейс взаимодействия с NDIS. Также существует возможность прямого взаимодействия промежуточных драйверов и драйверов сетевых адаптеров с диспетчером ввода-вывода Windows (а через диспетчер ввода-вывода и с пользовательскими программами) в рамках интерфейса WDM с использованием специально созданного виртуального устройства (но при этом будет потеряна переносимость, т.к. драйвер будет привязан к специфическому интерфейсу Windows).
Архитектура среды NDIS показана на рис. .22.
Рис.22. Архитектура среды NDIS
Драйверы среды ndis Минипорт-драйверы сетевых адаптеров
Минипорт-драйвер сетевого адаптера является обязательным драйвером в сетевом стеке. Он всегда один в стеке и он всегда самый нижний драйвер в стеке.
Минипорт-драйверы управляют сетевыми адаптерами, обеспечивая передачу через них информационных пакетов в физическую среду и прием полученных пакетов из физической среды. NDIS предоставляет минипорт-драйверу функции для доступа к регистрам сетевого адаптера, для обмена данными с использованием метода ПДП, для выделения памяти в подкачиваемом и неподкачиваемом пулах, для синхронизации и т.п. Таким образом, среда NDIS максимально изолирует драйверы даже от особенностей операционной системы, что позволяет делать их полностью переносимыми. В идеале, если среда NDIS будет реализована не в Windows, а в какой-то другой операционной системе, драйвер должен работать.
В свою очередь, среда NDIS обращается к функциям драйвера, чтобы передать пакет данных в сетевой адаптер, запросить или изменить параметры или режим работы адаптера, чтобы обслужить прерывание от сетевого адаптера. Минипорт-драйвер экспортирует функции в NDIS через структуру NDIS_MINIPORT_CHARACTERISTICS, поля которой инициализируются адресами экспортируемых функций.
Минимально необходимо, чтобы минипорт-драйвер инициализировал адресами своих функций следующие поля структуры NDIS_MINIPORT_CHARACTERISTICS:
InitializeHandler – функция инициализации сетевого адаптера;
QueryInformationHandler – функция для запроса параметров, статистики и режима работы сетевого адаптера или параметров физической среды;
SetInformationHandler – функция для установки параметров и режима работы сетевого адаптера;
SendPacketsHandler – функция для передачи пакетов сетевому адаптеру;
ReturnPacketHandler – функция обратного вызова, через которую NDIS уведомляет минипорт-драйвер о том, что ему возвращен контроль над пакетом данных, который драйвер передавал вышележащему протоколу;
HaltHandler – функция остановки (завершения работы) сетевого адаптера;
ISRHandler – обработчик прерываний сетевого адаптера.
Драйвер инициализирует экземпляр структуры NDIS_MINIPORT_CHARACTERISTICS в функции DraiverEntry, после чего вызывает функцию NdisMRegisterMiniport из библиотеки NDIS, передавая в нее указатель на инициализированный экземпляр структуры NDIS_MINIPORT_CHARACTERISTICS.
Минипорт-драйвер может создать объект-устройство посредством вызова функции NdisMRegisterDevice, указав в качестве одного из ее аргументов имя устройства. Этот объект устройство может быть открыт по имени из программы пользовательского режима и через него можно вести прямое взаимодействие с минипорт-драйвером сетевого адаптера из пользовательского режима, используя системны вызовы ReadFile, WriteFile и DeviceIoControl.