Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
vazhnoe.docx
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
843.48 Кб
Скачать

37. Понятие асинхронной процедуры (apc). Назначение асинхронных процедур. Типы асинхронных процедур. Операции с асинхронными процедурами.

1)Как и DPC, применяется для выполнения отложенных действий.

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

3)не подвержена ограничениям DPC-процедур, может захватывать объекты ядра, выполнять ожидания объектов, обращаться к отсутствующим страницам памяти, делать системные вызовы.

APC-процедура представляется стр-рой ядра KAPC, кот. содержит указатели на 3 подпрограммы:

1) RundownRoutine – выполняется, если из-за удаления потока удаляется структура KAPC.

2) KernelRoutine – выполняется на уровне приоритета APC_LEVEL.

3) NormalRoutine – выполняется на уровне приоритета PASSIVE_LEVEL.

Стр-ра KAPC создается и ставится в одну из двух очередей потока: одна очередь предназначена для APC режима ядра, вторая – для APC пользовательского режима. Начала очередей находятся в массиве из двух элементов: KTHREAD.ApcState.ApcListHead[].

Специальная APC-процедура режима ядра:

- KAPC.KernelRoutine выполняется на уровне приоритета APC_LEVEL.

- KAPC.NormalRoutine == NULL.

- Помещается в очередь APC режима ядра после других специальных APC.

- Вызывается перед нормальными APC режима ядра.

- Вызывается, если IRQL == PASSIVE_LEVEL и поток не находится в защищенной секции (guarded region) – KTHREAD.SpecialApcDisable != 0.

- APC не может захватить блокировку, работающую на IRQL == 0.

- используется для завершения процесса, для передачи результатов ввода-вывода в адресное пространство потока.

Нормальная APC-процедура режима ядра:

- KAPC.NormalRoutine выполняется на уровне приоритета PASSIVE_LEVEL.

- Вызывается, если IRQL == PASSIVE_LEVEL, поток не находится в защищенной или критической секции (critical region) – KTHREAD.KernelApcDisable != 0, и не выполняет специальную APC ядра.

- Нормальной APC разрешено делать все системные вызовы.

- Норм.APC исп-тся ОС для завершения обработки запроса от драйвера – Interrupt Request Packet.

APC-процедура пользовательского режима:

- KAPC.NormalRoutine выполняется на уровне приоритета PASSIVE_LEVEL.

- Вызывается, только если поток ожидает объект ядра в alertable-режиме, например WaitForSingleObjectEx(…, true), WaitForMultipleObjectsEx(…, true), SleepEx(…, true).

- Создается вызовом процедуры QueueUserApc().

- Используется ОС, чтобы выполнить в пользовательском режиме подпрограмму завершения асинхронного ввода-вывода – I/O Completion Routine.

- Поле KAPC.KernelRoutine может содержать адрес дополнительной подпрограммы, выполняемой на уровне приоритета IRQL == APC_LEVEL перед выполнением подпрограммы KAPC.NormalRoutine. Эта подпрограмма выполняется только тогда, когда поток ожидает объект ядра в alertable-режиме.

38. Понятие асинхронной процедуры (apc). Асинхронные процедуры режима ядра: специальная и нормальная apc-процедуры. Асинхронные процедуры пользовательского режима.

1)Как и DPC, применяется для выполнения отложенных действий.

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

3)не подвержена ограничениям DPC-процедур, может захватывать объекты ядра, выполнять ожидания объектов, обращаться к отсутствующим страницам памяти, делать системные вызовы.

APC-процедура представляется стр-рой ядра KAPC, кот. содержит указатели на 3 подпрограммы:

1) RundownRoutine – выполняется, если из-за удаления потока удаляется структура KAPC.

2) KernelRoutine – выполняется на уровне приоритета APC_LEVEL.

3) NormalRoutine – выполняется на уровне приоритета PASSIVE_LEVEL.

Стр-ра KAPC создается и ставится в одну из двух очередей потока: одна очередь предназначена для APC режима ядра, вторая – для APC пользовательского режима. Начала очередей находятся в массиве из двух элементов: KTHREAD.ApcState.ApcListHead[].

Специальная APC-процедура режима ядра:

- KAPC.KernelRoutine выполняется на уровне приоритета APC_LEVEL.

- KAPC.NormalRoutine == NULL.

- Помещается в очередь APC режима ядра после других специальных APC.

- Вызывается перед нормальными APC режима ядра.

- Вызывается, если IRQL == PASSIVE_LEVEL и поток не находится в защищенной секции (guarded region) – KTHREAD.SpecialApcDisable != 0.

- APC не может захватить блокировку, работающую на IRQL == 0.

- используется для завершения процесса, для передачи результатов ввода-вывода в адресное пространство потока.

Нормальная APC-процедура режима ядра:

- KAPC.NormalRoutine выполняется на уровне приоритета PASSIVE_LEVEL.

- Вызывается, если IRQL == PASSIVE_LEVEL, поток не находится в защищенной или критической секции (critical region) – KTHREAD.KernelApcDisable != 0, и не выполняет специальную APC ядра.

- Нормальной APC разрешено делать все системные вызовы.

- Норм.APC исп-тся ОС для завершения обработки запроса от драйвера – Interrupt Request Packet.

APC-процедура пользовательского режима:

- KAPC.NormalRoutine выполняется на уровне приоритета PASSIVE_LEVEL.

- Вызывается, только если поток ожидает объект ядра в alertable-режиме, например WaitForSingleObjectEx(…, true), WaitForMultipleObjectsEx(…, true), SleepEx(…, true).

- Создается вызовом процедуры QueueUserApc().

- Используется ОС, чтобы выполнить в пользовательском режиме подпрограмму завершения асинхронного ввода-вывода – I/O Completion Routine.

- Поле KAPC.KernelRoutine может содержать адрес дополнительной подпрограммы, выполняемой на уровне приоритета IRQL == APC_LEVEL перед выполнением подпрограммы KAPC.NormalRoutine. Эта подпрограмма выполняется только тогда, когда поток ожидает объект ядра в alertable-режиме.

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