Windows2000设备驱动程序的研制开发(1)(2)
2014-01-07 01:15
导读:驱动程序由一系列相对独立的函数组成,由I/O管理器根据需要调用这些函数,对于一个需要处理中断的最简单的驱动程序也需要由以下几个函数构成: 1
驱动程序由一系列相对独立的函数组成,由I/O管理器根据需要调用这些函数,对于一个需要处理中断的最简单的驱动程序也需要由以下几个函数构成:
1.DriverEntry() 运行于PASSIVE_LEVEL
驱动程序入口点,当驱动程序被手动或自动装入系统后,驱动程序从这点开始执行,主要用于定位硬件资源,建立指向其它驱动程序函数的指针等其它初始化工作。
2.XxUnload() 运行于PASSIVE_LEVEL
用于驱动程序从系统卸出之前,释放由驱动程序占用的所有系统资源。
3.XxIsr() 运行于DIRQL
中断服务程序。
4.XxDpcForIsr() 运行于DISPATCH_LEVEL
中断服务程序后处理程序,以排队方执行不太关键代码的执行,由于排队机制及优先级,不会造成代码拥塞从而提高中断服务程序的响应并且提高系统总体I/O吞吐率。
5.XxOpen() 运行于PASSIVE_LEVEL
处理应用程序Win32函数CreateFile()请求。
6.XxClose() 运行于PASSIVE_LEVEL
处理应用程序Win32函数CloseHandle()请求。
7.XxDispatch() 运行于PASSIVE_LEVEL
处理应用程序Win32函数DeviceIoControl()请求,通过一系列自定义命令,驱动程序与应用程序交换特定的信息。
WindowsNT使用一个抽象化的CPU优先级方案, IRQL代表中断请求级,任一时刻CPU总处在某一级上,这个数越大,表示当前的任务重要性越大,如表2-1所示,从上至下IRQL越来越小。所有上述驱动程序的函数及内核模式函数都必须运行于各自的IRQL级上,如果违反这一调用规定,会造成系统崩溃。例如,中断服务程序(XxIsr)运行于DIRQL及上,那幺在编写中断服务程序时,只能调用允许在这一级运行的内核模式函数(并不是所有内核模式函数都能运行于DIRQL级)。至于每个内核模式函数运行级别的说明,详见[2]Kernel-Mode Drivers-Reference章节。
WindowsNT是一多任务系统,许多设备的驱动程序同时存在系统中,这样各个设备所占用的资源(中断,I/O及RAM地址空间)很有可能冲突,如果设备驱动程序在运行之前不进行‘探测’而使用自己硬件设备的资源,有可能和系统内其它设备占用的资源冲突,后果不堪设想。WindowsNT通过注册表管理硬件资源的占用信息,作为内核模式信任的组件,驱动程序使用硬件资源之前必须遵循‘查询-申请-使用-释放’的原则(如图2-2所示)。
(转载自http://zw.nseac.coM科教作文网)
表2-1
来源IRQL
硬件HIGHEST_LEVEL
POWER_LEVEL
IPI_LEVEL
CLOCK2_LEVEL
CLOCK1_LEVEL
PROFILE_LEVEL
DIRQLs(I/O设备中断平台相关的级数)
软件DISPATCH_LEVEL
APC_LEVEL
PASSIVE_LEVEL
WindowsNT设备驱动程序的编写步骤与实例
现以一实际例子简要说明设备驱动程序的开发步骤,本例以CINRAD天气雷达测试卡实际应用为原型,加以简化、抽象。
第一步,了解被控设备的接口情况。
本例为一ISA卡,占用PC机9号中断,I/O地址360H及RAM地址D0228H分别一个字空间。共2页: 1 [2] 下一页 论文出处(作者):
利用Delphi开发网络数据库应用
VB5.0中数据库查询模块的实现