Взаимодействие процессов (IPC). Синхронизация в Windows. Применение спин-блокировок

Управление процессами и потоками. Внутреннее устройство процессов. Создание процессов. Внутреннее устройство процессов. Структуры данных. Внутреннее устройство потоков. Основные блоки описания потоков в ОС Windows.

Объект «процесс», как и другие объекты, содержит заголовок, создаваемый и инициализируемый диспетчером объектов. В заголовке хранятся атрибуты объекта такие как идентификатор процесса, маркер доступа, базовый приоритет.

Тело объекта «процесс» состоит из атрибутов, которые определяет диспетчер объектов. В соответствии с атрибутами, определяются сервисы, которые можно использовать для объекта «процесс». Объект «поток» тоже описывается структурой, имеющей заголовок и сервисы, которые с объектом можно использовать.

Внутреннее устройство процессов.

Весь вычислительный процесс вычислительной системы состоит из набора процессов. Процесс – некоторая абстракция, у которой есть текущее состояние счетчика команд, показывающее, по какому адресу должна выполняться следующая команда, состояние регистров и переменных. У процесса существует также некоторая управляющая информация, позволяющая использовать ее для загрузки и выполнения образа или контекста процесса.

Создание процессовСобытия, приводящие к созданию процессов:

1) инициализация системы

2) выполнение системного запроса на создание процесса

3) запрос пользовательского приложения на создание процесса

4) инициирование пакетного задания.

Как правило, при загрузке ОС создается несколько процессов сразу. Одни из созданных процессов являются высокоприоритетными, другие фоновыми. В некоторых ОС фоновые процессы называются демонами. Процессы, как правило, создаются и завершаются в ходе вычислительного процесса.

Каждый процесс имеет свое состояние.

1) выполнение (running);

2) готовность к выполнению (ready);

3) заблокирован, ожидает завершения какого-либо события.

Завершение процессовКаждый процесс может завершиться, как правило в следующих случаях:

1) штатный выход – после завершения процесс сообщает ОС, что закончил работу Windows API ExitProcess();

2) Преднамеренная или непреднамеренная ошибка, например, попытка запуска процесса, образа которого нет по указанному пути к файлу;

3) аварийное завершение – как правило, в серьезных ОС указываются каталожные номера ошибок причин возникновения ошибок;

4) выполнение недействительной операции, например, деление на ноль или обращение к недействительному адресу. (Недействительная операция – когда нет команды в системе команд процессора, она не может быть распознана и выполнена.)

5) завершение процесса другим процессом – например TerminateProcess().

Каждый процесс в Windows представлен блоком процесса, создаваемого исполнительной системой, который называется EProcess. В этом блоке содержатся указателя на некоторые другие структуры данных. Так, у каждого процесса есть один или более обязательных потоков, которые представлены также блоками описания EThread. Для каждого процесса, выполняющегося в Windows, процесс CSRSS.exe поддерживает в дополнение к блоку EProcess другие параллельные структуры данных, необходимые для подготовки процесса на выполнение.

Содержимое блока EProcess следующее:

1) блок процесса ядра (KProcess) является указателем на список блоков потока ядра KThread, принадлежащих процессу;

2) идентификатор процесса – уникальный идентификатор для данного образа процесса;

3) блок Cloud – ограничение на использование виртуальной памяти – наборы структур данных, которые существуют в процессе для описания частей виртуального пространства;

4) информация о виртуальной памяти – текущий и максимальный размер виртуальной памяти, а также информация о использовании страничного файла, а также каталога страниц процесса и т.д.

5) LPC порт исключений – служит для канала межпроцессной связи;

6) маркер доступа – объект, описывающий профиль защиты данного процесса;

7) таблица описателей (адрес таблицы описателей, принадлежащий процессу);

8) блок переменных окружения процесса – содержит информацию об образе исполняемого файла и информацию о динамически выделяемой памяти – куче процесса;

