Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
210
Добавлен:
20.02.2016
Размер:
168.96 Кб
Скачать

[3.3] Прерывания и планирование

Сведения об IRQL в Таблице 3 показывают, что уровень Dispatch Level связан с операциями планирования. Когда уровень IRQL соответствует Dispatch Level или выше, NT маскирует программные прерывания планировщика, что означает, что NT отключает планировщик. Фактически, драйверы устройств (и NT) не должны осуществлять операции, требующие немедленного ответа от планировщика, когда процессор находится на уровне IRQL большем или равном Dispatch Level. Это ограничение включает в себя выполнение всего, что может указывать NT, что текущий поток уступает CPU для ожидания осуществления некоторого события, так как эта акция заставит планировщик искать новый поток для исполнения. Другое действие, которое требует вмешательства планировщика, это ошибка отсутствия страницы. Когда поток обращается к виртуальной памяти, ссылающейся на данные в страничном файле, NT обычно блокирует поток до тех пор, пока данные не будут прочитаны. Поэтому на уровне Dispatch Level или выше NT не позволяет доступ к памяти, не заблокированной в физической памяти. Если вы когда либо видели код останова синего экрана IRQL_NOT_LESS_OR_EQUAL, вы вероятно были свидетелем эффекта от нарушения драйвером этих правил.

Отключение планировщика во время обработки прерывания имеет другой, менее очевидный эффект: NT подсчитывает время, затраченное функциями ISR и DPC на фоне величины времени, которое поток был активным к моменту, когда CPU получил прерывание. Например допустим, что Word выполняет операцию проверки правописания, от устройства поступает прерывание, и драйвер устройства имеет DPC, которое отбирает весь квант времени Word’а (а затем еще сколько-то). Когда IRQL процессора упадет ниже уровня Dispatch Level, планировщик может решить переключиться на другой поток другого приложения, чувствительно наказывая Word за обработку прерывания. Хотя такая практика кажется несправедливой, почти каждый раз, когда NT распределяет прерывание, оно равномерно распределяется между прикладными программами в системе.

[3.4] Определение текущего уровня irql

Текущий уровень IRQL свой у каждого CPU. Код режима ядра может определить IRQL, в котором он выполняется, посредством вызова функции KeGetCurrentIrql (), прототип которой показан на Рисунке 6.1.

KIRQL KeGetCurrentIrql ();

Рисунок 6.1. Прототип функции KeGetCurrentIrql().

KeGetCurrentlrql() возвращает IRQL текущего CPU.

Большинство подпрограмм драйвера устройства вызывается Диспетчером в/в на определенном архитектурой уровне IRQL. То есть разработчик драйвера знает уровень (или уровни) IRQL, на котором будет вызываться данная функция. Подпрограммы режима ядра могут изменять IRQL, на котором они выполняются, вызывая функции KeRaiselrql() и KeLowerlrql(), прототипы которых показаны на Рисунках 6.2 и 6.3 соответственно.

VOID KeRaiseIrql (IN PKIRQL Newlrql, OUT PKIRQL Oldlrql);

Newlrql: значение, до которого должен быть поднят уровень IRQL текущего процессора.

Oldlrql: указатель на место, в которое будет помещен IRQL, на котором текущий процессор выполнялся перед тем, как был поднят к Newlrql.

Рисунок 6.2. Прототип функции KeRaiselrqlQ().

VOID KeLowerIrql (IN KIRQL Newlrql),

Newirql:. значение, до которого должен быть понижен IRQL текущего процессора.

Рисунок 6.3. Прототип фунуции KeLowerIrql().

Так как уровни IRQL являются методом синхронизации, большинство подпрограмм режима ядра (в особенности драйверы устройств) никогда не должны понижать свой уровень IRQL ниже того, на котором они вызывались. Таким образом, драйверы могут вызывать KeRaiselrql (), чтобы поднять IRQL до более высокого уровня, и затем вызывать KeLowerlrql(), чтобы возвратиться обратно к первоначальному IRQL, на котором они были вызваны (например, из Диспетчера в/в). Однако, драйвер никогда не должен вызывать функцию KeLowerlrql(), чтобы понизить IRQL до уровня, меньшего чем тот, на котором он был вызван. Такое поведение может привести к крайне непредсказуемой работе операционной системы, которая наверняка закончится полным отказом системы.

Лекция №3. Система приоритетов. Как используются IRQL. Диспетчеризация и планирование 1

[3.1] Система приоритетов 1

[3.1.1] Уровни запросов прерываний (IRQL) 1

[3.1.2] Приоритеты планирования 1

[3.1.2.1] Классы приоритетов планирования 2

[3.1.2.2] Динамические приоритеты и приоритеты реального времени 3

[3.1.2.3] Соотношение базового приоритета с классом приоритета и относительным приоритетом 4

[3.2] Как используются IRQL 5

[3.2.1] IRQL PASSIVE_LEVEL 7

[3.2.2] IRQL APC_LEVEL 7

[3.2.3] IRQL DISPATCH_LEVEL 7

Ограничения, налагаемые на код с уровнем IRQL>=DISPATCH_LEVEL. 8

[3.2.4] DIRQLs 9

[3.3] Прерывания и планирование 10

[3.4] Определение текущего уровня IRQL 11

13

Соседние файлы в папке Лабы по драйверам