最近一段时间,接手一个小小window外设的驱动开发项目。
难度不大,对于新手来说,处处是坑。
看了一些书,最终是解决了问题,也是得到一些收获
这里分享给大家。如果能给一些人提供帮助,也真的很开心。
这里开个题,这几天有空会一直补充。
------------------------------------------------------------------------------------------------------------------------------------------------
首先了解框架,对于我是比较蒙蔽的。资料太多,反而无法选择。
不管wdm还是wdk都是有资料的,大概window7算是一个节点吧。
对于咱们新手来说,直接选择wdk,它分为kmdf和umdf两种框架。相比wdm来说,新框架自然简单一些。按照官方的kmdf升级版本,xp选择1.9以下,win7选择1.11以下。
vendor id和produce id是用于与硬件关联,INF文件会有配置节点。像我的项目里,不需要这俩id,我已知外设物理地址,配置好Bios,直接读取物理地址,大概因为无配置寄存器,系统也不会通知系统没有安装此硬件驱动。
针对硬件开发的驱动来说(按照相关标准开发的硬件),硬件插入pc后,会有EvtDevicePrepareHardware例程被调用,系统会通知关于此硬件的信息,根据外设不同类型,做不同功能。
配置bios,物理上能够读写到实际外设物理空间,然后映射到内存地址。cpu才会读写挂载的外设。
-----------------------------------------------------------------------------------------------------------------------------------------------------------
对于winio的使用
1,开始在xp调试,驱动不容易安装,就使用了winio2版本。直接c语言,按照头文件的名字,两个接口就能直接读到物理地址,且物理地址线性映射到用户空间,对于应用,仅仅是你应用虚拟空间的一段地址了。
2,win7系统,winio2就不能使用。由两种方案,一是开发一套驱动,读写都从驱动的虚拟空间将数据复制出来。二采用winio3版本。为了俩系统都兼容一套代码。使用winio3.
按照说明,
开始写法,.pvPhysAddress = ((DWORD64)0xd2000<<32) +0 ;
得到的数据总是错误,百思不得其解。
后来看源码,发现作者用的pvPhysAddress = (DWORD64)0xd2000写法
改了就好了。
在一个系统上测试winio2和winio3,一定要调用卸载函数。对于俩版本驱动的绑定字符链接名一样的。
InitializeWinIo函数是使用连接命打开驱动的,然后你会发现初始化总会失败。
对于如何把物理地址直接映射到用户态的驱动代码,以后再研究下
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------linux 系统平台-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
linux平台的驱动写法比较统一,坑的地方在于内核。
既有的平台,如果没有对应的内核开发包,那是很痛苦的
Linux平台编译,有两个文件夹:
1,内核开发包的路径: /usr/src/kernels
2,直接查找的内核路径:/lib/modules/$(shell uname -r)/build
makefile中,内核路径下用第二个,将build软连接指向我们真正的内核开发包路径