다음을 통해 공유


StartIo 루틴에 대해 고려해야 할 사항

StartIo 루틴을 구현할 때 다음 사항에 유의하세요.

  • StartIo 루틴은 물리적 디바이스 및 드라이버가 디바이스 확장에서 유지 관리하는 공유 상태 정보 또는 리소스에 대한 액세스를 동일한 디바이스, 메모리 위치 또는 리소스에 액세스하는 드라이버의 다른 루틴과 동기화해야 합니다.

    StartIo 루틴이 디바이스 또는 상태를 ISR과 공유하는 경우 KeSynchronizeExecution을 사용하여 드라이버 제공 SynchCritSection 루틴을 호출하여 디바이스를 프로그래밍하거나 공유 상태에 액세스해야 합니다. 자세한 내용은 중요 섹션 사용을 참조하세요.

    StartIo 루틴이 ISR 이외의 루틴과 상태 또는 리소스를 공유하는 경우 드라이버가 스토리지를 제공하는 드라이버 초기화된 임원 스핀 잠금을 사용하여 공유 상태 또는 리소스를 보호해야 합니다. 자세한 내용은 스핀 잠금을 참조하세요.

  • 모놀리식 비 WDM 디바이스 드라이버가 컨트롤러 개체를 설정하는 경우 StartIo 루틴은 컨트롤러 개체를 사용하여 연결된(유사한) 디바이스가 있는 공유 물리적 디바이스를 통해 작업을 동기화할 수 있습니다.

    자세한 내용은 컨트롤러 개체 를 참조하세요.

  • 긴밀하게 결합된 상위 수준 드라이버가 기본 디바이스 드라이버에 대한 큰 DMA 전송 요청을 미리 표시하지 않는 한 기본 디바이스 드라이버의 StartIo 루틴은 큰 전송 요청을 부분 전송 범위로 분할해야 하며 드라이버는 일련의 부분 전송 디바이스 작업을 수행해야 합니다. 각 부분 전송은 하드웨어의 기능에 맞게 크기가 조정되어야 합니다. 즉, 드라이버 디바이스의 기능 또는 종속 DMA 디바이스의 경우 시스템 DMA 컨트롤러의 기능 중 더 엄격한 제약 조건이 있습니다.

    시스템 또는 버스 master DMA 사용에 대한 자세한 내용은 어댑터 개체 및 DMA를 참조하세요.

  • DMA를 사용하는 드라이버의 StartIo 루틴은 어댑터 개체를 사용하여 전송을 동기화해야 합니다.

  • StartIo 루틴은 IRQL = DISPATCH_LEVEL 실행되어 호출할 수 있는 지원 루틴 집합을 제한합니다.

    예를 들어 StartIo 루틴은 페이저블 메모리에 액세스하거나 할당할 수 없으며 디스패처 개체가 신호 상태로 설정될 때까지 기다릴 수 없습니다. 반면 StartIo 루틴은 KeAcquireSpinLock 및 KeReleaseSpinLock 및 KeReleaseSpinLock보다 빠르게 실행되는 KeAcquireSpinLockAtDpcLevelKeReleaseSpinLevel 사용하여 드라이버 할당 임원 스핀 잠금을 획득하고 해제할 수 있습니다.

    자세한 내용은 하드웨어 우선 순위스핀 잠금 관리를 참조하세요.

  • 드라이버가 취소 가능한 상태로 IRP를 보유하는 경우 해당 StartIo 루틴은 디바이스에서 해당 요청에 대한 처리를 시작하기 전에 입력 IRP가 이미 취소되었는지 여부를 검사 합니다. 자세한 내용은 IRP 취소를 참조하세요.