- •Введение
- •Подсистема ввода-вывода: общие принципы построения и работы
- •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
Промежуточные драйверы
Промежуточные драйверы могут в произвольном количестве встраиваться в сетевой стек и выполнять любую дополнительную обработку проходящих пакетов, например, шифрацию данных или планирование порядка и времени передачи пакетов.
Промежуточный драйвер предоставляет два интерфейса: интерфейс минипорт-драйвера на верхней границе и интерфейс драйвера протокола на нижней. Таким образом, промежуточный драйвер выглядит как минипорт-драйвер для вышележащих компонентов, и как протокол для нижележащих.
Промежуточный драйвер может соединяться с произвольным количеством нижележащих минипорт-драйверов и вышележащих протоколов. Таким образом, могут быть реализованы варианты соединения 1-на-1, 1-на-N, N-на-1 и N-на-M, где первое число – связи с вышележащими протоколами.
Драйвер 1-на-1 может реализовать систему шифрации, блокировать прием или передачу пакетов по указанным адресам, вести статистику соединения, управлять очередями QoS.
Драйвер 1-на-N может реализовывать систему автоматического резервирования, переключая поток пакетов на тот или иной сетевой адаптер. При этом факт переключения окажется скрытым от вышележащих приложений и не повлияет на их работу. В другом случае, такой драйвер может автоматически выбирать для передачи специфических пакетов (пакетов определенного типа, например, VoIP, или пакетов с определенным адресом) наиболее выгодное подключение.
Драйвер N-на-1 обычно реализует на базе одного реального сетевого адаптера несколько виртуальных адаптеров, доступных вышележащим приложениям. Для каждого такого виртуального адаптера можно настроить собственный стек протоколов при использовании единственного физического соединения с сетью.
Промежуточный драйвер может создать объект-устройство посредством вызова функции NdisMRegisterDevice, указав в качестве одного из ее аргументов имя устройства. Этот объект устройство может быть открыт по имени из программы пользовательского режима и через него можно вести прямое взаимодействие с драйвером фильтра из пользовательского режима, используя системны вызовы ReadFile, WriteFile или DeviceIoControl.
Структура ndis пакета
NDIS драйверы работают с информационными блоками, заключенными в стандартный контейнер – пакет NDIS. Общая структура пакета NDIS показана на рис. .23.
Рис.23. Структура пакета NDIS
Пакет NDIS представлен структурой NDIS_PACKET. Данные пакета хранятся отдельно и могут быть фрагментированы. Пакет NDIS ссылается на свои данные через список экземпляров структуры NDIS_BUFFER, каждая из которых ссылается на область данных в неподкачиваемом пуле.
Отметим некоторые поля в объявлении этих структур.
Структура NDIS_PACKET:
NDIS_PACKET_PRIVATE Private – структура данных, которая содержит указатель на первый и последний буфер в цепочке блоков данных пакета, указатель на пул памяти, из которой распределен данный пакет, флаги, характеризующие текущее состояние пакета и результат последней операции с ним и др. служебную информацию;
UCHAR MacReserved[4*sizeof(PVOID)] – зарезервированная область данных, которую может по своему усмотрению использовать минипорт-драйвер, создавший данный пакет;
UCHAR ProtocolReserved[1] – зарезервированная область данных, которую может по своему усмотрению использовать драйвер протокола, создавший данный пакет, при этом (так как это последнее поле в структуре NDIS_PACKET) фактически выделенный объем зарезервированной области может быть больше 1 байта (необходимый размер зарезервированной памяти, доступной через поле ProtocolReserved, является свойством пула пакетов и указывается при создании пула).
Рассмотрим теперь структуру NDIS_BUFFER. На самом деле NDIS_BUFFER является просто альтернативным именем для структуры MDL, описывающей связь виртуальных адресов с физическими. Отметим некоторые поля этой структуры:
struct MDL *Next – указатель на следующий буфер данных;
PVOID StartVa – базовый виртуальный адрес блока данных, выровненный на размер страницы;
ULONG ByteOffset – смещение от адреса StartVa до фактического начала блока данных;
ULONG ByteCount – размер блока данных;
Информация о физических страницах, сопоставленных с данным блоком памяти в виртуальном адресном пространстве располагается непосредственно за экземпляром структуры MDL, и должна трактоваться как массив ULONG.
Таким образом, блоки данных пакета NDIS можно прямо задействовать в операциях ПДП с сетевыми адаптерами.