一. Windows NT 和 2000驱动程序的基本层次结构
- 目的:
明确从应用程序到驱动程序一层层的函数调用的实现方式
2. Windows体系结构:
体系结构中还有一个Pnp Manager(即插即用管理器):所有即插即用事件
PnP配置管理器为驱动程序将基本的系统资源分类为:I/O端口、内存地址、DMA通道和中断。
1) 检测到新设备,通知Pnp Manager
2) Pnp根据这个设备的INF文件查找到注册表和SYS文件
3) Pnp向设备栈(Device Stack中只有PDO) 发送IRPs,由总线驱动程序响应,获得设备信息,分配硬件资源;调用设备驱动程序中的DriverEntry和AddDevice函数(创建FDO);向设备发送IRP_MN_START_DEVICE请求.
4) Pnp还可以向设备发送其他即插即用请求,例如:
IRP_MN_QUERY_CAPABILITIES,
IRP_MN_QUERY_DEVICE_RELATIONS request for BusRelations(设备驱动程序返回子设备列表), and IRP_MN_REMOVE_DEVICE.
5) 支持网络连接设备.
I/O管理器
(1)、Windows的I/O管理结构灵活,它将磁盘I/O、网络I/O等抽象成IRP(I/O请求包)。所以I/O管理器是一个用于传递IRP的框架,通过IRP控制了所有I/O操作的处理过程(唯一的例外:快速I/O不使用IRP)
(2)、I/O管理器工作过程:
为每个I/O操作创建一个IRP
把IRP传递给正确的驱动程序
当I/O操作完成时删除IRP
(3)、驱动程序与I/O管理器的关系:
向I/O管理器登记必要的信息
接收IRP
执行IRP指定的操作
把IRP传回给I/O管理器,或者通过I/O管理器传递给另一个驱动程序以便进一步处理。
从图中,可以看出用户态应用程序使用Win32API函数向操作系统发出请求,通过win32子系统到达核心态的具体的系统服务中的I/O管理器,由I/O管理器将请求抽象成IRP (I/O Request Packet)传递给设备驱动程序进而控制硬件设备.如下图:
图表 1应用程序访问硬件流程
另外Windows的设备可以看做是一个文件来访问,即通过Win32API: ReadFile/WriteFile 即可读写设备(具体见)
Windows (自己的PCI总线驱动程序)为我们做的事:
1) 枚举总线上的所有设备.
2) 向OS报告总线上的动态事件.
3) 响应即插即用和电源管理.
4) 管理总线设备.
3. WDM驱动程序介绍
特点:
面向对象 每一个硬件都有一个DEVICE_OBJECT数据结构栈(PDO,FDO)描述硬件
分层 需要厂商开发的只是设备驱动程序.