Windows 驱动开发笔记(一)

Windows 驱动开发笔记(一)
Windows驱动开发较unix类的驱动开发要复杂一些。最近,在学windows开发。现在把学到的知识整理一下。做做笔记。
1. 我使用的资料:《深入解析windows操作系统》《Programming the microsoft windows Driver Model》《Windows 2000/xp WDM 设备 驱动开发》武安河著《Linux 驱动开发》
2. 开发环境VPC2004 、Windows2003、Windows DDK
首先是环境安装。资料很多自己做了。
在VPC中安装好windows2000。使用windbg作为调试工具。
环境安装完成后,就可以一边学习一边做试验了。我比较喜欢这种方式。
现在开始进入主题。
概念(一):系统模式和应用模式。
系统模式是指工作在一个管理级别的状态。这个状态具有没有约束的权利。所以这样的代码如果工作不正常就会给系统带来灾难!驱动程序通常工作在系统级。应用模式(或称用户模式)。这一模式受到操作系统的管理。一个应用程序崩溃通常不回给整个系统带来灾难。要正确理解模式的概念。我的经验是看一看unix原理的书。可以较好的理解这一含义。
概念(二):多任务。
Windows是一个多任务的操作系统。CPU的使用是影响系统性能的重要因素。任务之间要同时进行就必须要有很好的CPU调度策略。Windows的任务调度给驱动程序的编写带来了一些麻烦。一个驱动程序不能长时间的独占CPU时间。通常把驱动程序划分成可以被中断的和不可以被中断的。必须要独占CPU的就是不能被中断的。反之,是可被中断的。在WINDOWS的系统中通过中断级别(IRQL)来标记一段代码是否可以被中断。如果引入中断就有可能带来重入问题。这个问题会带来资源的调度问题。这个我不多说了。可以参考操作系统的书籍。
概念(三):驱动程序的调用。
驱动程序的代码是为应用服务的。所以,他的调用通常都是被动的。因为,你不知道用户什么时间使用哪个功能。所以,驱动程序的代码多数是些片段(通常就是完成某个功能的函数)。不象应用程序一样自己知道下一步该干啥了。就会没有整体感。只要,函数完成一个规定的功能就可以了。不用管他什么时间被调用。既然是被调用。就要让系统知道你的函数在哪里。这就需要告诉系统你的函数的指针。这就需要注册你的函数指针。怎么样注册呢?一种方法是写个固定名称的函数。就像C中的main一样。不能瞎起名字。第二种就是指针登记。这需要填写DriverObject这个数据结构的相应功能的项目。如:
DriverObject->MajorFunction[IRP_MJ_PNP]=CharSamplePnpDispatch;
这个代码就完成了CharSamplePnpDispatch这个函数的注册了。
概念(四):IRP
IRP是一个不好理解的概念。IRP就是I/O请求包的称为。I/O请求包是什么呢?上面说了驱动是一些等待被调用的独立函数。用户请求读一个设备时,通常需要多个步骤来完成。这就要有一个完成该功能的一个函数的调用列表。这个任务列表就是IRP结构的一部分内容。当用户发出一个请求时,系统就根据请求产生一个IRP。然或系统就依照这个IRP的指示去调用相应的函数功能。
概念(五):过滤驱动(过滤层、过滤函数)
Windows的WDM模型采用了分层的设计方法。这样的设计可以实现灵活的任务组织。上面说了驱动是一些等待被调用的独立功能函数。一段功能代码只完成有限的功能。在调用时在进行任务的组合。过滤函数是一些主要功能任务的补充功能。在一个主要功能前调用的是上层调用。在主要功能后调用的是下层调用。而且,可以是多层的。如我们写了一个读U盘的驱动。这个U盘有一个特殊的功能是对数据进行加密。我们就可以在读写物理设备前后加入一个过滤驱动完成这个操作。

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