Storport 提供的功能
Storport 驱动程序提供以下功能:
寻址
Microsoft Windows 支持包含不同类型的 I/O 总线和/或多个相同类型的 I/O 总线的系统。 需要一个常见的寻址方案来处理这种变体。
PCI 设备可以同时具有 I/O 端口和内存寄存器资源。 逻辑地址有助于使此区别对端口驱动程序透明。
某些系统包含连接到多个总线的 HBA;此类 HBA 可能需要几组地址转换。
需要逻辑地址才能在基于 CISC 的计算机和基于 RISC 的计算机之间实现可移植性。
重试和错误处理
当设备太忙而无法处理 IRP 时,存储类驱动程序不必实现重试 IRP 的算法。 Storport 驱动程序实现此功能。
类驱动程序为请求设置超时值,Storport 负责强制执行它。 但是,Storport 驱动程序可以灵活地强制实施类驱动程序的超时值,同时考虑总线的状态。 例如,如果 Storport 管理的光纤通道链接在 20 秒内断开,Storport 可能会在停机时间暂停超时计数器,因此,例如,时间超出 10 秒的请求在链接恢复后 10 秒后才会失败。 由于 I/O 流量增加,Storport 会增加分配给请求的超时值,因为 I/O 流量较重,设备需要更多时间来完成请求。
Storport 处理目标和控制器忙错误,以及传输错误条件 (换句话说,这些错误与总线) 上实际传输数据相关的错误。 例如:
- 总线奇偶校验错误
- 选择超时
配置、队列和电源状态管理
为类驱动程序提供有关主机适配器限制的信息:类驱动程序负责调整数据传输大小,以满足主机总线适配器 (HBA) 的限制。 但是,Storport 为类驱动程序提供完成此任务所需的信息。 Storport 在适配器描述符 (STORAGE_ADAPTER_DESCRIPTOR) 中提供此信息,以响应 IOCTL 请求 (IOCTL_STORAGE_QUERY_PROPERTY) 。 类驱动程序负责根据此描述符中报告的信息将请求分解为适当大小的区块。
将总线相对地址转换为逻辑地址:查询时,适配器为 I/O 端口、命令寄存器和控制状态寄存器提供总线相对地址。 但是,微型端口驱动程序不能使用相对于总线的地址与其主机总线适配器 (HBA) 通信。 Storport 将相对于总线的地址转换为逻辑地址,以便微型端口驱动程序能够以透明方式访问总线地址。 原因包括:
在启动设备之前,确保设备及其所有基础设备在 D0 设备电源状态) (通电:当设备尚未准备好通电时,Storport 将针对该设备的 D0 请求排队,直到设备准备就绪。
对来自类驱动程序的异步请求进行排队,并将其异步转发到目标设备:类驱动程序不必等待请求完成,再发送下一个请求。 Storport 负责对这些请求进行排队,以避免基础硬件的处理能力过大。
支持内部 I/O 请求队列的内部和外部管理:大多数队列管理操作由 Storport 本身启动。 例如,Storport 会在发生错误时冻结其队列,并将错误条件报告给类驱动程序,以便类驱动程序可以在处理进一步请求之前做出响应。 但是,Storport 还会响应来自类驱动程序或其他更高级别驱动程序的请求,以锁定、解锁、冻结或取消冻结其内部请求队列。 更高级别的驱动程序可以使用SRB_FUNCTION_RELEASE_QUEUE请求强制 Storport 取消冻结其内部队列。 有关“冻结”、“锁定”或“解锁”队列的含义的说明,请参阅 Storport 队列管理。
将设备报告的错误转换为 SCSI-3 感知数据格式,供类驱动程序处理。
Storport 通过 Storport 库例程为微型端口驱动程序提供服务。 微型端口驱动程序编写器可以调用这些例程,而不是将它们提供的功能编码为单个整体端口驱动程序。 使用这些例程提供的一些最重要的服务如下所示:
Storport 微型端口驱动程序可以将许多依赖于 OS 的初始化操作委托给 Storport 的 StorPortInitialize 库例程。 例如,Storport 驱动程序处理与 PnP 和 DMA 映射相关的详细信息。 这减少了 Storport 微型端口驱动程序需要完成的工作量。 有关 Storport 微型端口驱动程序初始化职责的说明,请参阅 使用 Storport 进行硬件初始化。
非 PnP 设备的 Storport 微型端口驱动程序可以免除查找适配器并将其资源报告给 PnP 管理器的任务。 此操作在 StorPortInitialize 中完成。
Storport 微型端口驱动程序不会初始化驱动程序对象中的调度入口点。 当微型端口驱动程序调用 StorPortInitialize 时,Storport 驱动程序代表微型端口驱动程序执行此操作。
Storport 微型端口驱动程序不会使用 HalTranslateBusAddress 将总线相对地址转换为逻辑地址。 Storport 微型端口驱动程序通过调用 StorPortGetDeviceBase 来执行此操作。
有关 Storport 提供给 Storport 微型端口驱动程序的库例程的完整列表,请参阅 Storport 驱动程序支持例程。