9) блок процесса подсистемы Windows – содержит информацию о процессе для той части подсистемы Windows, которая работает в ходе выполнения процесса в режиме ядра.

В общем случае процесс Windows включает компоненты:

1) закрытое виртуальное адресное пространство – диапазон адресов виртуальной памяти, которыми может пользоваться процесс;

2) исполняемую программу – начальный код и данные, которые проецируются на виртуальное адресное пространство процесса;

3) список открытых описателей различных системных ресурсов – семафоров, коммуникационных портов и других объектов;

4) контекст защиты – маркер доступа, идентифицирующий пользователя и группы безопасности, сопоставляемые с процессом;

5) минимум один поток;

6) идентификатор.

Порядок создания процесса на основе функции CreateProcess. Создание процесса осуществляется в Windows вызовом таких функций, как CreateProcess, CreateProcessUser и т.д. и проходит в течение нескольких этапов с использованием следующих компонент ОС: kernel32.dll, исполнительной системы и процесса подсистемы окружения Windows. Поскольку Windows теоретически включает несколько подсистем окружения, поэтому CreateProcess в зависимости от подсистемы окружения выполняется по-разному.

Укрупненно порядок создания процесса следующий:

1) открывается файл образа процесса (.exe), который будет выполняться в процессе;

2) исполнительная система ОС создает объект «процесс»;

3) создается так называемый первичный поток, который будет выполняться в процессе, включающий контекст – код и данные, стек и описатель объекта «поток»

4) подсистема Windows уведомляется о создании нового процесса с потоком в нем;

5) Windows начинает осуществлять выполнение потока;

6) инициализируется адресное пространство виртуальной ОП, туда загружаются необходимые компоненты для выполнения процесса;

7) сообщение планировщику процессов Windows о готовности процесса к

выполнению.

Прежде, чем открыть образ для выполнения, ОС выполняет следующие

действия:

1) задается класс приоритета процесса;

2) формируется необходимая информация для взаимодействия с компонентой графического интерфейса. В дальнейшем процесс запускается тогда, когда в зависимости от приоритета до него дойдет очередь.

Внутреннее устройство потоков

Потоки называются упрощенными процессами и обеспечивают много поточность.

Основные блоки описания потоков в ОС Windows.

На уровне исполнительной системы поток представляется блоком потока, который называется EThread. Все структуры данных, на которые ссылается этот блок, существуют в системном адресном пространстве.

Временные показателя потока:

1) время создания и завершения потока;

2) идентификационные данные потока – идентификатор процесса и указатель на EProcess.

3) стартовый адрес потока – адрес в реальной ОП;

4) информация безопасности: маркер доступа и ссылка на соответствующую структуру;

5) элемент механизма LPC – идентификатор и адрес сообщения, ожидаемого потоком;

6) информация, связанная с вводом-выводом: указатель на адрес структуры, описывающей список необработанных запросов на ввод-вывод.

Существует еще блок потока ядра. Ключевые поля блока KThread (Kernel Thread) следующие:

1) заголовок объекта диспетчера – тот заголовок, который дал потоку диспетчер;

2) время выполнения – суммарное время выполнения в режиме ядра и пользовательском режиме;

3) указатель на верхнюю и нижнюю часть стека потока ядра;

4) указатель на таблицу системных сервисов;

5) базовые текущие приоритеты потока;

6) значения кванта времени, выделяемого потоку;

7) маска привязки к выполнению на том или ином процессоре;

8) блоки ожидания – указатель на события, которые ожидаются;

9) информация об ожидании: причина ожидания и время, когда поток перешел в ожидание;

10) блок таймера – встроенный блок таймера потока.

иВзаимодействие процессов (IPC)

При взаимодействии процессов необходимо решать следующие задачи:

1) распределение ресурсов между процессами;

2) согласование действий над ресурсами;

3) передача информации от одного процесса к другому.

