다음을 통해 공유


커널 스택 사용

커널 모드 스택의 크기는 약 3페이지로 제한됩니다. 따라서 내부 루틴에 데이터를 전달할 때 드라이버는 커널 스택에서 많은 양의 데이터를 전달할 수 없습니다.

커널 모드 스택 공간이 부족하지 않도록 하려면 다음 디자인 지침을 사용합니다.

  • 각 루틴이 커널 스택의 데이터를 전달하는 경우 한 내부 드라이버 루틴에서 다른 드라이버 루틴으로 깊이 중첩된 호출을 하지 않습니다.

  • 재귀 루틴이 있는 드라이버를 디자인하는 경우 발생할 수 있는 재귀 호출 수를 제한해야 합니다.

즉, 드라이버의 호출 트리 구조는 상대적으로 평평해야 합니다. IoGetStackLimitsIoGetRemainingStackSize 루틴을 호출하여 사용 가능한 커널 스택 공간을 확인하거나 KeExpandKernelStackAndCallout을 호출하여 확장할 수 있습니다. 커널 모드 스택의 크기는 다양한 하드웨어 플랫폼과 다양한 버전의 운영 체제에 따라 달라질 수 있습니다.

커널 스택 공간이 부족하면 심각한 시스템 오류가 발생합니다. 따라서 커널 스택 공간이 부족한 것보다 드라이버가 시스템 공간 메모리를 할당 하는 것이 좋습니다. 그러나 페이지가 없는 풀은 제한된 시스템 리소스이기도 합니다.

일반적으로 커널 모드 스택은 메모리에 있지만 스레드가 사용자 모드를 지정하는 대기 상태로 전환되는 경우 가끔 페이징될 수 있습니다. 현재 스레드에 대한 커널 스택 페이징을 일시적으로 사용하지 않도록 설정하는 방법에 대한 자세한 내용은 KeSetKernelStackSwapEnable 을 참조하세요. 성능상의 이유로 전역적으로 커널 스택 페이징을 사용하지 않도록 설정하는 것은 좋지 않지만 디버깅 세션 중에 이 작업을 수행하려면 커널 스택 페이징 사용 안 함을 참조하세요.

커널 스택이 페이징될 수 있으므로 스택 기반 버퍼(예: 지역 변수)를 DMA 또는 DISPATCH_LEVEL 이상에서 실행되는 루틴에 전달하는 것에 주의하세요.