一、前言
只是为了总结下关于设备栈与设备链的知识,自己写一下,就当是为了梳理和查漏,有些还理解的不是很深刻。如果有错误的地方恳请各位斧正。
用到的工具:
DeviceTree
二、流程与结构梳理
我们以网卡来举例:
1、一块新的网卡插入 PC,这时 PCI 总线检测到后会创建这块网卡的物理设备对象,有可能一些系统或其他驱动提供的过滤驱动设备对象会先附加到物理设备对象上
2、安装驱动,I/O 管理器会为该网卡的驱动程序创建一个对应的驱动对象(DRIVER_OBJECT)
3、System 进程会调用驱动程序中的DriverEntry并将驱动对象作为参数传入,由DriverEntry来负责对驱动对象进行初始化。
5、初始化完毕后,会调用指定的AddDevice例程来添加设备,AddDevice主要负责创建功能设备对象并将其附加到其物理设备所在的设备栈上,而且驱动对象的的DeviceObject成员会指向该功能设备对象
6、功能设备对象处于设备栈的栈顶位置,这时可能会有其他驱动程序提供的过滤驱动设备对象附加到功能设备对象上
7、用户开始上网,用户应用访问网卡的 API 会创建 IRP 请求由 I/O 管理器将其送到该网卡的设备栈并从栈顶向栈底传递,栈中的某一层驱动完成请求并返回
8、又一块一模一样的网卡插入 PC,同步骤 1
9、由于系统以安装过驱动程序,这时会直接调用 AddDevice 来创建并添加功能设备对象,第一块网卡的功能设备对象的NextDevice成员会指向这个新的功能设备对象
10、当卸载设备时,RemoveDevice例程要先将其功能设备对象从栈上脱离,然后再删除
流程图如下:
(过滤驱动程序的驱动对象就不在图中表现出来了,大家知道有就行)
纵向就是设备栈,横向就是设备链
三、查看设备对象
这里我们用 DeivceTree 查看一下设备对象,红色的功能设备对象,附加在物理设备对象上。蓝色的上层过滤设备对象,附加在功能设备对象上。
如果创建多个设备,会在驱动对象下继续增加的(图片上失误了,由于当时写的时候没有考虑展示横向,只创建了一个设备,所以在此说明)
四、小结
在刚开始学习驱动时,头脑中一定要先建立起设备栈的概念,只有先把整体脉络搞清楚,再去研究细节才能事半功倍,毕竟如果在研究细节到兴头上时还要回头补课,那可真有点伤积极性。那就先这样啦,Happy Coding~^_^