Передача информации для взаимодействия потоков та же, но третий пункт решается проще, т.к. потоки одного процесса находятся в общем адресном пространстве.

Синхронизация в Windows

Концепция взаимоисключения является одной из ключевых при разработке Windows. Идея: в каждый момент времени к конкретному ресурсу может обращаться один и только один поток.

Взаимоисключение предназначено для разделения обращения к ресурсам, если это может привести к непредсказуемым последствиям.

Разделы кода, обращающиеся к ресурсам, которые не являются разделяемыми, называются критической секцией. В критической секции может выполняться только один поток (доступ других потоков при выполнении одного запрещен).

В Windows поддержка механизмов, с помощью которых можно предотвратить одновременное изменение двумя потоками одной и той же структуры, возлагается на ядро. Ядро предоставляет специальные примитивы синхронизации (взаимоисключения), которые используются исполнительной системой и другими участниками вычислительного процесса при доступе к глобальным данным. Таким образом, критическими секциями ядра ОС являются те, которые модифицируют глобальные структуры данных ядра, например, базы данных диспетчера ядра или очередь DPC. Ввиду того. Что осуществляется многопоточность, гарантия должна быть 100%, что взаимные исключения доступа потоков к этим структурам исключена.

Считается, что наибольшая проблема в момент обработки прерываний. При обработке информации из глобальных структур данных может возникнуть прерывание, которое, в свою очередь, тоже изменит эту структуру, т.е. сложность возрастает лавинообразно.

Чтобы исключить эту ситуацию, один из механизмов, реализованный в ОС Windows – увеличение приоритета того или иного потока до максимального, чтобы невозможно было его прервать. Недостаток этой структуры: работает только в однопроцессорных системах. В противном случае на другом процессоре возможна своя система приоритетов.

Спин-блокировки

Для многопроцессорных систем применяется механизм взаимоисключения, который называется spin-lock. Спин-блокировка – блокирующий примитив, сопоставленный с какой- то структурой данных. Спин-блокировки с очередями Ядро предоставляет доступ к другим компонентам системы через набор функций ядра KeReleaseSpinLock и KeAcquireApinLock. Например, драйвер устройства требует спин-блокировки, чтобы система гарантировала единовременный доступ к устройствам и другим глобальным данным со стороны только определенной части драйвера. В некоторых ситуациях в Windows вместо стандартной спин- блокировки применяется особый тип: спин-блокировка с очередью QueuedSpinLock. В основном она эффективна в многопроцессорных системах, но может использоваться и в однопроцессорных. Работа происходит следующим образом. Процессор, пытаясь установить такую спин-блокировку, ставит свой идентификатор в очередь, сопоставленный с этой спин-блокировкой. Освободив спин-блокировку очередную, удерживающий процессор передает блокировку тому процессору, чей идентификатор стоит в очереди первым. Windows определяет ряд спин-блокировок с очередями, которые имеют значения глобальных. На глобальные спин-блокировки существуют ссылки, которые имеет каждый процессор. Глобальную спин-блокировку можно вызвать (получить) с помощью API KeAcquireQueuedSpinLock.

Внутристековые спин-блокировки с очередями

Помимо статических спин-блокировок ОС Windows поддерживает еще и динамические спин-блокировки с очередями. Для их реализации используется API KeAcquireInStackQueuedSpinLock и KeReleaseInStackQueuedSpinLock. Эти API используют описатель очереди спин-блокировок, который является некоторой структурой данных, для синхронизации.

Спин-блокировка применяется в основном только в следующих случаях:

1) непродолжительное обращение к защищенным ресурсам без сложного взаимодействия с другими компонентами (кодом);

2) если код критической секции не вызывает внешние процедуры (системные сервисы) или не генерирует прерывания.

