驱动程序是一个软件组件,允许作系统和设备通信。 例如,当应用需要从设备读取数据时,它会调用由作系统实现的函数。 然后,操作系统调用由驱动程序实现的函数。 驱动程序通常由设备制造商开发,知道如何与设备硬件通信以获取数据。 当驱动程序获取数据时,它会将其返回给作系统,然后将其返回给应用。
扩展定义
此说明简化了驱动程序的概念。 下面是一些需要考虑的要点:
设备制造商并不总是开发驱动程序。 如果设备遵循已发布的硬件标准,Microsoft可以编写驱动程序,因此设备设计器无需提供驱动程序。
并非所有驱动程序都直接与设备通信。 通常,在 驱动程序堆栈 中分层的多个驱动程序都参与了 I/O 请求。
可视化堆栈的传统方法是顶部的第一个参与者和底部的最后一个参与者,如下图所示。 堆栈中的某些驱动程序将请求从一种格式更改为另一种格式。 这些驱动程序不会直接与设备通信。 而是更改请求并将其传递给堆栈中较低层的驱动程序。
函数驱动程序:直接与设备通信的驱动程序称为 函数驱动程序。
筛选器驱动程序:执行辅助处理的驱动程序称为 筛选器驱动程序。
有关详细信息,请参阅 驱动程序堆栈。
某些筛选器驱动程序会观察和记录有关 I/O 请求的信息,但不参与这些请求。 例如,某些筛选器驱动程序充当验证程序,以确保堆栈中的其他驱动程序正确处理 I/O 请求。
为了优化定义,驱动程序是观察或参与作系统与设备之间的通信的任何软件组件。
软件驱动程序
此扩展的定义更准确,但仍不完整。 某些驱动程序根本不与任何硬件设备关联。
如果需要编写访问核心作系统数据结构的工具,可以将该工具拆分为两个组件。 第一个组件在用户模式下运行,并显示用户界面。 第二个组件在内核模式下运行,并访问核心作系统数据。 在用户模式下运行的组件称为 应用程序。 在内核模式下运行的组件称为 软件驱动程序。 软件驱动程序与硬件设备无关。
此图演示了与内核模式软件驱动程序通信的用户模式应用程序。
软件驱动程序始终在内核模式下运行。 它们主要写入以访问仅在内核模式下可用的受保护数据。 并非所有设备驱动程序都需要访问内核模式数据和资源,因此某些设备驱动程序在用户模式下运行。
有关处理器模式的详细信息,请参阅 用户模式和内核模式。
总线驱动程序
另一种类型的驱动程序是 总线驱动程序。 若要了解总线驱动程序,需要了解设备节点和设备树。
有关设备树、设备节点和总线驱动程序的信息,请参阅 设备节点和设备堆栈。
有关函数驱动程序的详细信息
截止目前,对函数驱动程序的解释过于简化。 到目前为止,解释指出功能驱动程序是直接与设备通信的驱动程序。 对于直接连接到外围组件互连(PCI)总线的设备,此语句是正确的。 PCI 设备的函数驱动程序获取映射到设备上的端口和内存资源的地址。 函数驱动程序通过写入这些地址直接与设备通信。
在许多情况下,设备不会直接连接到 PCI 总线。 相反,设备通过连接到 PCI 总线的主机总线适配器进行连接。 例如,USB 烤箱连接到主机总线适配器,称为 USB 主机控制器。 该控制器连接到 PCI 总线。 USB 烤箱具有函数驱动程序,USB 主机控制器也具有函数驱动程序。
烤箱的函数驱动程序通过向 USB 主机控制器的函数驱动程序发送请求间接与烤箱通信。 然后,USB 主机控制器的函数驱动程序直接与 USB 主机控制器硬件通信,该硬件与烤箱通信。