Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2-52.docx
Скачиваний:
12
Добавлен:
23.09.2019
Размер:
183.92 Кб
Скачать

Суть dpc

При возникновении прерывания, управление передаётся обработчику прерывания. Существует ряд факторов, ограничивающих возможности кода обработчика прерывания:

  • Общей практикой является требование минимизации времени работы обработчика прерывания. Поэтому необходимо воздержаться от выполнения ресурсоёмких и долгих действий непосредственно внутри обработчика прерывания.

  • В Windows код обработчика прерывания выполняется на высоком IRQL, что сильно ограничивает набор доступных обработчику ядерных функций: многие функции требуют гораздо более низкого IRQL для своего вызова.

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

В отличие от обычного вызова процедуры, при котором, фактически, управление сразу же передаётся коду вызываемой процедуры, при DPC-вызове передача управления вызываемой процедуре не происходит — вместо этого адрес вызываемой процедуры и параметры помещаются в специальную очередь[1], называемую DPC Queue. Когда наступает «благоприятное» время, отложенная процедура вызывается по-настоящему.

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

Управление dpc

  • Для того, чтобы осуществлять отложенные вызовы, необходимо сперва создать объект DPC при помощи ядерной функции KeInitializeDpc.

  • Созданному объекту DPC можно изменить приоритет при помощи функци KeSetImportanceDpc, а также переназначить логический процессор, в очередь которого будет помещён отложенный вызов, с помощью KeSetTargetProcessorDpc.

  • Постановка DPC в очередь осуществляется вызовом ядерной функции KeInsertQueueDpc.

  • Помещённый в очередь DPC можно убрать из очереди вызовом функции KeRemoveQueueDpc.

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

Примечания

  1. В многопроцессорных системах каждый процессор имеет свою отдельную очередь отложенных вызовов. Так что каждый отложенный вызов ассоциирован с определённым процессором.

39, Прерывания APC

APC (asynchronous procedure call) позволяет выполнять пользовательские программы и системный код в контексте конкретного пользовательского потока (а значит, и в адресном пространстве конкретного процесса). Посколькудля выполнения в контексте конкретного потока APC ставятся в очередь и выполняются при IRQL ниже «DPC/dispatch», на их работу не налагаются ограничения, свойственные DPC АРС-процедура может обращаться к ресурсам (объектам), ждать освобождения описателей объектов, генерировать ошибки страниц и вызывать системные сервисы.

APC описывается управляющим объектом ядра — ЛРС-объектом. APC, ждущие выполнения, находятся в очереди ЛРС (APC queue), управляемой ядром. Очереди APC — в отличие от общесистемной очереди DPC — специфичны для конкретного потока, так как у каждого потока своя очередь APC При запросе на постановку APC в очередь ядро помещает его (APC) в очередь того потока, который будет выполнять АРС-процедуру. Далее ядро генерирует программное прерывание с уровнем APC, и поток, когда он в конечном счете начинает выполняться, обрабатывает APC

APC бывают двух видов: режима ядра и пользовательского режима. APC режима ядра для выполнения в контексте целевого потока не нужно «разрешение» со стороны этого потока, тогда как для APC пользовательского режима это обязательно. APC режима ядра прерывает поток и выполняет процедуру без вмешательства или согласия потока. APC режима ядра тоже бывают двух типов: обычные (normal) и специальные (special). Поток может отключить все APC режима ядра, повысив IRQL до уровня APC_LEVEL или вызвав KeEnterGuardedRegion, которая впервые появилась в Windows Server 2003. KeEnterGuardedRegion отключает доставку APC, устанавливая поле Spe-cialApcDisable в структуре KTHREAD вызвавшего потока (об этой структуре см. главу 6). Поток также может отключить только обычные APC режима ядра вызовом KeEnterCriticalRegion, которая устанавливает поле KernelApcDisable в структуре KTHREAD потока.

41, В отличие от прерываний, которые могут возникать в любой момент, исключения являются прямым следствием действий выполняемой программы. Windows вводит понятие структурной обработки исключений (structured exception handling, SEH), позволяющей приложениям получать управление при возникновении исключений. При этом приложение может исправить ситуацию, которая привела к исключению, провести раскрутку стека (завершив таким образом выполнение подпрограммы, вызвавшей исключение) или уведомить систему о том, что данное исключение ему не известно, и тогда система продолжит поиск подходящего обработчика для данного исключения.

В системах типа х86 все исключения имеют предопределенные номера прерываний, прямо соответствующие записям в ЮТ, ссылающимся на обработчики ловушек конкретных исключений.

Все исключения, кроме достаточно простых, которые могут быть разрешены обработчиком ловушек, обслуживаются модулем ядра — диспетчером исключений (exception dispatcher). Его задача заключается в поиске обработчика, способного «справиться» сданным исключением. Примерами независимых от архитектуры исключений могут служить нарушения доступа к памяти, целочисленное деление на нуль, переполнение целых чисел, исключения при операциях с плавающей точкой и точки прерывания отладчика.

Исключение

Номер прерывания

0

Divide Error (ошибка деления)

1

DEBUG TRAP (ловушка отладки)

2

NMI/NPX Error (ошибка NMI/NPX)

3

Breakpoint (точка прерывания)

4

Overflow (переполнение)

5

BOUND/Print Screen

6

Invalid Opcode (неправильный код операции)

7

NPX Not Available (NPX недоступен)

8

Double Exception (двойное исключение)

9

NPX Segment Overrun (выход за пределы сегмента NPX)

A

Invalid Task State Segment (TSS) (неправильный TSS)

B

Segment Not Present (сегмент отсутствует)

C

Stack Fault (ошибка стека)

D

General Protection (ошибка общей защиты)

E

Page Fault (ошибка страницы)

F

Зарезервировано Intel

10

Floating Point (ошибка в операции с плавающей точкой)

11

Alignment Check (ошибка контроля выравнивания)

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]