IRQL_NOT_LESS_OR_EQUAL은 정확히 무엇입니까?


15

IRQL_NOT_LESS_OR_EQUAL은 정확히 무엇입니까? IRQL이란 무엇입니까? IRQL을 사용하는 것은 무엇입니까? 왜 작거나 같아야합니까? 그것이 작거나 같지 않은 이유는 무엇입니까? OS가 작거나 같지 않은 상태에서 복구 할 수없는 이유는 무엇입니까? IRQL은 Windows에만 영향을 줍니까?

이 오류는 매우 일반적인 것 같습니다 . 나는 도움을 요구하지 않고 설명을 요구하고 있습니다.




IRQL_NOT_LESS_OR_EQUAL 버그 검사의 값은 0x0000000A입니다. 이는 Microsoft Windows 또는 커널 모드 드라이버가 IRQL (인터럽트 요청 수준) 상태에서 잘못된 주소로 페이지 메모리에 액세스했음을 나타냅니다. IQL은 커널의 우선 순위 시스템입니다. 커널의 일부 IRQL에서는 페이지 파일에 저장된 데이터에 액세스 할 수 없습니다. dmp를 분석하고 타사 코드가 관련되어 있는지 확인하십시오. 그렇지 않은 경우 메모리에 문제가 있는지 테스트하십시오.
magicandre1981

1
재미있는 것은 메시지에 대한 가장 실질적인 반응입니다. 그것이 의미하는 바가 중요하다는 것은 중요하지 않습니다. 메시지를받을 때해야 할 일은 .. 또는 모든 문제는 관련 번역입니다. IRQL BSOD는 일반적으로 "드라이버 문제"입니다! 그래서 어떤 드라이버를 찾아서 드라이버를 제거하고 다시 설치하십시오.하지만 어쨌든 무슨 이야기인지에 대한 좋은 질문입니다 ... IRQ가 무엇인지 알지만 IRQL이 무엇인지 알지 못했습니다. 제이미의 대답!
barlop

답변:


25

복잡합니다. ;)

아뇨, 정말입니다.

IRQL은 "인터럽트 요청 레벨"을 나타냅니다. Windows x86 시스템에서는 0에서 31까지, x64 시스템에서는 0에서 15까지의 숫자입니다. 다른 커널 모드 작업과 관련된 커널 모드 작업의 "중요도"를 나타냅니다.

IRQL은 프로세스 또는 스레드가 아닌 Windows 정의 프로세서 상태로, 프로세서가 수행하는 작업이 다른 작업에 의해 중단 될 수 있는지 여부를 Windows에 표시합니다. 새 작업 (예 : 인터럽트 서비스 루틴)에 프로세서의 현재 IRQL보다 높은 IRQL이 있으면 예, 현재 작업을 중단 할 수 있습니다. 그렇지 않으면 아니요. 멀티 프로세서 시스템에서 각 프로세서에는 자체 IRQL이 있습니다. 여기에는 하이퍼 스레딩으로 생성 된 "논리 프로세서"가 포함됩니다.

