Storport에서 제공하는 기능

Storport 드라이버는 다음과 같은 기능을 제공합니다.

  • 주소 지정

    Microsoft Windows는 다양한 유형의 I/O 버스 및/또는 동일한 유형의 여러 I/O 버스를 포함하는 시스템을 지원합니다. 이 다양성을 처리하려면 일반적인 주소 지정 체계가 필요합니다.

    PCI 디바이스에는 I/O 포트와 메모리 레지스터 리소스가 모두 있을 수 있습니다. 논리적 주소는 포트 드라이버에 이러한 구분을 투명하게 만드는 데 도움이 됩니다.

    일부 시스템에는 둘 이상의 버스에 연결된 HBA가 포함되어 있습니다. 이러한 HBA에는 여러 주소 변환 집합이 필요할 수 있습니다.

    논리적 주소는 CISC 기반 및 RISC 기반 컴퓨터에서 이식성을 위해 필요합니다.

  • 다시 시도 및 오류 처리

    • 스토리지 클래스 드라이버는 디바이스가 너무 바빠서 처리할 수 없을 때 IRP를 다시 시도하기 위한 알고리즘을 구현할 필요가 없습니다. Storport 드라이버는 이 기능을 구현합니다.

    • 클래스 드라이버는 요청에 대한 제한 시간 값을 설정하고 Storport는 이를 적용합니다. 그러나 Storport 드라이버는 클래스 드라이버의 제한 시간 값을 유연하게 적용하여 버스 상태를 고려할 수 있습니다. 예를 들어 Storport에서 관리하는 파이버 채널 링크가 20초 동안 삭제되는 경우 Storport는 가동 중지 시간 동안 시간 제한 카운터를 일시 중단하여 instance 경우 링크가 백업된 후 10초까지 시간이 초과된 요청이 실패하지 않을 수 있습니다. Storport는 I/O 트래픽 증가에 대응하여 요청에 할당된 제한 시간 값을 증가합니다. I/O 트래픽이 많을수록 디바이스에서 요청을 완료하는 데 더 많은 시간이 필요하기 때문입니다.

    • Storport는 대상 및 컨트롤러 사용 중 오류뿐만 아니라 전송 오류 조건(즉, 버스의 실제 데이터 전송과 관련된 오류)을 처리합니다. 예:

      • 버스 패리티 오류
      • 선택 시간 제한
  • 구성, 큐 및 전원 상태 관리

    • 클래스 드라이버에 호스트 어댑터 제한 사항에 대한 정보 제공: HBA(호스트 버스 어댑터)의 제한에 맞게 데이터 전송 크기를 조절하는 것은 클래스 드라이버의 책임입니다. 그러나 Storport는 클래스 드라이버에 이 작업을 수행하는 데 필요한 정보를 제공합니다. Storport는 IOCTL 요청(IOCTL_STORAGE_QUERY_PROPERTY)에 대한 응답으로 이 정보를 댑터 설명자(STORAGE_ADAPTER_DESCRIPTOR)에 제공합니다. 클래스 드라이버는 이 설명자에 보고된 정보에 따라 요청을 적절한 크기의 청크로 분할할 책임이 있습니다.

    • 버스 상대 주소를 논리 주소로 변환: 쿼리할 때 어댑터는 I/O 포트, 명령 레지스터 및 제어 상태 레지스터에 대한 버스 상대 주소를 제공합니다. 그러나 미니포트 드라이버는 버스 상대 주소를 사용하여 HBA(호스트 버스 어댑터)와 통신할 수 없습니다. Storport는 버스 상대 주소를 논리적 주소로 변환하므로 미니포트 드라이버는 투명한 방식으로 버스 주소에 액세스할 수 있습니다. 이는 다음과 같은 여러 가지 원인 때문일 수 있습니다.

    • 디바이스를 시작하기 전에 디바이스 및 모든 기본 디바이스의 전원이 켜지도록 합니다(D0 디바이스 전원 상태). 디바이스 전원을 공급할 준비가 되지 않은 경우 Storport는 디바이스가 준비될 때까지 해당 디바이스에 대한 D0 요청을 큐에 대기합니다.

    • 클래스 드라이버의 비동기 요청을 큐에 대기하고 대상 디바이스에 비동기적으로 전달: 클래스 드라이버는 다음 요청을 보내기 전에 요청이 완료되기를 기다릴 필요가 없습니다. Storport는 기본 하드웨어의 처리 능력을 압도하지 않도록 이러한 요청을 큐에 대기해야 하는 책임이 있다고 가정합니다.

    • 내부 I/O 요청 큐의 내부 및 외부 관리 지원: 대부분의 큐 관리 작업은 Storport 자체에서 시작됩니다. instance 경우 Storport는 오류가 발생할 때 큐를 중지하고 클래스 드라이버에 오류 조건을 보고하므로 추가 요청이 처리되기 전에 클래스 드라이버가 응답할 수 있습니다. 그러나 Storport는 클래스 드라이버 또는 기타 상위 수준 드라이버의 요청에 응답하여 내부 요청 큐를 잠그거나 잠금 해제하거나 동결하거나 고정 해제합니다. 상위 수준 드라이버는 Storport가 SRB_FUNCTION_RELEASE_QUEUE 요청을 사용하여 내부 큐의 고정을 해제하도록 강제할 수 있습니다. 큐를 "고정", "잠금" 또는 "잠금 해제"하는 것이 무엇을 의미하는지에 대한 설명은 Storport 큐 관리를 참조하세요.

    • 클래스 드라이버에서 처리하기 위해 디바이스에서 보고하는 오류를 SCSI-3 센스 데이터 형식으로 변환합니다.

Storport는 Storport 라이브러리 루틴을 통해 미니포트 드라이버에 서비스를 제공합니다. 미니포트 드라이버 작성기는 단일 모놀리식 포트 드라이버에 제공하는 기능을 코딩하는 대신 이러한 루틴을 호출할 수 있습니다. 이러한 루틴을 사용하여 제공되는 가장 중요한 서비스 중 일부는 다음과 같습니다.

  • Storport 미니포트 드라이버는 많은 OS 종속 초기화 작업을 Storport의 StorPortInitialize 라이브러리 루틴에 위임할 수 있습니다. 예를 들어 Storport 드라이버는 PnP 및 DMA 매핑과 관련된 세부 정보를 처리합니다. 이렇게 하면 Storport 미니포트 드라이버에서 수행해야 하는 작업의 양이 줄어듭니다. Storport 미니포트 드라이버의 초기화 업무에 대한 설명은 Storport를 사용한 하드웨어 초기화를 참조하세요.

  • PnP가 아닌 디바이스용 Storport 미니포트 드라이버는 어댑터를 찾고 해당 리소스를 PnP 관리자에게 보고하는 작업을 절약합니다. StorPortInitialize에서 수행됩니다.

  • Storport 미니포트 드라이버는 드라이버 개체에서 디스패치 진입점을 초기화하지 않습니다. Storport 드라이버는 미니포트 드라이버가 StorPortInitialize를 호출할 때 미니포트 드라이버를 대신하여 이 작업을 수행합니다.

  • Storport 미니포트 드라이버는 HalTranslateBusAddress를 사용하여 버스 상대 주소를 논리 주소로 변환하지 않습니다. Storport 미니포트 드라이버는 StorPortGetDeviceBase를 호출하여 이 작업을 수행합니다.

Storport가 Storport 미니포트 드라이버에 사용할 수 있도록 하는 라이브러리 루틴의 전체 목록은 Storport 드라이버 지원 루틴을 참조하세요.