최신목록

2020년 7월 27일 월요일

[Driver]IRQL LEVEL 과 PAGED_CODE

디바이스 드라이버에서 중요하게 생각되는 점이 IRQL 이 DISPATCH_LEVEL 수준 이상의 작업을 진행하는 동안은 절대로 스케줄링 혹은 페이징이 발생하지 않도록 하여야 한다는 것이다. 그래서 그런지 기본적으로 디바이스 드라이버 코드는 NonPaged 영역에 할당된다. 그러나 NonPaged 영역은 한계가 있는 자원으로 필요한 경우에만 사용하여야 한다. 

컴파일러중에는 이를 위해서 특정 섹션(Paged 영역등)에 코드를 둘 수 있게 pragma를 지원(ALLOC_PRAGMA)하기도 한다. 아래와 같이 DriverUnload등의 함수를 Paged 영역에 할당되게 설정한다.


#ifdef ALLOC_PRAGMA
    #pragma alloc_text(INIT, DriverEntry)
    #pragma alloc_text(PAGE, DriverUnload)
    :
    :
#endif

하지만 위와 같이 사용하였을 경우  IRQL이 DISPATCH_LEVEL 이상인 상태에서 해당 함수가 불릴 경우 페이지 폴트가 발생하여 블루스크린이 발생할 수도 있다. 이것을 방지하기 위해서  해당 함수 앞에 PAGED_CODE() 매크로 를 두어 위 상황에서 바로 시스템 크래쉬를 일으켜 더 복잡한 문제를 방지할 수 있게 해준다.

PAGED_CODE() 매크로는 아래와 같이 wdm.h에 정의되있다. 

#define PAGED_CODE() PAGED_ASSERT(KeGetCurrentIrql() <= APC_LEVEL);
 



댓글 없음:

댓글 쓰기