Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие 3000377.doc
Скачиваний:
29
Добавлен:
30.04.2022
Размер:
2.52 Mб
Скачать

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 можно указать различные буфера для вывода и ввода данных, на уровне драйвера будет доступен только один системный буфер, который при вызове диспетчерской функции драйвера содержит данные, переданные из программы пользовательского режима, а при завершении обработки запроса – данные, передаваемые из драйвера.