******************************************************************************* * * * Bugcheck Analysis * * * ******************************************************************************* 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: 0000000002e90000, memory referenced Arg2: 0000000000000002, IRQL Arg3: 0000000000000001, value 0 = read operation, 1 = write operation Arg4: fffff88009e04e02, address which referenced memory ... (생략) |
드라이버 개발시 많이 보게 되는 BugCheck 다.
이름과는 다르게 잘못된 메모리를 참조하여 발생된 경우를 더 많이 보게 된다.
DeviceIoControl로 어플 <-> 드라이버 통신시, 유저에서 생성한 버퍼를 커널에서 채워넣을 경우 간헐적으로 발생을 하는 경우가 있었다. 아무리 디버깅을 해봐도 잘못된 메모리 주소도 아니고, 접근 못하는 주소도 아닌데 계속 발생을하여 며칠 애를 먹다가 드디어 원인을 찾았다.
SpinLock 획득 이후, Release 하기 전에 유저 메모리에 쓰기 작업을 할 경우 발생을 하고 있었다.
원인을 생각해보자면 KeAcquireSpinLock이 호출되면서 DISPATCH_LEVEL로 IRQL이 상승했을 것이고,
DISPATCH_LEVEL에서는 Page Fault가 발생하면 안되므로 Non Paged Pool 메모리 영역을 사용했어야 하지만,
Paged Pool을 사용하는 유저 메모리이기 때문에 어느 순간 페이징이 되면서 발생.
너무 당연한 내용인데..아직 갈 길이 멀구나
'Kernel mode > BugCheck' 카테고리의 다른 글
BugCheck 0x3F NO_MORE_SYSTEM_PTES (0) | 2014.05.16 |
---|---|
BugCheck 0xC2 BAD_POOL_CALLER (0) | 2014.04.22 |
BugCheck 0xC1 SPECIAL_POOL_DETECTED_MEMORY_CORRUPTION (0) | 2014.03.21 |
BugCheck 0x133 DPC_WATCHDOG_VIOLATION (0) | 2013.12.23 |