SCSI 端口提供的功能

SCSI 端口驱动程序提供以下功能:

  • Microsoft Windows 支持包含不同类型的 I/O 总线和/或多个相同类型的 I/O 总线的系统。 需要一个常见的寻址方案来处理这种变体。

  • PCI 设备可以同时具有 I/O 端口和内存寄存器资源。 逻辑地址有助于使此区别对端口驱动程序透明。

  • 某些系统包含连接到多个总线的 HBA;此类 HBA 可能需要几组地址转换。

  • 需要逻辑地址才能在基于 CISC 的计算机和基于 RISC 的计算机之间实现可移植性。

  • 当设备太忙而无法处理 IRP 时重试 IRP。

    当设备太忙而无法处理 IRP 时,存储类驱动程序不必实现重试 IRP 的算法。 SCSI 端口驱动程序实现此功能。

  • 为请求强制实施超时值。

    类驱动程序为请求设置超时值,SCSI 端口负责强制执行它。 但是,SCSI 端口驱动程序可以灵活地强制实施类驱动程序的超时值,同时考虑总线的状态。 例如,如果由 SCSI 端口管理的光纤通道链路下降 20 秒,则 SCSI 端口可能会在停机时间暂停超时计数器,因此,例如,时间超出 10 秒的请求在链路恢复后 10 秒后才会失败。 SCSI 端口会增加分配给请求的超时值,以响应 I/O 流量的增加,因为 I/O 流量较重,设备将需要更多时间来完成请求。

  • 处理目标错误和控制器忙错误以及传输错误条件 (换句话说,这些错误与总线上实际传输数据相关的错误) 。 例如:

    • 总线奇偶校验错误
    • 选择超时
  • 为类驱动程序提供有关主机适配器限制的信息。

    类驱动程序负责调节数据传输的大小,以满足主机总线适配器 (HBA) 的限制。 但是,SCSI 端口为类驱动程序提供完成此任务所需的信息。 SCSI 端口在适配器描述符中提供此信息, (STORAGE_ADAPTER_DESCRIPTOR) ,以响应 IOCTL_STORAGE_QUERY_PROPERTY IOCTL 请求。 类驱动程序负责根据此描述符中报告的信息将请求分解为适当大小的区块。

  • 将总线相对地址转换为逻辑地址。

    查询时,适配器为 I/O 端口、命令寄存器和控制状态寄存器提供总线相对地址。 但是,微型端口驱动程序不能使用相对于总线的地址与其主机总线适配器 (HBA) 通信。 SCSI 端口将总线相对地址转换为逻辑地址,以便微型端口驱动程序能够以透明方式访问总线地址。 原因包括:

  • 在启动设备之前,确保设备及其所有基础设备在 D0 设备电源状态) (启动。

    当设备尚未准备好通电时,SCSI 端口会将该设备的 D0 请求排队,直到设备准备就绪。

  • 对来自类驱动程序的异步请求进行排队,并将其同步转发到目标设备。

    类驱动程序无需等待请求完成,再发送下一个请求。 SCSI 端口负责对这些请求进行排队,以避免基础硬件的处理能力过大。

  • 支持对内部 I/O 请求队列进行内部和外部管理。

    大多数队列管理操作由 SCSI 端口本身启动。 例如,发生错误时,SCSI 端口会冻结其队列,并将错误条件报告给类驱动程序,以便类驱动程序可以在处理进一步请求之前做出响应。 但是,SCSI 端口还会响应来自类驱动程序或其他更高级别驱动程序的请求,以锁定、解锁、冻结或取消冻结其内部请求队列。 更高级别的驱动程序可以使用SRB_FUNCTION_RELEASE_QUEUE请求强制 SCSI 端口取消冻结其内部队列。 有关“冻结”、“锁定”或“解锁”队列的含义的说明,请参阅 SCSI 端口驱动程序的队列管理

  • 将设备报告的错误转换为 SCSI-2 感知数据格式,供类驱动程序处理。

SCSI 端口通过 SCSI 端口库例程向微型端口驱动程序提供服务。 微型端口驱动程序编写器可以调用这些例程,而不是将它们提供的功能编码为单个整体端口驱动程序。 使用这些例程提供的一些最重要的服务如下所示:

  • SCSI 端口微型端口驱动程序可以将许多依赖于 OS 的初始化操作委托给 SCSI 端口的 ScsiPortInitialize 库例程。 这使得 SCSI 端口微型端口驱动程序在不同版本的操作系统中更易于移植。 有关 SCSI 端口微型端口驱动程序初始化职责的说明,请参阅 SCSI 微型端口驱动程序的 DriverEntry 例程

  • 非 PnP 设备的 SCSI 端口微型端口驱动程序可以免除查找适配器并将其资源报告给 PnP 管理器的任务。 这在 ScsiPortInitialize 中完成。

  • SCSI 端口微型端口驱动程序不会初始化驱动程序对象中的调度入口点。 当微型端口驱动程序调用 ScsiPortInitialize 时,SCSI 端口驱动程序代表微型端口驱动程序执行此操作。

  • SCSI 端口微型端口驱动程序不会使用 HalTranslateBusAddress 将总线相对地址转换为逻辑地址。 SCSI 端口微型端口驱动程序通过调用 ScsiPortGetDeviceBase 来执行此操作。

有关 SCSI 端口提供给 SCSI 端口微型端口驱动程序的库例程的摘要,请参阅 SCSI 端口驱动程序支持例程