驱动程序线程上下文

在分层驱动程序中处理 IRP 图中所示,文件系统由两部分构成的驱动程序:

  1. 文件系统驱动程序 (FSD) ,它在调用 I/O 系统服务的用户模式线程的上下文中执行

    I/O 管理器将相应的 IRP 发送到 FSD。 如果 FSD 为 IRP 设置完成例程,则不一定在原始用户模式线程的上下文中调用其完成例程。

  2. 一组文件系统线程,可能还有 一个 FSP (文件系统进程)

    FSD 可以创建一组专用于驱动程序的系统线程,但大多数 FSD 使用系统工作线程来完成工作,而无需连接发出 I/O 请求的用户模式线程。 任何 FSD 都可能设置自己的进程地址空间,在其中执行其驱动程序专用线程,但系统提供的 FSD 会避免这种做法来节省系统内存。

文件系统通常使用系统工作线程来设置和管理它们发送给一个或多个较低级别驱动程序的 IRP 的内部工作队列,这些工作队列可能适用于不同的设备。

尽管分层驱动程序中的 处理 IRP 图中显示的最低级别驱动程序通过一组离散的驱动程序提供的例程分阶段处理每个 IRP,但它不会像文件系统那样使用系统线程。 最低级别驱动程序不需要自己的线程上下文,除非为其设备设置 I/O 是一个旷日持久的过程,对系统性能有明显影响。 很少有最低级别或中间级驱动程序需要设置自己的驱动程序专用或设备专用系统线程,而那些确实会因上下文切换到其线程而导致性能损失的驱动程序。

大多数内核模式驱动程序(如分层驱动程序中 处理 IRP 图中的 物理设备驱动程序)在任意线程上下文中执行:调用任何线程来处理 IRP 时,任何线程的上下文恰好都是最新的。 因此,驱动程序通常在其设备对象的驱动程序定义部分(称为设备扩展)中维护其 I/O 操作及其服务 的设备的状态。