驱动程序开发里的惑

1 篇文章 0 订阅

最近一段时间,接手一个小小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软连接指向我们真正的内核开发包路径

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值