89. Управление памятью. Назначение, основные функции и компоненты диспетчера памяти. Сервисы диспетчера памяти. Плоская модель памяти FLAT. Понятие «гранулярность», «куча». Типы «куч». Диспетчер «куч». Синхронизация доступа к «кучи». AWE: назначение и принципы функционирования. Системные пулы памяти. Структура системного и пользовательского виртуального адресного пространства. Таблицы страниц. Каталоги страниц. Трансляция адресов. Аппаратная поддержка быстрой трансляции адресов. Обработка ошибок страниц.

Управление памятью

Все алгоритмы управления памятью разделяются на типы:

1) без привлечения внешней памяти:

а) с фиксированными разделами;

б) с динамическими разделами;

2) с привлечением внешней памяти.

Основной компонентой ОС Windows, которая управляет реальной ОП, является диспетчер памяти. Он решает задачи:

1) трансляция виртуального адресного пространства процесса (физически резидентное подмножество ВАП процесса называется рабочим набором);

2) подкачка, вытеснение – когда процесс пытается задействовать больший объем реальной ОП, чем есть в наличии. Диспетчер памяти предоставляет базовый набор сервисов, который позволяет выполнять эти функции.

Основные компоненты диспетчера памяти.

Диспетчер памяти является частью исполнительной системы Windows и содержится в файле ntoskernel.exe. Включает следующие компоненты:

1) набор сервисов исполнительной системы – большинство доступно через Windows API;

2) обработчики ловушек – трансляции отсутствия страниц, нарушений доступа, загрузки страниц в реальную ОП;

3) группа ключевых компонентов, которые работают как системные потоки в режиме ядра:

а) диспетчер рабочих наборов (Working set manager) с приоритетом 16 – реализует правила управления памятью;

б) поток загрузки и выгрузки стеков (приоритет 23) – выгружает и загружает стеки процесса и потока;

в) подсистема записи модифицированных страниц (приоритет 17) – записывает измененные страницы в область страничного обмена;

г) подсистема записи спроецированных страниц (приоритет 17)

Сервисы диспетчера памяти

Диспетчер памяти предоставляет набор сервисов для выделения виртуальной памяти, ее разделения между процессами, обеспечения функции проецирования файлов в память (для обращения к файлу не через компоненту ввода-вывода, а через реальную память), очистки виртуальных страниц и др.

При функционировании сервисы диспетчера памяти требуют описатель того процесса, с виртуальной памятью которого будет выполняться сервис. Замечание: таким образом, если диспетчеру подставить описатель другого процесса, то он будет работать с другим процессом, т.е. один процесс может повлиять на память другого, если с позиций системы безопасности это допустимо.

Большинство сервисов предоставляется через Windows API. Весь API делится на три группы:

1) управление со страницами виртуальной памяти;

2) управление проецированием файлов в реальной ОП;

3) управление так называемыми «кучами».

С точки зрения реальной ОП диспетчер памяти поддерживает также сервисы:

1) выделение и освобождение РОП;

2) блокировка страниц в РОП;

3) передача страниц РОП системе и обратно;

4) использование РОП для реализации механизма DMA (передача данных с внешнего устройства в реальную ОП без участия процессора).

Весь API имеет префикс «Mm». Некоторые API, связанные с управлением памятью и реализацией сервисов, имеют префикс «Ex».

Модель памяти используется плоская (flat). Заключается в том, что пользователь видит, что она непрерывна.

Диспетчер куч

Многие приложения получают память достаточно большими блоками (64 КБ – минимум). Выделение такого большого пространства в случае маленького модуля неэффективно. Для устранения этой проблемы (см. ОС MVT) управлением памятью внутри раздела используется компонент Windows «Диспетчер куч», который называется «heap manager». Диспетчер куч управляет распределением памяти внутри больших областей, выделенных приложению. Управление осуществляется на основе гранулярности. Гранулярность – 8 байт в 32-разрядных системах и 16 байт – в 64-разрядных (см. ОС MVT, понятие подпул).