(Windows의 "우선 순위"는 스레드 우선 순위를 나타내므로 IRQL은 다르기 때문에 "우선 순위"가 아닌 "중요도"라는 단어를 사용합니다. 스레드 우선 순위와 달리 동일한 IRQL의 커널 작업은 시간 분할되지 않으며 IRQL은 ' t 자동 부스트 및 디 케이트 대상

(여기서 "커널 작업"이라는 용어는 공식이 아니라고 언급해야합니다. Windows는 실제로 이러한 것을 "커널 작업"이라고 부르지 않으며, 프로세스 및 스레드와 같이 관리되는 개체가 아니며 x86 "작업과 관련이 없습니다. 게이트 및 "작업 관리자"에 표시된 모든 항목에 대해 설명합니다. "커널 모드 작업"은 여기서 "커널 모드 작업"이라는 용어를 실제로 "IRQL 2의 커널 모드에서 수행해야하는 정의 된 시작 및 끝이있는 모든 항목 또는 인터럽트 서비스 루틴은 "커널 모드 작업"의 한 예입니다. DPC 루틴도 마찬가지입니다. 그러나 다른 예는 커널 모드 스레드의 코드 일 수 있습니다. 이러한 스레드는 IRQL 0에서 시작하지만 코드의 일부인 경우 제기IRQL 2 이상으로, 무언가를 수행 한 다음 이전 IRQL로 돌아 가면 코드의 높은 IRQL 부분은 여기서 "커널 작업"이라고 부르는 것의 한 예입니다. )

성능 모니터는 시간이 실제로 DPC 루틴 또는 ISR에서 소비되었는지 또는 IRQL을 증가시킨 결과인지에 관계없이 IRQL 2에서 소비 된 시간을 "% DPC 시간"으로 표시하고 IRQL> 2에서 "% 인터럽트 시간"으로 표시합니다. 더 낮은 값. 각각은 PerfMon이 "% 권한 시간"으로 표시하는 부분 집합으로 "커널 모드 시간"으로 표시되어 있어야합니다.

커널 작업이 IRQL 2 이상에서 시작되면 동일한 IRQL의 다른 항목 이 동일한 프로세서에서 시작 되기 전에 완료 됩니다. 더 높은 IRQL 작업으로 인해 중단 될 수 있지만 (이는 아직 더 높은 IRQL 작업 등으로 중단 될 수 있음) 더 높은 IRQL 작업이 완료되면 제어가 중단 된 작업으로 돌아갑니다.

IRQL은 주로 직렬화 메커니즘입니다. (많은 "동기화"라고 말하지만 결과를보다 정확하게 설명하기 위해이 단어를 선호합니다.) 동일한 CPU에서 특정 공유 리소스에 액세스하는 여러 작업 (주로 OS 커널 공간의 공유 데이터 구조)을 보장하는 데 도움이됩니다. 이러한 구조를 손상시킬 수있는 방식으로 서로를 방해 할 수 없습니다.

예를 들어 Windows 커널의 많은 데이터, 특히 메모리 스케줄러 및 스레드 스케줄러가 사용하는 데이터 는 IRQL 2에서 "직렬화" 됩니다. 즉, 이러한 데이터를 수정하려는 모든 작업은 그렇다면 IRQL 2. 더 높은 IRQL 태스크가 이러한 데이터를 쓰려고 시도하면 동일한 데이터에서 읽기-수정-쓰기주기의 중간에있을 수있는 IRQL 2 태스크가 인터럽트되었을 수 있기 때문에 손상이 발생할 수 있습니다. 따라서 높은 IRQL 작업은 그렇게 할 수 없습니다.

IRQL> 2에서 모든 장치의 인터럽트가 발생하기 때문에 더 높은 IRQL 작업은 대부분 장치 드라이버의 인터럽트 서비스 루틴입니다. 여기에는 OS의 타임 키핑 및 시간 중심 활동을 구동하는 마더 보드의 타이머 칩으로부터의 인터럽트가 포함됩니다. IRQL은 모든 "일반"하드웨어 장치보다 높습니다.

IRQL 2 이상은 하드웨어 인터럽트에 의해 트리거되지 않지만 대기를 포함하여 정상적인 스레드 스케줄링이 발생할 수없는 커널 작업에 사용됩니다. 따라서 프로세서가 IRQL 2 이상에 있으면 IRQL이 2 아래로 떨어질 때까지 해당 프로세서에서 스레드 컨텍스트 전환이 발생하지 않습니다.

사용자 모드 코드는 항상 IRQL 0입니다. 커널 모드 코드는 최대 값에 관계없이 0부터 IRQL까지 실행할 수 있습니다. IRQL 1은 특별한 경우입니다. 커널 모드 일 뿐이지 만 스케줄링에 영향을 미치지 않으며 실제로 프로세서보다 스레드 상태가 더 높습니다. 예를 들어 스레드 컨텍스트 전환 중에 저장 및 복원됩니다.

다양한 직렬화 보장을 유지하기 위해 대부분의 예외 (0으로 나누기 또는 페이지 오류와 같은 메모리 액세스 위반 등)는 IRQL 2 이상에서 처리 할 수 ​​없습니다. (IRQL 2 btw는 일반적으로 "디스패치 수준"또는 "DPC 수준"이라고합니다.)

그리고 이제이 버그 검사 코드를 설명 할 수 있습니다!

IRQL_NOT_LESS_OR_EQUAL의 가장 일반적인 경우는 페이지 오류 ( "비 주민"가상 주소 액세스 시도) 또는 메모리 액세스 위반 (읽기 ​​전용 페이지에 쓰거나 정의되지 않은 페이지 액세스)으로 인한 것입니다. IRQL 2 이상에서 발생합니다.

이러한 예외가 IRQL 0 또는 1에서 발생하면 시스템 제공 코드 (예 : 페이지 결함 처리기) 또는 개발자가 제공 한 예외 처리기에서 "처리"될 수 있습니다. 그러나 대부분의 예외는 IRQL 2 이상에서 발생한 경우 전혀 처리 할 수 ​​없습니다.

버그 체크 코드는 "IRQL 0 또는 1에서만 처리 할 수있는 유형의 예외는 IRQL이 2 이상일 때 발생했습니다"를 의미합니다. 즉, "1 이상"이다. 이상한 표현이지만 거기에 있습니다.

이 버그 검사를 유발할 수있는 몇 가지 다른 사항이 있으며 IRQL이 작거나 같지 않은 값이 항상 1은 아니지만 거의 발생하지 않습니다. WinDBG 설명서에 해당 내용이 나와 있습니다.


훌륭한 답변입니다. IRQL이 2보다 큰 것으로 잘 알려진 것을 알고 있습니까?
Scott Chamberlain

1
아마도 장치 드라이버.
LawrenceC

1
@LawrenceC 예. 모든 하드웨어 인터럽트는 IRQL> 2에 있습니다.
Jamie Hanrahan 1
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.