3/18/2009

윈도우즈의 Non-paged memory


윈도우즈에는 암묵적으로 제한된 리소스가 많이 있는데 그중의 하나가 바로 커널 공간의 non-paged pool이다. Non-paged pool 메모리는 피지칼 메모리에 할당되는 메모리로서(대부분 힙, 다른 메모리 형태도 가능한지 모르겠다) 페이지 폴트를 일으키지 않고 접근 할 수 있어서 높은 IRQL에서도 접근이 가능한 메모리 영역들이다. 따라서 뭔가 IRQL과 상관 없이 어떠한 메모리 영역에 접근해야 할 경우에는 non-paged pool을 써버리는 경우가 많다. 그러다 보니 아무 생각 없이 non-paged pool을 싸질러 놓은 드라이버들도 많이 존재하는데, 그러한 드라이버 몇 개가 우연히 한 시스템에서 조우하는 날에는 그 시스템은 아무런 명확한 이유 없이 계속 BSOD를 내뿜고, 불안정해지고 레지스트리나 파일 시스템이 깨지는 현상이 발생한다. 이러한 종류의 버그는 non-paged pool 때문에 시스템에 불안정함이 올수 있다라는 이유를 미리 알고 있지 않다면 처음에 non-paged pool을 범인으로 지목하는 과정 자체가 힘들다.
 
이러한 non-paged pool 사용량 추적은 간단히 taskmgr이나 perfmon으로도 가능하지만, 더 자세한 pooltag을 겸비한 추적을 원한다면 poolmon이나 pooltag이라는 프로그램을 사용할 필요가 있다. 이 프로그램들은 pooltag 추적을 자동으로 활성화 시켜 주고 커널의 메모리 사용량 데이타를 GUI와 텍스트 형태로 출력해 준다. 이러한 프로그램을 사용하면 문제를 일으키는 pool tag 스트링을 잡아 낼 수 있으며 향후 대책을 세울 수도 있게 된다. 어떠한 특정 프로그램 조합시에만 발생하는 BSOD 현상은 non-paged pool 고갈을 의심해 볼 필요가 있다.
 
더 자세한 내용은 아래의 링크를 참조하면 된다. 잘 보면 레지스트리 키(HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\NonPagedPoolSize)를 조정하는 방법으로 Non-paged pool을 늘릴 수 있으나 이는 순전히 피지칼 메모리가 받쳐 줄 경우의 이야기이다.

http://support.microsoft.com/default.aspx?scid=kb;en-us;156316

http://technet.microsoft.com/en-us/library/aa996269.aspx

http://technet.microsoft.com/en-us/library/cc785394.aspx

이렇게 윈도우즈 커널이 조용하게 개발자를 엿먹이는 경우는 이 외에도 몇가지가 더 있는데, 이는 기회가 될때마다 소개해 보려고 한다.

Posted via email from bugtruck's posterous

댓글 2개:

  1. 커널 스택을 마구 마구 써주는 드라이버들도 있죠.
    내쪽에선 그냥 함수를 하나 호출할 뿐인데... BSOD 를 뿌려대 버리니... ㅜ.ㅜ

    답글삭제
  2. 예 그렇죠. 그것에 대해서 다음번에 올리려고 했는데...
    커널 스택 사이즈 제한으로 인한 건데, 유저랜드는 스택 사이즈를 애초에 좀 유연하게 설정할 수 있지만, 커널에서는 그게 힘들죠. 보안 제품 여러개 쓰면 같은 시스템콜에 대해서 서로 후킹하다가 스택 오버 나는 경우가 많더군요.

    답글삭제