Диспетчер куч обеспечивает максимальное использование памяти и производительность при выделении и использовании этих участков. Функции диспетчера куч реализованы в двух местах: ntoskernel.exe и ntdll.dll. При реализации диспетчера куч Windows API вызывается из ntdll, а все остальное, т.е. компоненты исполнительной системы и драйвера – из ntoskernel.

К наиболее часто используемым функциям куч относятся:

1) создание и удаление кучи;

2) выделение блока внутри кучи (HeapAlloc);

3) освобождение ранее выделенного блока в куче (HeapFree).

У каждого процесса имеется одна куча, выделяемая по умолчанию (DefaultProcessHeap), она создается при создании процесса. Размер 1 МБ.

Начальный размер может быть увеличен.

Приложение запрашивает память из кучи процесса с помощью Windows API. Процесс может создавать другие кучи. Когда куча не нужна, занимаемое в ней виртуальное адресное пространство освобождается, т.е. в процессе поддерживается массив куч.

Address Window Extensions

Чтобы 32-разрядный процесс мог получить доступ к большому объему реальной ОП, поддерживается механизм AWE.

Реализация механизма осуществляется в три этапа:

1) выделение реальной памяти;

2) создание так называемого региона ВАП – окна, на который будут проецироваться представление реальной памяти;

3) проецирование на окно представления реальной памяти. Если приложение создает в ВАП окно размером, например, 256 МБ и выделяет 4 ГБ реальной ОП, то оно получает доступ к любой части реальной ОП, проецируя ее на это окно. Размер реальной памяти, доступной приложению при такой схеме в целом определяется размером окна в ВАП

Реальная память, относящаяся к режиму ядра тоже учитывается специальным образом. Для этого создается два типа динамических областей памяти, используемых компонентами ядра (пулов памяти):

1) пул неподкачиваемой памяти – состоит из диапазона виртуальных адресов, который всегда присутствует в реальной ОП и доступный в любой момент без генерации ошибок по отсутствию страниц (см. организацию виртуальной памяти в ОС MVT фирмы IBM);

2) пул подкачиваемой памяти.

Оба пула находятся в системном адресном пространстве и проецируются на ВАП любого процесса. Замечание: в многопроцессорных системах создается пять пулов. Настройка размеров пулов осуществляется через раздел реестра. Значения размеров пулов хранятся как переменные ядра, которые можно менять, учитывая значения счетчиков производительности ОС.

Структура виртуального адресного пространства На ВАП Windows проецируется три основных вида данных:

1) код и данные, принадлежащие процессу,

2) код и данные, принадлежащие сеансу;

3) общесистемный код и данные.

Потоки внутри процесса никогда не получают доступа вне адресного пространства своего процесса, если только не используют разделяемую память («разделы» общей памяти) или функции, которые позволяют обращаться к пространству другого процесса. Сведения о ВАП процесса хранятся в таблице страниц. Таблицы страниц размещаются в ВАП только там, где они доступны только в режиме ядра, поэтому потоки процесса не могут модифицировать структура ВАП своего процесса. Сеанс состоит из процессов и других системных объектов, которые предоставляют сеанс какого-то другого пользователя, зарегистрированного в системе. Структуры данных сеанса проецируются в область системного пространства, которое называется пространством сеанса. Системное пространство содержит код и данные ОС, видимые каждому процессу.

Системное пространство внутри ВАП процесса состоит из компонент:

1) системный код – содержит код некоторых частей ОС, HAL и драйвера устройств, используемых для загрузки системы;

2) область, куда проецируются некоторые системные компоненты, например, Win32K.sys (загружаемая часть подсистемы Windows в режиме ядра, используемые ей графические драйверы режима ядра);

3) гиперпространство – особая область, применяемая для проецирования списка страниц рабочего набора процесса и других страниц для выполнения таких коопераций как обнуление свободных страниц, подготовка адресного пространства и др.;

4) список системного рабочего набора – структуры данных, описывающие системный набор;

