- •Введение
- •Подсистема ввода-вывода: общие принципы построения и работы
- •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.3. Передача данных между пользовательским адресным пространством и пространством ядра
Драйверы режима ядра и не могут полагаться на данные в пользовательской области адресного пространства в силу того, что выполняются в контексте неопределенного процесса, а программы пользовательского режима не имеют доступа к системной части адресного пространства, доступной драйверам. В этой связи необходимы специальные системные механизмы для обмена данными между программами пользовательского режима и драйверами.
Передача данных между программами пользовательского режима и драйверами режима ядра реализуется с использованием IRP. На уровне диспетчера ввода-вывода справедливо утверждение: один запрос ввода-вывода – один объект IRP. Именно объект IRP несет ссылку на данные ввода-вывода для всего стека обработки запроса, в то время как блок стека IRP несет информацию только о коде операции.
В операционной системе Windows определено три способа взаимодействия между программами пользовательского режима и драйверами:
буферизированный ввод-вывод
прямой ввод-вывод
ввод-вывод под управлением драйвера (neither I/O)
Рассмотрим эти режимы передачи данных более внимательно.
Буферизированный ввод-вывод
При использовании буферизированного ввода-вывода диспетчер ввода-вывода выделяет область памяти в системной части виртуального адресного пространства – системный буфер. Если запрос пользовательского режима определяет данные для передачи драйверу, диспетчер ввода-вывода копирует в системный буфер данные из пользовательского буфера, адрес и размер которого передается программой пользовательского режима в системный вызов.
При завершении операции ввода-вывода, если необходимо передать данные от драйвера программе пользовательского режима, диспетчер ввода-вывода копирует данные из системного буфера в пользовательский, при этом используется асинхронный вызов процедуры режима ядра (APC режима ядра). Процедура APC регистрируется диспетчером ввода-вывода для потока, инициировавшего запрос ввода-вывода. Использование APC гарантирует автоматическое завершение операции ввода-вывода в контексте процесса, инициировавшего запрос ввода-вывода (т.е. в контексте нужного адресного пространства), как только данный поток будет выбран на исполнение.
Адрес системного буфера доступен драйверам через поле SystemBuffer структуры IRP, а размер блока передаваемых данных указан в соответствующем блоке стека запросов ввода-вывода, в формате, зависимом от типа запроса.
Например, для запроса IRP_MJ_READ размер блока данных, который должен быть записан драйвером в системный буфер для передачи программе пользовательского режима, указан в поле Parameters.Read.Length структуры IO_STACK_LOCATION. Для запроса IRP_MJ_DEVICE_CONTROL, предусматривающего двунаправленную передачу данных, размер блока входных данных, переданных драйверу, указан в поле Parameters.DeviceIoControl.InputBufferLength, а размер блока выходных данных – в поле Parameters.DeviceIoControl.OutputBufferLength структуры IO_STACK_LOCATION. При этом, хотя для запроса IRP_MJ_DEVICE_CONTROL в функции пользовательского режима DeviceIoControl можно указать различные буфера для вывода и ввода данных, на уровне драйвера будет доступен только один системный буфер, который при вызове диспетчерской функции драйвера содержит данные, переданные из программы пользовательского режима, а при завершении обработки запроса – данные, передаваемые из драйвера.