Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Подсистема ввода-вывода в операционных системах. принципы организации и работы. Савинков А.Ю.doc
Скачиваний:
57
Добавлен:
30.04.2022
Размер:
3 Мб
Скачать
☆

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.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]