5) системный кэш – ВАП, применяемое для файлов, открытых в системном кэше;

6) пул подкачиваемой памяти – системная куча подкачиваемой памяти;

7) элементы системной таблицы страниц, используемых для получения в реальной ОП страниц, относящихся к вводу-выводу, управлению памятью и т.д.;

8) пул неподкачиваемой памяти;

9) данные аварийного дампа – область, зарезервированная для хранения данных на момент аварийного завершения системы.

10) область, используемая HAL.

Структура пользовательского адресного пространства

По умолчанию каждый пользовательский процесс в 32-разрядной Windows обладает собственным ВАП: 4 ГБ разделенного 2x2 или 1x3.

Системные таблицы страниц

Системные таблицы страниц (Page Table Entries) используются для проектирования системных страниц (пространства ввода-вывода, стека ядра и списков дескрипторов). Число системных страниц показывает счетчиком Memory во вкладке производительность. Можно посмотреть количество свободных фреймов страниц. При загрузке Windows подсчитывает, сколько системных страниц надо создать исходя из объема доступной памяти. Это число можно изменить по параметру раздела реестра.

Каталог страниц

У каждого процесса есть один каталог страниц, который представляет собой страницу, на которой находятся адреса всех таблиц страниц для данного процесса в ВАП. Адрес каталога страниц находится в блоке KProcess В x86 системах страница каталога страниц помещается в регистр CR3.

Трансляция адресов

Трансляция – увязывание адресов ВАП с адресами реальной ОП.

Трансляция на платформе x86

Каждый виртуальный адрес сопоставлен со структурой, находящейся в системном пространстве, содержащем адрес страницы в реальной ОП. По умолчанию в ОС Windows для трансляции виртуальных адресов в физические используется двухуровневая таблица страниц. Замечание: может быть и трехуровневая. 32-разрядный виртуальный адрес поэтому интерпретируется как совокупность следующих элементов:

1) индекс каталога страниц;

2) индекс таблицы страниц;

3) индекс байта.

Размеры страницы и описатель определяют каталоги страниц и поля индекса таблицы страниц. Индекс каталога страниц применяется для поиска таблицы страниц, содержащей дескриптор страницы для данного виртуального адреса. С помощью индекса таблицы страниц осуществляется поиск дескриптора, в котором находится адрес реальной ОП страницы. Индекс байта позволяет найти конкретный байт на конкретной странице ОП. При трансляции виртуального адреса выполняются следующие операции:

1) аппаратные средства находят каталог страниц текущего процесса. Замечание: аппаратные средства при каждом переключении процесса получают адрес каталога текущего процесса, как правило, в определенном регистре.

2) индекс каталога страниц используется как указатель для поиска элемента каталога, который определяет местоположение самой таблицы страниц, нужной для трансляции виртуального адреса.

3) индекс таблицы страниц используется как указатель для поиска дескриптора, который определяет местоположение страницы в реальной ОП.

Обработка ошибок страниц

При ссылке на страницу, которой нет в реальной ОП возникает прерывание по отсутствию страницы. Выполняется обработка этого прерывания. Обработчик ловушки ядра перенаправляет ее диспетчеру памяти. Диспетчер памяти пытается обработать отсутствие страницы

90. Управление вводом-выводом. Компоненты подсистемы ввода-вывода. Назначение и основные функции диспетчера ввода-вывода. Типовая обработка операции ввода вывода. Тиы драйверов устройств. Структура драйвера в ОС Windows. WDM драйверы. Многоуровневые драйверы. Объект драйвер. Обработка ввода вывода синхронного и асинхронного ввода вывода, в проецируемый файл. Ввод- вывод по механизму Scutter/gather. Понятие IRP. Управление буфером. Выполнение запроса к одноуровневу и мноуровневому драйверу. Диспетчер спецификации PNP. Установка драйверов.

1. Управление вводом-выводом.

