驱动程序线程上下文

分层驱动程序中处理 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操作和它们所服务设备的状态。