- •Введение
- •Подсистема ввода-вывода: общие принципы построения и работы
- •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
Объект пакет запроса ввода-вывода
Объект пакет запроса ввода-вывода представлен в системе экземпляром структуры IRP. Отметим некоторые поля этой структуры:
PMDL MdlAddress – указатель на список MDL (Memory Descriptor List), описывающий размещение буфера данных в физической памяти;
union { struct _IRP *MasterIrp; LONG IrpCount; PVOID SystemBuffer; } AssociatedIrp – объединение, трактуемое следующим образом: если это ассоциированный запрос ввода-вывода (обсуждается далее) – поле MasterIrp ссылается на главный запрос; если это главный запрос, имеющий ассоциированные запросы – поле IrpCount счетчик незавершенных ассоциированных запросов; если это запрос ввода-вывода использующий метод буферизированного ввода-вывода (обсуждается далее) – поле SystemBuffer адрес буфера данных в системной области памяти;
LIST_ENTRY ThreadListEntry – элемент списка незавершенных запросов ввода-вывода, сопоставленного с потоком, инициировавшим запрос;
IO_STATUS_BLOCK IoStatus – финальный статус операции ввода-вывода, устанавливаемый драйвером для диспетчера ввода-вывода при завершении запроса;
CHAR StackCount – количество уровней обработки при многоуровневой обработке запроса ввода-вывода;
CHAR CurrentLocation – текущий уровень обработки запроса при многоуровневой обработке запроса ввода-вывода;
PDRIVER_CANCEL CancelRoutine – указатель на функцию драйвера, которая должна быть вызвана, если диспетчер ввода-вывода отменит данный запрос до его завершения;
PVOID UserBuffer – адрес буфера данных в пользовательском адресном пространстве;
union { struct { … LIST_ENTRY ListEntry … PIO_STACK_LOCATION CurrentStackLocation … PFILE_OBJECT OriginalFileObject } Overlay … } Tail – поле ListEntry используется для организации очереди запросов, поле CurrentStackLocation ссылается на данные, включая код операции, относящиеся к текущему уровню обработки запроса; поле OriginalFileObject ссылается на объект файл, через который был инициирован запрос.
Объект пакет запроса ввода-вывода содержит наиболее общую информацию о запросе и существует до завершения обработки запроса или до его отмены.
Пока обработка запроса ввода-вывода не завершена, указатель на IRP хранится в списке незавершенных запросов ввода-вывода потока, который инициировал запрос. Для этого в структуре IRP предусмотрено поле ThreadListEntry, а в структуре потока ETHREAD – поле IrpList.
Объект блок стека запросов ввода-вывода
Объект блок стека запросов ввода-вывода служит для реализации возможности обработки одного запроса ввода-вывода более, чем одним драйвером, когда запросы ввода-вывода последовательно проходят через цепочку драйверов, каждый из которых реализует свою часть в общей процедуре обработки. В результате запрос ввода-вывода последовательно преобразуется из высокоуровневого запроса прикладной программы в низкоуровневые команды внешнего устройства.
Например, запрос на чтение данных файла на диске последовательно обрабатывается драйвером файловой системы, драйвером диска, драйвером шины, а еще, возможно, драйверами фильтрами, включенными между ними.
Такую цепочку взаимодействующих драйверов принято называть стеком обработки запросов ввода-вывода.
Для поддержки стека обработки запросов ввода-вывода, с каждым объектом IRP может быть сопоставлен массив блоков стека запросов ввода-вывода, представленных экземплярами структуры IO_STACK_LOCATION. Отметим некоторые поля этой структуры:
UCHAR MajorFunction – номер (код) запроса, определяющий вызываемую функцию драйвера;
UCHAR MinorFunction – дополнительный код запроса, уточняющий основной код, например, основной код IRP_MJ_PNP приведет к вызову диспетчерской функции запросов PnP, уточняющий код IRP_MN_START_DEVICE – команда на запуск устройства от диспетчера PnP;
union Parameters – содержит перекрывающиеся определения структур, описывающих параметры запроса, например, для запроса IRP_MJ_CREATE параметры передаются в структуре Create, для запроса IRP_MJ_DEVICE_CONTROL – в структуре DeviceIoControl и т.д.; определение полей каждой такой структуры различно и зависит от запроса;
PDEVICE_OBJECT DeviceObject – указатель на устройство, к которому адресован запрос;
PFILE_OBJECT FileObject – указатель на файл, через который передан запрос;
PIO_COMPLETION_ROUTINE CompletionRoutine – указатель на функцию, которая будет вызвана при обратном прохождении запроса через стек обработки запроса ввода-вывода; эта функция может быть установлена драйвером на прямом проходе запроса через стек;
Массив блоков стека запроса ввода-вывода располагается в памяти сразу же за IRP, как показано на рис. .17. Таким образом, можно считать, что каждый запрос ввода-вывода определяется совокупностью структур IRP и IO_STACK_LOCATION, где IRP играет роль заголовка запроса.
Рис.17 Запрос ввода-вывода.