Объекты – прерывания

Введение в обработку прерываний

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

Драйверам устройств необходим способ сообщить NT, что они хотят, чтобы исполнялась определенная функция, когда процессор получает прерывание, относящееся к их устройствам. Для этого драйверы устройств с помощью Диспетчера В/В регистрируют функцию обработки прерывания (ISR) посредством вызова функции IoConnectInterrupt. Параметры, передаваемые в IoConnectInterrupt описывают все свойства ISR драйвера, включая ее адрес, прерывание, к которому подключена ISR и то, могут ли другие устройства совместно использовать это же прерывание.

Функция IoConnectInterrupt инициализирует объект-прерывание (Interrupt Object) для того чтобы хранить информацию о прерывании и подключенной ISR. IoConnectInterrupt программирует также аппаратуру прерываний для того, чтобы указывать код, который IoConnectInterrupt поместила в объект-прерывание. Таким образом, когда CPU получит прерывание, управление немедленно перейдет к коду в объект-прерывание. Этот код вызовет вспомогательную функцию обслуживания прерывания, KiInterruptDispatch, которая повысит уровень IRQL процессора, вызовет соответствующую ISR, и понизит IRQL до предыдущего значения. KiInterruptDispatch также получает спин-блокировку, индивидуальную для прерывания, и удерживает ее, пока выполняется ISR (см. лекцию 11 “Механизмы синхронизации”). Спин-блокировка гарантирует, что ISR не будет одновременно исполняться более чем на одном процессоре (что может привести к печальным последствиям).

В NT, ISR обычно не делает ничего, кроме чтения минимального количества информации из прерывающего устройства и подтверждения устройству того факта, что драйвер “увидел” прерывание. В других операционных системах ISR часто выполняют дополнительные обязанности, такие как полная обработка прерывания путем чтения больших буферов данных из, или записи больших буферов данных в устройство. Однако, одна из задач NT – минимизировать время, проводимое на повышенных уровнях IRQL, поэтому NT откладывает большую часть обслуживания прерывания до момента уменьшения уровня IRQL. Процедуры ISR запрашивают отложенный вызов процедур (DPC) для информирования Диспетчера В/В о том, что у них имеется работа для исполнения на нижнем уровне IRQL. DPC – еще одна функция в драйвере, которую вызовет Диспетчер В/В после завершения ISR; DPC осуществляет почти все взаимодействие с устройством.

Рисунок 1 описывает типичный ход обслуживания прерывания NT. Контроллер устройства генерирует сигнал прерывания на шине процессора, который обрабатывает контроллер прерываний процессора. Этот сигнал служит причиной для CPU для выполнения кода в объекте-прерывание, зарегистрированном для прерывания; этот код, в свою очередь, вызывает вспомогательную функцию KiInterruptDispatch. KiInterruptDispatch вызывает ISR драйвера, которая запрашивает DPC.

Рисунок 1

NT также имеет механизм обработки прерываний, не зарегистрированных драйверами устройств. В процессе инициализации системы NT программирует контроллер прерываний так, чтобы указывать на функции ISR по умолчанию. Функции ISR по умолчанию осуществляют специальную обработку, когда система генерирует ожидаемые прерывания. Например, ISR ошибки отсутствия страницы должна выполнить обработку в ситуации, при которой программа ссылается на виртуальную память, которая не имеет выделенного пространства в физической памяти компьютера. Такая ситуация может возникнуть когда программы взаимодействуют с файловой системой для получения данных из файла подкачки или исполняемого файла, или когда программы ссылаются на недействительный адрес. NT программирует незарегистрированные прерывания так, чтобы они указывали на обработчики ISR, которые распознают, что система сгенерировала неразрешенное прерывание. Почти все эти ISR высвечивают синий экран смерти (BSOD - blue screen of death) для уведомления системного администратора о том, что произошло неразрешенное прерывание.

[13.2] Отложенные вызовы процедур (Deferred Procedure Call – DPC)

