다음을 통해 공유


코드 및 데이터는 언제 페이지 가능해야 하나요?

드라이버의 전체 또는 일부를 페이지 가능으로 만들 수 있습니다. 드라이버 코드를 페이징하면 드라이버의 부하 이미지 크기가 줄어들어 다른 용도로 시스템 공간을 확보할 수 있습니다. 모뎀 및 CD-ROM과 같이 산발적으로 사용되는 디바이스의 드라이버 또는 거의 호출되지 않는 드라이버 부분에 가장 적합합니다.

다음 중에서 수행하는 드라이버 코드는 메모리 상주여야 합니다. 즉, 이 코드는 페이지가 없는 섹션이나 코드가 실행될 때 메모리에 잠긴 페이징된 섹션에 있어야 합니다.

  • IRQL = DISPATCH_LEVEL 이상에서 실행됩니다.

  • 스핀 잠금을 획득합니다.

  • Wait 매개 변수가 TRUE로 설정된 KeReleaseMutex 또는 KeReleaseSemaphore와 같은 커널의 개체 지원 루틴을 호출합니다. 대기TRUE로 설정된 커널이 호출되면 호출은 DISPATCH_LEVEL IRQL을 사용하여 반환됩니다.

드라이버 코드는 코드가 페이지 오류를 일으킬 수 있는 작업을 수행하는 경우 IRQL < DISPATCH_LEVEL 실행되어야 합니다. 코드는 다음 중 한 가지 작업을 수행하는 경우 페이지 오류를 일으킬 수 있습니다.

  • 메모리에 잠겨 있지 않은 페이징 풀에 액세스합니다.

  • 페이지가 지정 가능한 루틴을 호출합니다.

  • 사용자 스레드의 컨텍스트에서 잠금 해제된 사용자 버퍼에 액세스합니다.

일반적으로 모든 페이징 가능한 코드(또는 데이터)의 총 크기가 4KB(KB) 이상인 경우 섹션을 페이징해야 합니다. 가능하면 페이지가 지정 가능한 코드(또는 데이터)를 코드(또는 데이터)와 별도의 섹션으로 격리해야 합니다. 이 섹션은 경우에 따라 페이지가 지정될 수 있지만 경우에 따라 잠겨야 합니다. 예를 들어, 순전히 페이징 가능한 코드와 주문형 잠금 코드를 결합하면 결합된 섹션에 대해 필요한 것보다 더 많은 시스템 공간이 잠깁니다. 그러나 드라이버에 4KB 미만의 페이저블 코드(또는 데이터)가 있는 경우 해당 코드(또는 데이터)를 주문형 잠금 코드(또는 데이터)와 결합하여 시스템 공간을 절약할 수 있습니다.