ОС должна передавать устройствам команды, перехватывать прерывания и обрабатывать ошибки; она также должна обеспечивать интерфейс между устройствами и остальной частью системы. ОС обычно имеет дело не с устройством, а с контроллером.

2. Компоненты подсистемы ввода-вывода. Назначение и основные функции диспетчера ввода-вывода. Типовая обработка операции ввода-вывода. Понятие IRP.

Диспетчер ввода-вывода (I/O manager) определяет модель доставки запросов на ввод-вывод драйверам устройств. Большинство запросов ввода-вывода представляется пакетами запросов ввода-вывода (I/O request packets, IRP), передаваемых от одного компонента подсистемы ввода-вывода другому.

Диспетчер ввода-вывода создает IRP (представляющий операцию ввода-вывода), передает указатель на IRP соответствующему драйверу и удаляет пакет по завершении операции ввода-вывода. Драйвер, получивший IRP, выполняет указанную в пакете операцию и возвращает IRP диспетчеру ввода-вывода, чтобы тот либо завершил эту операцию, либо передал пакет другому драйверу.

Диспетчер ввода-вывода также предоставляет гибкие сервисы ввода-вывода. Унифицированный модульный интерфейс драйверов позволяет диспетчеру ввода-вывода вызывать любой драйвер, ничего не зная о его структуре и внутреннем устройстве. Кроме обычных функций для открытия, закрытия, чтения и записи подсистема ввода-вывода Windows предоставляет ряд дополнительных функций, например для асинхронного, прямого и буферизованного ввода-вывода.

3. Типы драйверов устройств.

  • Драйверы виртуальных устройств (virtual device drivers, VDD). Используются для эмуляции 16-разрядных программ MS-DOS.
  • Драйверы принтеров.
  • Драйверы файловой системы.
  • PnP-драйверы.
  • Драйверы, не отвечающие спецификации Plug and Play. Расширяют функциональность системы, предоставляя доступ из пользовательского режима к сервисам и драйверам режима ядра.

4. Структура драйвера в ОС Windows. WDM драйверы. Многоуровневые драйверы.

Это драйверы устройств, отвечающие спецификации Windows Driver Model (WDM). WDM требует от драйверов поддержки управления электропитанием, Plug and Play и WMI. Большинство драйверов Plug and Play построены как раз на модели WDM. Существует три типа WDM-драйверов.

- Драйверы шин.

- Функциональные драйверы. Управляют конкретным типом устройств.

- Драйверы фильтров, они дополняют функциональность или изменяют поведение устройства либо другого драйвера.

Поддержка индивидуального устройства часто распределяется между несколькими драйверами, каждый из которых обеспечивает часть функциональности, необходимой для нормальной работы устройства. Кроме WDM-драйверов шин, функциональных драйверов и драйверов фильтров, оборудование могут поддерживать и следующие компоненты.

- Драйверы классов устройств (class drivers) Реализуют обработку ввода-вывода для конкретного класса устройств, например дисковых устройств

- Порт-драйверы (port drivers) Обрабатывают запросы на ввод-вывод, специфичные для определенного типа порта ввода-вывода.

- Минипорт-драйверы (miniport drivers) Преобразуют универсальные запросы ввода-вывода к порту конкретного типа в запросы, специфичные для адаптера конкретного типа, например для SCSI-адаптера.

5. Объект драйвера.

Объект драйвера представляет драйвер в целом как некую абстракцию. Для объекта драйвера абсолютно все равно, каким оборудованием он управляет, объект драйвера об этом по-настоящему никогда не задумывается. Его задача - обеспечить интерфейс драйвера с ОС.

6. Обработка ввода-вывода синхронного и асинхронного; ввода-вывода, в проецируемый файл.

Большинство операций ввода-вывода приложений являются синхронными, т. е. приложение ждет, когда устройство выполнит передачу данных и вернет код статуса по завершении операции ввода-вывода. После этого программа продолжает работу и немедленно использует полученные данные.

