다음을 통해 공유


SCSI 포트에서 제공하는 기능

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

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

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

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

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

  • 디바이스가 너무 바빠서 처리할 수 없는 경우 IRP를 다시 시도합니다.

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

  • 요청에 대한 제한 시간 값 적용.

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

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

    • 버스 패리티 오류
    • 선택 시간 제한
  • 클래스 드라이버에 호스트 어댑터 제한 사항에 대한 정보를 제공합니다.

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

  • 버스 상대 주소를 논리 주소로 변환합니다.

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

  • 디바이스가 시작되기 전에 디바이스 및 모든 기본 디바이스의 전원이 켜지도록 합니다(D0 디바이스 전원 상태).

    디바이스 전원을 공급할 준비가 되지 않은 경우 SCSI 포트는 디바이스가 준비될 때까지 해당 디바이스에 대한 D0 요청을 큐에 대기합니다.

  • 클래스 드라이버의 비동기 요청을 큐에 대기하고 대상 디바이스에 동기적으로 전달합니다.

    클래스 드라이버는 다음 요청을 보내기 전에 요청이 완료되기를 기다릴 필요가 없습니다. SCSI 포트는 기본 하드웨어의 처리 능력을 압도하지 않도록 이러한 요청을 큐에 대기해야 하는 책임이 있다고 가정합니다.

  • 내부 I/O 요청 큐의 내부 및 외부 관리를 모두 지원합니다.

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

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

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

  • SCSI 포트 미니포트 드라이버는 여러 OS 종속 초기화 작업을 SCSI 포트의 ScsiPortInitialize 라이브러리 루틴에 위임할 수 있습니다. 이렇게 하면 SCSI 포트 미니포트 드라이버가 다양한 버전의 운영 체제에서 이식성이 높아집니다. SCSI 포트 미니포트 드라이버의 초기화 업무에 대한 설명은 SCSI 미니포트 드라이버의 DriverEntry 루틴을 참조하세요.

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

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

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

SCSI 포트가 SCSI 포트 미니포트 드라이버에 사용할 수 있도록 하는 라이브러리 루틴에 대한 요약은 SCSI 포트 드라이버 지원 루틴을 참조하세요.