버그 검사 0xD1: DRIVER_IRQL_NOT_LESS_OR_EQUAL

DRIVER_IRQL_NOT_LESS_OR_EQUAL 버그 검사 값은 0x000000D1. 이는 프로세스 IRQL이 너무 높은 동안 커널 모드 드라이버가 페이지 가능한 메모리에 액세스하려고 했음을 나타냅니다.

중요

이 문서는 프로그래머를 위한 것입니다. 컴퓨터를 사용하는 동안 블루 스크린 오류 코드를 받은 고객인 경우 블루 스크린 오류 문제 해결을 참조하세요.

DRIVER_IRQL_NOT_LESS_OR_EQUAL 매개 변수

매개 변수 Description

1

참조된 메모리입니다.

2

참조 시 IRQL입니다.

3

  • 0 - 읽기
  • 1 - 쓰기
  • 2 - 실행
  • 8 - 실행

4

메모리를 참조하는 주소입니다. 이 주소에서 ln (가장 가까운 기호 나열) 을 사용하여 함수의 이름을 확인합니다.

원인

원인을 확인하려면 Windows 디버거, 프로그래밍 환경 및 오류 모듈의 소스 코드에 대한 액세스 권한이 필요합니다.

일반적으로 이 오류가 발생하면 드라이버가 IRQL(인터럽트 요청 수준)이 너무 높은 동안 페이지가 지정 가능하거나 완전히 잘못된 주소에 액세스하려고 했습니다. 이 오류의 원인은 다음과 같습니다.

  • DISPATCH_LEVEL 이상에서 실행하는 동안 잘못된 포인터(예: NULL 또는 해제된 포인터)를 역참조하세요.

  • DISPATCH_LEVEL 이상에서 페이징 가능한 데이터에 액세스합니다.

  • DISPATCH_LEVEL 이상에서 페이징 가능한 코드를 실행합니다.

오류를 담당하는 드라이버를 식별할 수 있는 경우 해당 이름은 파란색 화면에 인쇄되고 위치(PUNICODE_STRING) KiBugCheckDriver의 메모리에 저장됩니다. 디버거 명령인 dx (디버거 개체 모델 식 표시)를 사용하여 dx KiBugCheckDriver를 표시할 수 있습니다.

이 버그 검사 일반적으로 부적절한 메모리 주소를 사용한 드라이버에 의해 발생합니다.

페이지 오류의 가능한 원인은 다음과 같습니다.

  • 함수는 페이징 가능으로 표시되었으며 관리자 권한 IRQL(잠금 가져오기 포함)에서 실행되고 있었습니다.

  • 함수 호출이 다른 드라이버의 함수에 대해 이루어졌으며 해당 드라이버가 언로드되었습니다.

  • 함수는 잘못된 포인터인 함수 포인터를 사용하여 호출되었습니다.

Windows IRQL에 대한 자세한 내용은 Pavel Yosifovich, Mark E. Russinovich, David A. Solomon 및 Alex Ionescu의 Windows Internals 7 버전 1부 를 참조하세요.

해상도

개발 중인 드라이버로 인해 문제가 발생하는 경우 버그 검사 당시 실행 중이던 함수가 다음과 같은지 확인합니다.

  • 페이지를 표시할 수 없음
  • 페이징할 수 있는 다른 인라인 함수를 호출하지 않습니다.

!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를 사용하여 자세히 조사합니다.

매개 변수 4와 함께 ln (가장 가까운 기호 나열) 을 사용하여 호출된 함수의 이름을 확인합니다. 또한 !analyze 출력을 검사하여 오류 코드가 식별되었는지 확인합니다.

매개 변수 1 주소에서 !pool 을 사용하여 페이징 풀인지 확인합니다. !address 및 고급 !pte 명령을 사용하여 이 메모리 영역에 대해 자세히 알아봅니다.

표시 메모리 명령을 사용하여 매개 변수 1의 명령에서 참조되는 메모리를 검사합니다.

u, ub, uu(언어셈블) 명령을 사용하여 매개 변수 4에서 메모리를 참조한 주소의 코드를 확인합니다.

명령을 lm t n 사용하여 메모리에 로드된 모듈을 나열합니다. !memusage 및 를 사용하여 시스템 메모리의 일반 상태를 검사합니다.

드라이버 검증 도구

드라이버 검증 도구는 드라이버의 동작을 검사하기 위해 실시간으로 실행되는 도구입니다. 예를 들어 드라이버 검증 도구는 메모리 풀과 같은 메모리 리소스의 사용을 확인합니다. 드라이버 코드 실행에서 오류를 식별하는 경우 드라이버 코드의 해당 부분을 추가로 조사할 수 있도록 예외를 사전에 만듭니다. 드라이버 검증 도구 관리자는 Windows에 기본 제공되며 모든 Windows PC에서 사용할 수 있습니다.

드라이버 검증 도구 관리자를 시작하려면 명령 프롬프트에 검증 도구를 입력합니다. 확인할 드라이버를 구성할 수 있습니다. 드라이버를 확인하는 코드는 실행할 때 오버헤드를 추가하므로 가능한 가장 적은 수의 드라이버를 확인합니다. 자세한 내용은 드라이버 검증 도구를 참조하세요.

설명

Windows 디버거를 사용하여 이 문제를 해결할 준비가 되지 않은 경우 몇 가지 기본적인 문제 해결 기술을 사용할 수 있습니다.

  • 이 버그 검사 발생시키는 디바이스 또는 드라이버를 식별하는 데 도움이 될 수 있는 추가 오류 메시지는 시스템 로그인 이벤트 뷰어 확인합니다.

  • 버그 검사 메시지에서 드라이버가 식별되면 드라이버를 사용하지 않도록 설정하거나 드라이버 업데이트를 위해 제조업체와 검사.

  • 설치된 새 하드웨어가 설치된 Windows 버전과 호환되는지 확인합니다. 예를 들어 Windows 10 사양에서 필요한 하드웨어에 대한 정보를 얻을 수 있습니다.

일반적인 추가 문제 해결 정보는 블루 스크린 데이터를 참조하세요.