| « Поставить закладку » « Сделать стартовой » | |||
|
|||
|
Статьи:: Системы защиты :: Общая архитектура Windows NT :: Задержка обработки запросов IRP и постановка запросов IRP в очередь
Задержка обработки запросов IRP и постановка запросов IRP в очередь
Когда немедленное завершение запроса ввода/вывода в диспетчерской функции невозможно, драйвер должен указать Диспетчеру ввода/вывода, что обработка запроса продолжается. Для этого возвращаемым значением диспетчерской функции должно быть значение STATUS_PENDING. Перед этим в самом пакете IRP в текущем стеке размещения ввода/вывода должен быть установлен флаг SL_PENDING_RETURNED, помечающий запрос как неоконченный. Для этого служит функция IoMarkIrpPending(). VOID IoMarkIrpPending(IN PIRP Irp); Установка этого флага указывает, что IRP будет освобожден
драйвером с помощью вызова loCompleteRequest() когда-то потом.
NT предусматривает два способа организации очередей пакетов IRP:
Системная очередь запросов IRP (System Queuing) Простейший способ, с помощью которого драйвер может организовать очередь IRP - использовать Системную Очередь. Для этого драйвер предоставляет диспетчерскую точку входа Startle (DriverObject->DriverStartIo). При получении пакета IRP, который необходимо поставить в Системную Очередь, такой пакет необходимо пометить как отложенный с помощью вызова IoMarkIrpPending(), а затем вызвать функцию IoStartPacket(). VOID loStartPacket(IN PDEVICEJDBJECT Device-Object, IN PIRP Irp,
IN PULONG Key, Где: DeviceObject - Указатель на
устройство, которому направлен запрос ввода/ вывода;
Прототип функции IoStartNextPacket(): VOID loStartNextPacketByKey(IN PDEVICE_OBJECT DeviceObject, В этом случае из очереди будет выбран очередной пакет IRP с
заданным значением Key (это значение могло быть
установлено при помещении пакета в очередь при вызове loStartPacket()). Обработка пакетов IRP в функции Startlo Как должна происходить обработка пакетов из системной
очереди? Как уже говорилось, Startlo работает на уровне IRQL DISPATCHJLEVEL.
Пока выполняется эта функция, ни один поток с более низким значением IRQL не
может получить управление (если в системе один процессор). Следовательно, новые
запросы ввода/ вывода от прикладных программ попасть в очередь не могут (потоки
не выполняются). Если завершение очередного пакета ввода/вывода всегда
происходит в функции Startlo, системная очередь всегда содержит не более одного
пакета ввода/вывода. Если пакет ввода/вывода не может быть обработан в тот
момент, когда он попал в функцию Startlo, функция просто должна завершиться, не
завершая запрос ввода/ вывода и не вызывая IoStartNextPacket(). В этом случае
устройство остается «занятым». Поле
pDeviceObject->DeviceQueue.Busy все еще TRUE, а в поле
pDevice-Object->CurrentIrp находится указатель на
этот пакет IRP. Такой пакет может быть обработан, например, при поступлении
прерывания от аппаратного устройства (или при возникновении другого ожидаемого
события). Функция, которая завершит обработку такого пакета, обязана вызвать
loStartNextPacket(), чтобы инициировать выборку очередного пакета из системной
очереди. Заметим, что пока устройство остается «занятым», функция Startlo для
обработки пакетов из системной очереди не может быть вызвана. Очереди, управляемые драйвером Вместо использования системной очереди, можно предусмотреть свой собственный механизм организации очереди. Это можно сделать двумя способами:
Используя очереди, управляемые драйвером, драйвер получает
полный контроль над очередью. Например, драйвер может организовать одновременную
обработку трех запросов записи и двух запросов чтения при условии, что в данный
момент не выполняется запрос управления устройством. Функции управления очередью низкого уровня Для организации очереди с помощью функций низкого уровня используется стандартная структура LISTJENTRY. typedef struct _LIST_ENTRY { Очередь, как это видно из определения структуры,
двунаправленная. typedef struct _DEVICE_EXTENSION Как видно из определения структуры LIST_ENTRY, она не
содержит полей для хранения собственно данных (например, указателя на пакет
IRP). Поэтому распространенный способ использования структуры LIST_ENTRY -
включение ее экземпляра в состав более общей структуры. #define CONTAINING_RECORD (address, type, field) Где: Address - Известный адрес
некоторого поля структуры, адрес которой необходимо получить; PListEntry = ExInterlockedRemoveHeadList ( &
(pDeviceExtension->ListHead) , & (pDeviceExtension->ListLock) ) ; Организация очереди пакетов IRP показана на рис. 12.
Рис. 12 Функции управления очередью высокого уровня - «Очередь Устройства» (Device Queue) Драйвер создает дополнительные Очереди Устройства с помощью
выделения памяти из невыгружаемой памяти под дополнительные объекты-Очереди
Устройства (KDEVICE_QUEUE) и инициализирует эти объекты с помощью функции
Kelnitia-HzeDeviceQueue(). Добавление пакетов IRP в эти очереди производится с
помощью функции KelnsertDevieeQueue() или KelnsertByKeyDeviceQueue(), а выборка
пакетов из очереди - KeRemoveDeviceQueue(), KeRemoveByKeyDeviceQueue() или
KeRemoveEntryDeviceQueue(). Рубрика: Общая архитектура Windows NT
Вышел MySQL 5.1.30, первый стабильный рели....
После публикации 29 тестовых версий анонсирован первый стабильный релиз MySQL 5.1, пригодный для промышленной эксплуатации и обеспечивающий увеличение производительности для "тяжелых" SQL запросов, по сравнению с MySQL 5.0, примерно на 15-20%. Главные новшества появившиеся в MySQL 5.1:
Подробнее... |
Рубрика: MySQL
| Добавлено: 28.11.2008
Тестирование параллельных программ.
Тестирование параллельного программного обеспечения представляет собой более сложную задачу по сравнению с тестированием последовательной программы. Программист должен знать о подводных камнях при тестировании параллельного кода, имеющихся методологиях и инструментарии.
Подробнее... |
Рубрика: Тестирование
| Добавлено: 28.11.2008
Архитектура AMD64 (EM64T).
Аннотация. В статье кратко рассматривается архитектура AMD64 компании AMD и ее реализация EM64T компании Intel. Описаны особенности архитектуры, ее возможности, достоинства и недостатки.
Подробнее... |
Рубрика: Архитектура AMD
| Добавлено: 27.11.2008
Остальные статьи: |
Цитата дня (все,добавить):
|
Realcoding.NET
© 2003-2008 |
Контакты |
Реклама на сайте
|