스토리지 드라이버의 페이저블 코드에 대한 제한 사항
교착 상태를 방지하기 위해 읽기 또는 쓰기 요청을 서비스하는 데 사용되는 스토리지 드라이버의 어떤 부분도 페이지 가능한 코드가 없어야 하며 페이지가 지정된 메모리에 액세스하려고 시도해서는 안 됩니다. 이는 IRQL > PASSIVE_LEVEL 드라이버의 DispatchRead 및 DispatchWrite 루틴을 호출할 수 있고 페이지 오류를 서비스하는 페이징 내 I/O는 IRQL = APC_LEVEL 발생하기 때문입니다.
특정 자격을 갖춘 스토리지 드라이버의 디바이스 제어 디스패치 루틴 DispatchDeviceControl에도 유사한 규칙이 적용됩니다. 스토리지 드라이버의 디바이스 컨트롤 디스패치 루틴에는 페이저블 코드 또는 액세스 페이지 가능 메모리가 포함되어서는 안됩니다. 디스패치 루틴은 임의의 IRQL에서 다른 드라이버를 위한 IOCTL 요청을 수신하고 드라이버 스택에 전달할 수 있어야 합니다. 드라이버는 IRQL 또는 요청 컨텍스트를 변경하지 않고 처리되지 않은 모든 IOCTL 요청을 스택 아래로 전달 해야 합니다 .
그러나 Microsoft는 모든 스토리지 IOCTL 요청을 PASSIVE_LEVEL 제출해야 하므로 디스패치 루틴 자체는 페이저닝할 수 없지만 페이지가 지정된 하위 경로를 호출하여 스토리지 IOCTL 요청을 처리할 수 있습니다. 이러한 하위 루틴은 페이저블 메모리에 액세스할 수도 있습니다.
I/O를 수행하지 않고 IRQL = PASSIVE_LEVEL 실행되는 DriverEntry, 다시 초기화 및 언로드와 같은 루틴에는 페이징 가능한 코드도 있을 수 있습니다.
페이징 경로에서 스토리지 디바이스를 관리하는 드라이버에는 특별한 고려 사항이 적용됩니다. 드라이버가 페이징 파일의 I/O 작업에 참여하는 경우 "페이징 경로"에 있습니다. 스토리지 드라이버가 페이징 경로에 있는 경우 IRP_MJ_POWER 요청에 대한 DispatchPower 루틴을 페이징할 수 없어야 합니다.
기본적으로 커널 모드 드라이버에 대한 코드는 페이지할 수 없으며 커널 모드 드라이버에서 사용하는 전역 메모리도 페이지할 수 없습니다. 코드를 페이지 가능으로 만드는 방법에 대한 자세한 내용은 드라이버 코드 또는 데이터 페이지 가능 만들기를 참조하세요.