加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 服务器 > 系统 > 正文

聊聊Windows 驱动开发,你会了吗?

发布时间:2021-11-24 14:41:04 所属栏目:系统 来源:互联网
导读:1. 前言 最近一段时间一直在研究windows 驱动开发,简单聊聊。 对比 linux,windows 驱动无论是市面上的书籍,视频还是社区,博文以及号主,写的人很少,导致学习曲线直线上升。 windows 驱动 从业 人员就更少了。 开发环境部署麻烦。 驱动安装发布麻烦,需
1. 前言
最近一段时间一直在研究windows 驱动开发,简单聊聊。
 
对比 linux,windows 驱动无论是市面上的书籍,视频还是社区,博文以及号主,写的人很少,导致学习曲线直线上升。
windows 驱动 从业 人员就更少了。
开发环境部署麻烦。
驱动安装发布麻烦,需要数字签名。如果是发布到windows update 库里面,还需要做微标认证。
为什么还要写?因为在学习的过程中,发现很多东西还是很相同的,如果你是从事linux 开发,可能会有些启发,如果是对windows 驱动开发有需求,可能提供一些不成熟的建议。
 
接下来开始正文,简单介绍下windows 驱动
 
2. windows 体系架构
2.1 操作系统与应用程序
在许多现代操作系统中,应用程序和操作系统是相互隔离的。操作系统的核心代码运行在特权模式下,即内核模式。而应用程序运行在非特权模式下,即用户模式。
 
操作系统和应用程序的关心类似于服务器和客户端的关系,这点在windows 平台下显得更加突出:
 
 
 
几个概念:
 
system 进程:windows 操作系统本身会起一个 system 进程(加载kernel32.dll),有点类似于 linux 下的 init进程,具体细节不展开。
FDO (Function Driver Object):设备功能驱动
FiDO (Filter Driver Object):过滤驱动
PDO (Physical Driver Object):物理设备驱动,真正访问硬件的地方。
IRP (I/O Request Packet),应用程序 想要访问内核数据,必须通过IRP 传递。又叫IRP请求,当应用程序和驱动交互时,发送一个IRP 请求,IRP 会在各层设备驱动之间来回传动与转发。
2.2 操作系统分层
 
 
windows 的设计思想是将内核设计的尽可能的小,并且采用“客户端-服务器”的结构。操作系统各个组件或者模块是通过消息进行通信的。
 
win32 子系统:是最纯正的windows 系统,其他子系统都是通过win32 子系统的接口来实现的,一般很少用到。
Natvie API :在win32 api 基础上加上Nt 前缀,基于版本兼容考虑
系统服务:Native API 从用户模式进入内核模式,调用系统服务。(软中断方式实现,陷入内核)
执行组件:内核模式下的一组服务函数。
对象管理程序:windows 操作系统提供的服务几乎都是以对象的形式存在的,这里的对象类似于面向对象语言中对象的概论。如驱动对象,设备对象等管理。
进程管理程序:负责创建和终止进程,线程调度是由内核负责的。进程管理程序依赖于其他执行组件。
虚拟内存管理程序:在CPU的内存管理单元(MMU)的协助下,通过某种映射将物理内存和虚拟内存关联起来。
I/O 管理器:负责发起I/O 请求,并管理请求。它由一系列内核模式下的例程所组成,这些例程为用户模式下的进程提供了统一接口。I/O 管理器的目标是使来自用户模式的I/O请求独立于设备。
配置管理程序:配置管理程序,记录所有计算机软,硬件的配置信息。它使用一个被称为注册表的数据库保存这些数据。设备驱动程序根据注册表中的信息进行加载
驱动程序:I/O 管理器接收应用程序后,创建相应的 IRP,并传送至驱动程序进行处理:
根据IRP的请求,直接操作硬件,然后完成此IRP,并返回
根据IRP的请求,转发到更底层的驱动中去,并等待底层驱动的返回。
接受到IRP驱动后,不着急于完成。而是分配新的IRP法定其他驱动程序,并等待返回。
内核:内核被认为是 Windows 操作系统的心脏。Windows 的内核从执行组件分割出来。和执行组件相比,内核是非常小的:
对内核对象的支持。
对线程的调度
对多处理器同步支持。
中断处理函数的支持。
对异常陷阱的支持。
对其他硬件特殊功能的支持。
硬件抽象层:不同的硬件平台,提供不同的硬件抽象层,并对上层提供统一的操作硬件的接口。
2.3 应用程序和驱动
 
 
 
3. windows 驱动框架
 
 
3.1 驱动模型:
windows 驱动大致分为这几类:
 
function driver:设备功能驱动
filter driver:设备辅助驱动
software driver:软件模块驱动
bus driver:总线设备驱动
3.2 驱动演变
 
 
NT 模型 :2000以前,不支持 PNP (即插即用设备)
WDM 模型:NT 基础上,支持 PNP
WDF:WDM的重封装
KMDF:内核模式(sys)
UMDF:用户模式(dll)
win7 x64 划时代操作系统,开始数字签名了
win10 :双认证签名,也就是说对驱动的安全性要求更高了。
3.3 驱动垂直层次结构
 
 
设备的创建顺序,先创建底层PDO,在创建高层的FDO,即从底层设备到高层设备。
在PDO 和 FDO之间可能有各种过滤驱动。每层设备对象由不同的驱动程序创建,或者说每层的设备对应着不同的驱动程序。
底层设备对象寻找上一层的设备对象,是依靠底层设备对象的AttachedDevice 来寻找的。
3.4 驱动水平层次结构
 
 
同一驱动程序创建出来的设备对象的关系称之为水平层次关系。
 
每一个设备通过NextDevice可以寻找水平层次的下一个设备对象。
 
3.5 一个复杂的驱动结构
 
 
4. windows 开发环境搭建
4.1 开发环境部署
以 win10 为例,列出需要安装的东西,详细过程限于篇幅以后更新
 
安装VS2019
安装 Windows SDK:VS 2019 顺带安装
安装 WDK
安装 VMware + Win10 虚拟系统
4.2 常用调试工具
windbg:调试内核。WDK 自带,配合串口或者网络调试windows 内核
DebugViewer:查看内核打印
driverMonitor:驱动安装
PCHunter_free:驱动强制卸载,不支持2004版本
devicetree:设备枚举
winobj:查看符号链接
5. windows 驱动学习建议
有关Windows 驱动开发书籍,博文,教程甚少。如果有这方面需求的可以给以下几个建议:
 
环境搭建:win7 32 + vs2013 即可。不建议 win10 + vs2019,比较新,遇到问题不好解决。其次早期的一些调试工具,win10 最新版本不一定支持。
绕开数字签名:先使用测试模式,安装驱动。否则光安装部署就够折腾的。
入门采用 WDM 驱动模型。市面上将WDM 的书籍和资料相对多些,相对来说,WDF 开发资料来不少。

(编辑:PHP编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读