Вызовы DPC – «рабочие лошадки» обработки прерываний NT. NT передает DPC тем же образом, что и прерывания – в объектах. Драйверы устройств обычно инициализируют объект DPC в момент подключения к прерыванию. Информация, которую должен указать драйвер, включает адрес его функции DPC, процессор, на котором должна исполняться функция DPC, и приоритет DPC. По умолчанию DPC всегда исполняется на том же процессоре, на котором исполняется ISR, однако, разработчик драйвера устройства может переопределить это присваивание. Кроме того, для функций DPC по умолчанию назначается средний приоритет (при возможных низком, среднем и высоком), однако разработчик драйвера устройства также может контролировать приоритет.

Когда функция ISR запрашивает DPC, NT помещает указанный объект DPC в очереди DPC целевого процессора. Если DPC имеет низкий или средний приоритет, NT помещает объект DPC в конец очереди; если DPC имеет высокий приоритет, NT вставляет объект DPC в начало очереди. Когда уровень IRQL процессора готов понизиться с уровня Dispatch Level к более низкому IRQL (APC Level или Passive Level), NT убирает объект DPC из очереди DPC. NT гарантирует, что IRQL остается на уровне Dispatch Level и вытаскивает объекты DPC из очереди вплоть до ее освобождения (т.е. NT опорожняет очередь), вызывая каждую функцию DPC по очереди. Только когда очередь пуста, NT позволит уровню IRQL понизиться ниже уровня Dispatch Level и позволит продолжить исполнение обычным потокам.

Приоритеты DPC могут оказывать влияние на поведение системы другим способом. NT обычно приступает к опорожнению очереди DPC с программного прерывания, чей уровень IRQL - Dispatch Level. NT генерирует такое прерывание только если DPC направлено на процессор, на котором запрошена функция ISR, и DPC имеет высокий или средний приоритет. Если DPC имеет низкий приоритет, DPC запрашивает прерывание только если число невыполненных запросов DPC для процессора поднимается выше порогового значения, или число DPC, запрошенных на процессоре за интервал времени, мало. Если DPC направлен на CPU, отличный от того, на котором выполняется ISR, и DPC имеет высокий приоритет, NT немедленно сигнализирует целевому CPU очищать его очередь DPC. Если приоритет средний или низкий, число DPC, помещенных в очередь целевого процессора должно превысить пороговое значение. Системный поток idle также освобождает очередь DPC. В таблице 1 перечислены ситуации, инициирующие освобождение очереди DPC.

Таблица 1. Ситуации, инициирующие очистку очереди DPC

Приоритет DPC DPC выполняются на том же процессоре, что и ISR DPC выполняются на другом процессоре
Низкий Размер очереди DPC превышает максимум, частота появления запросов DPC меньше минимальной, или система простаивает Размер очереди DPC превышает максимум или система простаивает (выполняется поток idle)
Средний Всегда Размер очереди DPC превышает максимум или система простаивает (выполняется поток idle)
Высокий Всегда Всегда

На Рисунке 2 изображена типовая последовательность событий. Вначале ISR запрашивает DPC и NT помещает объект DPC в очередь целевого процессора. В зависимости от приоритета DPC и длины очереди DPC, NT генерирует программное прерывание DPC сразу же или спустя некоторое время. Когда процессор очищает очередь DPC, объект DPC покидает очередь и управление передается в его функцию DPC, которая завершает обработку прерывания путем чтения данных из (или записи данных в) устройство, которое сгенерировало прерывание.

Рисунок 2


Лекция №12. Рабочие потоки (Worker Threads и Work Queue)........................................................................................................... 1

[12.1] Необходимость в создании рабочих потоков......................................................................................................................... 1

[12.2] Системные рабочие потоки (System Worker Thread WorkItems)........................................................................................... 1

[12.3] Создание потоков драйвером.................................................................................................................................................. 3

[12.4] Потоки как диспетчерские объекты........................................................................................................................................ 3

[13] Введение в обработку прерываний................................................................................................................................................. 6

[13.1] Объекты – прерывания............................................................................................................................................................. 6

[13.2] Отложенные вызовы процедур (Deferred Procedure Call – DPC).......................................................................................... 7


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: