随着USB系列、NDIS系列和WDM、WDF等框架的完成,整个开发算是已经完全讲解完了,下面就是整体的总结和一些问题的回答:
windows 驱动使用哪种开发框架
如果看windows 驱动开发的整个体系,就会发现它很复杂,也很容易让人迷惑,所以下面会讲解一下:
如果需要开发windows 设备驱动,那么首先需要解决的是开发环境,目前的主流平台是 Microsoft Visual Studio系列,它从2012版本开始就将驱动开发整合到IDE环境中了,所以用最好使用比较新的版本+WDK版本的集合:
VS版本下载: VS2022社区版
SDK版本下载: windows SDK
WDK下载: WDK
更为具体的安装和描述可以参考: MSDN: 驱动开发环境搭建
WDM和WDF是两套框架下的一套东西,WDM是整个windows 内核架构的基石,WDF则是利用这个基石封装的面向对象的开发框架,使用哪种开发框架本身不会影响驱动在内核中的实例化。
如果需要更细微的粒度控制可以选择WDM,但在工程师们不断地努力下,WDF的细节正在变得越来越丰富,故相对WDM大量的开发工作来说WDF更加合适。
驱动的调试技术
当Microsoft Visual Studio将WDK集成后,windbg也被集成到其中,故此时调试已经相对简单了,不过,调试部分后续还是单独做一个系列吧。
windows 驱动开发和设备驱动开发
很多人可能没有注意到,windows设备驱动开发和windows驱动开发并不是一回事,设备驱动更加偏向于外设,windows可能是目前支持外设最为广泛和灵活的操作系统之一,这得益于它强大的驱动程序框架,不但让驱动开发变得更加容易,还能方便的进行拓展。
将外设纳入硬件体系,这其实是Linux更加擅长的事情,但是Linux的开发难度和使用难度是一个巨大的门槛,而windows在更大时间和空间尺度上完美的解决了这个问题!2000系统支持的硬件到了win11仍然可以支持,时间可能已经过去了二十年,并在未来二十年内也是如此。
这得益于windows内核精巧的设计,win 10之后的内核是对NT内核的改写,相当于重新用新技术将内核编写了一次,但它在二进制上看起来和二十年前没什么不同,除了更高的并发数目、更大的内存使用、更快的运算。
所以在内核开发中,驱动开发和设备驱动开发完全是两个概念,非设备驱动程序是为软件使用的,而设备驱动则是为设备准备的,所以二者的侧重点是不一样的。
设备开发需要让设备的性能尽可能的发挥出来,而驱动则是泛指在内核中运行的任务,而后者更加接近操作系统的运行本质。
内核的两个主要功能: 充分发挥外设的性能和向应用层提供服务,例如一个U盘,它的性能就是USB设备驱动程序+USB总线驱动决定的,在windows 7上可能只能达到2.0的速度,但是同样的引荐下换成支持USB 3.0扩展驱动的软件,速度就能达到3.0的速度,硬件的设计会存在冗余和兼容的情况,此时软件系统优劣就是是否能将它的性能发挥出来。
计算机的性能和日常认知的不一样,例如,即使在xp的时候,PCIE也有5Gb/s的速度,内部总线的速度就更不用说了,DDR3-1600MHz意味着12GB/s,到PCI的时候降低一个数量级,到硬盘又降低一个数量级,已经是100MB/s了,到局域网也是这个速度。
在非设备的驱动程序中,目前最常见的就是杀毒软件,集中于文件、网络、硬盘这些模块,这其实并不奇怪,一般很少有需要程序员去处理内核本身的流程,那需要极其专业的人员才能胜任。
后续的创作
我其实没想到我可以完整的将这几个系列写完,它们的内容来源于MSDN和对英文原文的理解,但很多人看完估计很难知道怎么进行开发,于是后续我想着是两个方向。
第一个方向是对windows C++编程技术的讲解没这部分其实类似于基础知识吧。
另外一个则是对一些实际项目的分享。目前正在准备游戏辅助、USB驱动、网卡驱动三个系列的分享,另外还有一些自己的DIY的小硬件项目。
另外我会持续对这几个系列的文章进行校对和增删改。