Поделиться через


Проверка ошибок 0xD1: DRIVER_IRQL_NOT_LESS_OR_EQUAL

Проверка ошибок DRIVER_IRQL_NOT_LESS_OR_EQUAL имеет значение 0x000000D1. Это означает, что драйвер в режиме ядра пытался получить доступ к страницируемой памяти во время процесса IRQL, который был слишком высоким.

Внимание

Эта статья предназначена для программистов. Если вы являетесь клиентом, который получил код ошибки синего экрана при использовании компьютера, см. статью "Устранение неполадок синим экраном".

параметры DRIVER_IRQL_NOT_LESS_OR_EQUAL

Параметр Описание

1

На память ссылается.

2

IRQL во время ссылки.

3

  • 0 — чтение
  • 1 . Запись
  • 2. Выполнение
  • 8. Выполнение

4

Адрес, на который ссылается память. Используйте ln (список ближайших символов) на этом адресе, чтобы просмотреть имя функции.

Причина

Чтобы определить причину, требуется отладчик Windows, интерфейс программирования и доступ к исходному коду для модуля сбоя.

Как правило, при возникновении этой ошибки драйвер пытался получить доступ к адресу, доступному для страниц (или совершенно недопустимому), в то время как уровень запроса прерывания (IRQL) был слишком высоким. Для этого могут быть следующие причины:

  • Разыменование неверного указателя (например, NULL или освобожденного указателя) при выполнении на уровне DISPATCH_LEVEL или выше.

  • Доступ к страничным данным на уровне DISPATCH_LEVEL или выше.

  • Выполнение страничного кода на уровне DISPATCH_LEVEL или выше.

Если драйвер, отвечающий за ошибку, можно определить, его имя печатается на синем экране и хранится в памяти в расположении (PUNICODE_STRING) KiBugCheckDriver. Вы можете использовать dx (выражение объектной модели отладчика отображения), команду отладчика, чтобы отобразить это: dx KiBugCheckDriver.

Эта проверка ошибок обычно вызвана драйверами, которые использовали неправильные адреса памяти.

Возможные причины сбоя страницы включают следующие события:

  • Функция была помечена как страничные и выполнялась на повышенных привилегиях IRQL (которая включает получение блокировки).

  • Вызов функции был выполнен в функцию в другом драйвере, и этот драйвер был выгружен.

  • Функция была вызвана с помощью указателя функции, который был недопустимым указателем.

Дополнительные сведения о Windows IRQLs см. в разделе Windows Internals 7th Edition Part 1 от Павла Yosifовича, Марка Э. Руссиновича, Дэвида А. Соломона и Алекса Ионеску.

Разрешение

Если проблема вызвана разрабатываемой драйвером, убедитесь, что функция, которая выполнялась во время проверки ошибки:

  • Не помечен как страницы
  • Не вызывает другие встроенные функции, которые можно вывести на страницу.

Расширение отладчика !analyze отображает сведения о проверке ошибок и может оказаться полезным при определении первопричины. В следующем примере выходные данные из !analyze.

DRIVER_IRQL_NOT_LESS_OR_EQUAL (d1)
An attempt was made to access a pageable (or completely invalid) address at an
interrupt request level (IRQL) that is too high.  This is usually
caused by drivers using improper addresses.
If kernel debugger is available get stack backtrace.
Arguments:
Arg1: fffff808add27150, memory referenced
Arg2: 0000000000000002, IRQL
Arg3: 0000000000000000, value 0 = read operation, 1 = write operation
Arg4: fffff808adc386a6, address which referenced memory

Если драйвер, отвечающий за ошибку, можно определить, его имя печатается на синем экране и хранится в памяти в расположении (PUNICODE_STRING) KiBugCheckDriver. Вы можете использовать dx (выражение объектной модели отладчика отображения), команду отладчика, чтобы отобразить следующее: dx KiBugCheckDriver

0: kd> dx KiBugCheckDriver
KiBugCheckDriver                 : 0xffffc6092de892c8 : "Wdf01000.sys" [Type: _UNICODE_STRING *]

Если кадр ловушки доступен в файле дампа, используйте команду TRAP , чтобы задать контекст указанному адресу.

Чтобы начать отладку этого типа проверки ошибок, изучите трассировку стека с помощью команд k, kb, kc, kd, kp, kP, kv (стек обратного вывода).

В отладчике выполните команду !irql, чтобы отобразить сведения об IRQL процессора на целевом компьютере до разрыва отладчика. Например:

0: kd> !irql
Debugger saved IRQL for processor 0x0 -- 2 (DISPATCH_LEVEL)

В большинстве случаев проверки ошибок этого типа проблема не является уровнем IRQL, а памятью, к которой осуществляется доступ.

Так как эта проверка ошибок обычно вызвана драйверами, которые использовали неправильные адреса памяти, используйте параметры 1, 3 и 4 для дальнейшего изучения.

Используйте ln (список ближайших символов) с параметром 4, чтобы просмотреть имя вызываемой функции. Также изучите выходные данные !analyze , чтобы узнать, определен ли код сбоя.

Используйте пул !pool в адресе параметра 1, чтобы узнать, является ли пул страниц. Используйте !address и расширенную команду !pte, чтобы узнать больше об этой области памяти.

Используйте команды памяти отображения для проверки памяти, указанной в команде в параметре 1.

Используйте команды u, ub, uu (unassemble) для просмотра кода в адресе, на который ссылается память в параметре 4.

Используйте команду lm t n для перечисления модулей, загруженных в память. Используйте !memusage и проверьте общее состояние системной памяти.

Средство проверки драйверов

Средство проверки драйверов — это средство, которое выполняется в режиме реального времени для проверки поведения драйверов. Например, средство проверки драйверов проверяет использование ресурсов памяти, таких как пулы памяти. Если он идентифицирует ошибки в выполнении кода драйвера, он упреждающе создает исключение, чтобы позволить, чтобы часть кода драйвера была более тщательно изучена. Диспетчер проверки драйверов встроен в Windows и доступен на всех компьютерах с Windows.

Чтобы запустить диспетчер проверки драйверов, в командной строке введите средство проверки . Вы можете настроить драйверы для проверки. Код, проверяющий драйверы, добавляет затраты при выполнении, поэтому попробуйте проверить наименьшее количество драйверов. Дополнительные сведения см. в разделе "Проверка драйверов".

Замечания

Если вы не оснащены отладчиком Windows для работы с этой проблемой, можно использовать некоторые основные методы устранения неполадок.

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

  • Если драйвер определен в сообщении проверки ошибок, отключите драйвер или обратитесь к изготовителю обновлений драйверов.

  • Убедитесь, что любое новое оборудование, которое установлено, совместимо с установленной версией Windows. Например, можно получить сведения о требуемом оборудовании в спецификациях Windows 10.

Дополнительные общие сведения об устранении неполадок см. в разделе "Анализ данных с синим экраном".