Асинхронный ввод-вывод позволяет приложению выдать запрос на ввод-вывод и продолжить выполнение, не дожидаясь передачи данных устройством. Этот тип ввода-вывода увеличивает эффективность работы приложения, позволяя заниматься другими задачами, пока выполняется операция ввода-вывода. Для использования асинхронного ввода-вывода необходимо указать при вызове CreateFile флаг FILE_FLAG_OVERLAPPED. Независимо от типа запроса операции ввода-вывода, инициированные драйвером в интересах приложения, выполняются асинхронно, т. е. после выдачи запроса драйвер устройства возвращает управление подсистеме ввода-вывода. A когда она вернет управление приложению, зависит от типа запроса.

Термин «ввод-вывод в проецируемые файлы» относится к возможности интерпретировать файл на диске как часть виртуальной памяти процесса.

7. Scatter/gather.

DMA, или Direct Memory Access – технология прямого доступа к памяти, минуя центральный процессор. Алгоритм scatter/gather DMA следующий:

  • Драйвер операционной системы выделяет и иницилизирует дескрипторы DMA буферов.
  • Драйвер выделяет DMA буферы (участки ОЗУ для DMA трансфера) и записывает необходимую информацию о них в дескрипторы.
  • Устройство по мере возникновения потребности, заполняет DMA буферы, и после того, как заполнен один или несколько буферов инициирует прерывание.
  • Драйвер ОС просматривает все дескрипторы DMA буферов, определяет, какие из них были заполнены контроллером устройства, пересылает данные из буфера далее по стеку устройств и помечает буфер как готовый к DMA трансферу.

8. Управление буфером IRP.

Когда приложение или драйвер устройства неявно создает IRP с помощью системного сервиса NtReadFile, NtWriteFile или NtDeviceIoControlFile (этим сервисам соответствуют Windows-функции ReadFile, WriteFile и DeviceIoControt), диспетчер ввода-вывода определяет, должен ли он участвовать в управлении буферами ввода и вывода вызывающего потока. Диспетчер ввода-вывода поддерживает три вида управления:

- Буферизованный ввод-вывод (buffered I/O) Диспетчер ввода-вывода выделяет в пуле неподкачиваемой памяти буфер, равный по размеру буферу вызывающего потока.

- Прямой ввод-вывод (direct I/O) Создавая IRP, диспетчер ввода-вывода блокирует пользовательский буфер в памяти (делает его неподкачиваемым). Закончив работу с IRP, диспетчер ввода-вывода разблокирует буфер.

- Ввод-вывод без управления (neither I/O) Диспетчер ввода-вывода не участвует в управлении буферами. Ответственность за управление ими возлагается на драйвер устройства.

9. Выполнение запросов при работе многоуровневого драйвера. Диспетчер спецификации PnP. Установка драйверов.

Plug and Play – технология, которая сводит к минимуму усилия по подключению новой аппаратуры. PnP-карты не имеют перемычек конфигурации или особых программ настройки; вместо этого общий для компьютера PnP-диспетчер (отдельная программа либо часть BIOS или ОС) сам находит каждую из них и настраивает на соответствующие адреса, линии IRQ, DMA, области памяти, предотвращая совпадения и конфликты.

Windows содержит драйверы для различных устройств, например принтеров, дисплеев, клавиатур и телевизионных устройств. Драйвером называется программа, необходимая устройству для взаимодействия с компьютером. Во многих случаях устройство начинает работать сразу после его подключения к компьютеру (PnP). Windows может также загрузить программное обеспечение для устройства и сведения о нем.

Драйверы периодически обновляются. Windows может обновлять драйверы автоматически, либо вы можете самостоятельно устанавливать обновленные версии драйверов. Важно убедиться в надежности устанавливаемых обновленных драйверов. Windows уведомляет пользователя, если обнаружены подозрительные или небезопасные драйверы.