控制器对象简介
顾名思义,控制器对象通常表示具有附加设备的物理设备控制器。 由物理控制器协调的一组类似设备的最低级别非 WDM 驱动程序可以创建控制器对象,并使用它来同步附加设备之间的 I/O 操作。 驱动程序实现 ControllerControl 例程并调用 I/O 管理器的控制器对象支持例程。
注意
WDM 驱动程序不支持使用控制器对象。
通常,如果满足以下条件,驱动程序将使用控制器对象将操作同步到附加设备:
控制器不会在不中断的情况下执行长时间操作,因此驱动程序不需要创建设备专用线程或使用系统工作线程。
连接到控制器的设备类似。 也就是说,它们不是具有完全不同的物理属性或操作功能的设备,例如可以连接到键盘和辅助设备控制器的键盘和鼠标设备。
驱动程序设计为整体:相对于设备控制器和附加的物理设备进行单层分层,而不是设计为控制器) 的端口驱动程序 (,其中一个或多个类驱动程序 () 在端口驱动程序上分层的附加设备。
具有 I/O 通道和一组逻辑设备对象的设备的驱动程序也可能使用控制器对象在此类设备的通道之间或之间同步其 I/O 操作。
控制器对象没有名称,因此不是 I/O 请求的目标。 它只是一种同步机制,用于从一组设备对象序列化 I/O。 由于控制器对象没有名称,因此它对用户模式保护的子系统不可见,这些子系统在未获取表示目标设备对象的文件对象的句柄的情况下无法发出设备 I/O 请求。 控制器对象也对更高级别的驱动程序不可见,后者无法将自己的设备对象附加到控制器对象。 换句话说,I/O 管理器和更高级别的驱动程序都不能在控制器对象表示的设备上设置请求 I/O 的 IRP。 I/O 请求始终颁发给设备对象。 只有驱动程序可以使用控制器对象。
同步和重叠 I/O
具有“AT”磁盘控制器等功能的物理设备的整体驱动程序不需要使用控制器对象来同步其设备 I/O 操作。 例如,驱动程序编写器可以尝试以下同步技术,而不是使用控制器对象:
设置命名设备对象以表示 I/O 请求的目标设备。
维护状态信息 (每个设备扩展或单个设备扩展中的一组设备忙标志,) 指示哪个设备对象是当前 I/O 操作的目标。
对当前繁忙的设备对象执行 I/O 操作,并为其他设备对象重新排队传入的 IRP,直到当前 IRP 完成。
上述同步技术序列化驱动程序的所有目标设备对象的 IRP 处理。 请注意,它还会强制驱动程序在 StartIo 例程开始处理下一个 IRP 之前完成当前 IRP,这很遗憾会降低驱动程序的性能。
如果某些设备操作可以重叠,则使用控制器对象会增加驱动程序的 I/O 吞吐量,因为此同步技术允许驱动程序在设置物理设备之前确定它是否可以重叠操作。 例如,磁盘控制器可能允许驱动程序在另一个磁盘上进行读/写操作来重叠一个磁盘上的查找。
此外,使用控制器对象是一种相对简单的方法,用于通过单个物理设备(例如“AT”磁盘控制器)同步多个目标设备对象的 I/O 操作。 使用控制器对象可让整体驱动程序跨一组命名设备对象同步 I/O 操作,而无需在一个或多个设备扩展中维护每个设备和设备控制器的状态,也无需重新排队 IRP。
但是,某些设计为重叠 I/O 操作的设备(例如全双工串行控制器或总线主适配器)通常具有为 IRP 设置内部队列的驱动程序。