本文来自微软,由本人兴趣爱好人工翻译(非机翻)
What is a driver? - Windows drivers | Microsoft Learn
我想很难给驱动这个词一个准确的定义.最基础的定义是驱动是一个用于让操作系统和硬件设备通信的软件组件.
举一个例子,假设一个应用程序需要从硬件设备读取一些数据,这个应用程序会调用一些由操作系统实现的Win32 api来完成这些事情,然后win32 api会调用由驱动实现的api来从真实的硬件设备读取数据.
由同一家设计和生产真实硬件设备的厂商写的驱动程序知道如何与自家生产的硬件设备通信来拿到数据.当驱动拿到数据后 他会返回数据给操作系统,然后操作系统会返回给应用程序
"驱动"这个词定义的扩展
我们目前对于驱动程序某些方面的解释实在是过于简单了,那些方面呢?
-
并不是所有的驱动都必须由生产真实设备的厂商所写
在多数情况下,设备都是要遵循已发布的硬件标准[1].因此,驱动可以由微软来写[2],设备生产商不是必须要提供他们硬件的驱动程序.
[1] [2]:比如最常见的一个显示器设备会有HDMI物理接口 那么他就需要遵守HDMI接口的标准协议,因此对于非生产硬件设备的微软来说 开发这些标准接口的设备的驱动是可行的
-
并不是所有的驱动程序都会直接与真实设备进行通信
对于一个发起的I/O请求(比如从某个真实硬件设备读取数据),通常会有驱动程序栈[3]中的多个驱动参与处理这个I/O请求的过程.对于驱动程序栈最简单的解释是一系列驱动程序的集合,有一个驱动在上层,而一些驱动则在下层,就如下图所示.驱动程序栈中的某些驱动有可能只是在这个过程中将I/O请求从一个格式转换为另一个格式.这些驱动程序并不会直接与真实硬件进行通信.他们只是对数据进行一些操作然后再把这些数据传递给更底层的驱动而已.
功能驱动(Function driver):在驱动程序栈中直接与设备进行通信的驱动我们称之为功能驱动(如上图中最底层的驱动所示)
过滤驱动(Filter driver):执行辅助处理的驱动我们称之为过滤驱动
-
有一些过滤驱动只是查看并记录这些I/O请求的相关信息并不会参与到这个处理过程中.举一个例子,一些过滤驱动只是在其中确保其他驱动能够正常的处理这些I/O请求,充当一个检验者.
基于以上几点,我们可以扩展我们对于驱动的定义,驱动只是在真实硬件和操作系统之间进行数据操作和数据过滤的一个组件.
软件驱动(software driver)
我们目前对于驱动的扩展定义已经足够合理且准确了,但是他仍然是不够完整的,因为有一些驱动完全和真实硬件设备没有任何一点关联(即发起一个I/O请求,他并不会参与到其中,而上文的过滤驱动是要参与到其中的).
举一个例子,假如你要写一个可以直接访问操作系统内核数据结构的小组件.这些内核数据结构只能被在内核运行的代码所访问(即用户模式的代码是无法访问这些内核数据结构的).你可以通过把这个小组件分成两个部分来完成功能.第一个部分运行在用户模式下并且提供用户接口,第二个部分运行在内核模式下并且拥有访问操作系统内核数据的权限.运行在用户模式下的那部分我们称之为应用(application),另一部分我们称之为软件驱动(software driver).
下图说明了两部分是如何通信的
软件驱动总是运行在内核模式中.写软件驱动的主要原因就是为了获取只能在内核模式下才能获取的操作系统收保护的数据.然而设备驱动(device driver)[即我们刚刚提到的功能驱动和过滤驱动]并不总是需要访问内核的数据和资源.所以一些设备驱动甚至是运行在用户模式下的.
总线驱动
还有一种驱动的种类我们目前还没有提到,那就是bus driver.为了理解bus driver.你需要理解设备节点和设备树.
关于设备树,设备节点,总线驱动的信息,请参见Device Nodes and Device Stacks.
功能驱动的更多信息
我们目前对于功能驱动的解释实在是过于简单.我们说过,功能驱动就是在驱动程序栈中直接与真实硬件通信的驱动.对于直接与PCI总线连接的设备来说是正确的.PCI设备的驱动有映射了真实设备的端口和存储资源的地址.这些功能驱动通过读写这些地址来直接与硬件设备通信.
然而大多数情况,真实设备并不会直接与PCI总线连接.相反,真实设备连接到连接在PCI总线的主机总线适配器上.举个例子,USB烤面包机[对没错,就是烤面包机,在美国那边烤面包机是用USB接口来连接的]连接到主机总线适配器上(称之为USB 主机控制器),而总线适配器由连接在PCI总线上.USB烤面包机有功能驱动,USB主机控制器也有功能驱动.烤面包机的功能驱动通过发送请求到USB主机控制器的功能驱动上来与烤面包机交流[这里的意思大概就相当于一类相同的接口的真实设备会被操作系统统一管理起来,然后你要与管理他们的USB主机控制器通信从而来跟你的真实设备通信].USB主机控制器的功能驱动接着会和与烤面包机通信的USB主机控制器硬件通信.
这一段话很绕,但是这里用白话文解释一下就是,如果不是与PCI总线直接相连的真实硬件,功能驱动并不会真正的与设备通信,而是与管理这一类接口(比如USB接口)的主机控制器通信,然后由主机控制器(软件)的功能驱动与主机控制器硬件(这是真实存在于现实的硬件)通信,最后再由主机控制器硬件与真实的USB通信.
非常绕,但是他这样设计必然有这样设计的原因,打个比方,现在由USB相连的设备太多了,所以统一管理会提高操作系统的性能.