当前位置:文档之家› Windows平台DDK开发WDM设备驱动研究及应用

Windows平台DDK开发WDM设备驱动研究及应用

Windows平台DDK开发WDM设备驱动研究及应用
Windows平台DDK开发WDM设备驱动研究及应用

 

25卷 第12期2008年12月

微电子学与计算机

M ICROEL ECTRON ICS &COMPU TER

Vol.25 No.12December 2008

收稿日期:2007-12-29

基金项目:国家自然科学基金项目(60574042)

Windows 平台DD K 开发WDM 设备驱动研究及应用

祁 佳,罗 琦,于 勇

(南京信息工程大学信息与控制学院,江苏南京210044)

摘 要:介绍了Microsoft 公司的WDM 驱动程序设计与开发的基本原理,运用微软的DD K 开发工具包,实现了在

Windows 平台下USB 接口设备过滤驱动程序的设计与开发.并结合实际开发的运用EZ 2USB 芯片的信号接收卡,

给出了部分关键代码.

关键词:WDM ;DD K;USB ;I2C

中图分类号:TP309 文献标识码:A 文章编号:1000-7180(2008)12-0154-03

R esearch and Application of

WDM Driver with DD K under Windows

Q I Jia ,L UO Qi ,YU Y ong

(College of Information and Control ,Nan jing University of Information Science &Technology ,Nanjing 210044,China )

Abstract :Principle of design and research on WDM Driver under Microsoft is https://www.doczj.com/doc/879171713.html,B driver is desi gned and de 2veloped using DD K under Windows ,and signal receiving card is developed with EZ 2USB chip.S ome key codes of proce 2dure are shown.

K ey w ords :WDM ;DD K;USB ;I2C

1 引言

Windows2000/XP/V ISTA 已经成为PC 机的

主流操作系统,要想实现在Windows 操作系统下对硬件设备的操作,必须通过在WDM 模型下设计的驱动程序这个软接口.随着USB2.0的发展,运用USB 这种具有热插拔,高速率等优点的接口设备已

开始流行.文中以EZ 2USB 芯片的视频接收设备为例,论述了如何运用DD K 工具包,开发USB 设备驱动程序[122].

2 WDM 驱动模型

Windows 操作系统下,组件的运行分为用户模

式和内核模式两种.用户模式下的上层AP 要想实现对特定硬件的某种操作,得调用Win32的API ,

然后这个调用被I/O 管理器接受,并被构造成一个

合适的中断请求包(IRP ),发送给相应的设备驱动程序.由驱动程序来处理IRP ,并最终实现对硬件的具体操作,并把操作结构通过I/O 管理器反馈给上层AP [3].原理如图1所示.

3 应用编程实例

3.1 IN F 文件

IN F 文件是用来安装WDM 驱动程序(SYS 文

件)的必须的文文中件(.inf ),里面包含了一些必要的要向计算机注册的信息.比如要复制的文件列表、要创建的注册表项、支持的设备硬件ID 等,包含[Version ]、[Manufacturer ]、[SourceDisksFiles ]等.当

插入新的硬件设备,计算机扫描到此设备,就可手动指定到IN F 文件进行安装驱动文件的操作[425].

图1 Windows 系统结构图

如[Version ]字段可包含以下内容:

signature =“$CHICA G O $”//签名Class =Media //驱动类型

ClassGU ID ={4d36e96c 2e325211ce 2bfc1208002be10318}Provider =%DTV 2DVB %//驱动提供者DriverVer =12/24/2007,2.0.1.0//驱动版本CatalogFile =UDTT3320.cat

在IN F 文件中,还有许多需要在注册表里进行

注册的内容,如:H KR ,“DriverData ”,“FixedBand 2width ”,0x00010001,0x06,0x00,0x00,0x00

表示在名为“DriverData ”下添加一个“Fixed 2Bandwidth ”的注册表项,并且赋一个16进制的值:0x06.

3.2 RC 文件和SOU RCE 文件

RC 文件(.rc )在驱动设计中的主要作用就是给

发布的驱动文件以版本标注,以便软件升级以及版本的管理.如下,包含了文件版本、产品版本公司名称等信息.

BEGIN

 VALU E “CompanyName ”,“\0”//公司名称 

VALU E

“FileDescription ”,“DTV 2DVB

UDST3320BDA DVB 2S USB Box \0”

 VALU E “FileVersion ”,“1,0,0,2\0”//文件版本 VALU E “InternalName ”,“UDST3320Bda.sys \0” VALU E “OriginalFilename ”,“UDST3320Bda.sys \0” VALU E “ProductName ”,“\0”//产品名称 VALU E “ProductVersion ”,“1,0,0,1\0”//产品版本

END

驱动的编译需要一个文文中件SOU RCE 文件,此文件的作用:确定编译后的驱动文件名称、目标编译文件的类型、给编译器指明驱动编译需要的源文件及库文件等.以下为代码例程:

TAR GETNAME =UDST3320Bda //驱动文件名称TAR GETT YPE =DRIV ER //指明类型是驱动

TAR GETPA TH =obj

DRIV ERT YPE =WDM //驱动为WDM 驱动INCLUDES =$(BASEDIR )\inc ;C DEFIN ES =$(C DEFIN ES )TAR GETL IBS =\$(DD K L IB

PA TH )\ks.lib //

需要的库文件

SOURCES =EzUsbsys.cpp \//代码源文件UDST3320Bda.rc //RESOURCE 文件

3.3 编译环境

在WDM 体系中,驱动程序的代码实现部分,都

是放在某个.sys 的文件中的,这个.sys 文件是通过安装好Microsoft 的DD K 工具包后,选择进入不同的操作系统(2000/XP/V ISTA32/V ISTA64),并在相应的编译环境下进入到代码的存放目录中,然后输入build 命令进行驱动文件的编译.3.4 SYS 文件

编译完成后,在相应的目录下面就会产生针对不同操作系统的.sys 文件.如在objchk wlh amd64\amd64目录下会生成64位操作系统的驱动文件,在objchk wlh x86\i386目录下会生成32位操作系统的驱动文件.在驱动成功安装后,这个.sys 文件将被复制到系统安装盘下的\WIN 2DOWS \system32\drivers 目录下.3.4.1 驱动框架的主要例程

实际的项目开发中,很多例程是不可或缺的,如

Driver Entry 、DeviceAdd 、DeviceStart 、DeviceRemove 、DeviceSet Power 等.Driver Entry 是驱动的入口函数,在DriverObject 中存储一系列的回调例程指针.De 2viceAdd 的工作是创建一个功能设备对象并连接到设备栈,然后注册一个设备接口,使得设备对于内核和WIN32程序可见.DeviceStart 主要是用来给驱动程序分配资源,如分配内存等.DeviceRemove 的作用为通知驱动程序硬件设备已经不存在了,并进行诸如释放先前分配的内存和停止USB 传输等工作.当计算机需要进入休眠或待机状态或从待机或休眠状态恢复到工作模式,有些硬件的芯片是需要复位和重新初始化等操作以不影响上层AP 的正常运行,这些动作就应该在DeviceSet Power 里进行.3.4.2 USB 接口的初始化配置

USB 设备在设备接入时需要对USB 接口做一定的配置,下面给出的是部分关于USB 配置的代码:

N TSTA TUS ConfigureDevice (IN P KSDEV ICE device ){DEV ICE

CON TEXT 3pdx =GETCON TEXT (device );

//pointer to DeviceExtension

5

51 第12期祁佳,等:Windows 平台DD K 开发WDM 设备驱动研究及应用

PURB urb=NULL;//urb

PUSB CONFIGURA TION DESCRIPTOR configura2 tionDescriptor=NULL;

urb=(PURB)ExAllocatePool(NonPagedPool,

sizeof(struct URB CON TROL DESCRIPTOR REQU EST));

//G et memory for the USB Request Block(urb).

if(urb!=NULL)

{//Set size of the data buffer.Note we add padding to cover hardware faults

//that may cause the device to go past the end of the data buffer

siz=sizeof(USB CONFIGURA TION DESCRIP2 TOR)+16;

//G et the nonpaged pool memory for the data buffer

configurationDescriptor=(PUSB CONFIGURA TION DESCRIPTOR)ExAllocatePool(NonPagedPool,siz);

if(configurationDescriptor!=NULL){

UsbBuild G etDescriptorRequest(urb,

(USHORT)sizeof(struct URB CON TROL DE2 SCRIPTOR REQU EST),

USB CONFIGURA TION DESCRIPTOR T YPE,0, 0,

configurationDescriptor,NULL,sizeof(USB CONFIGU2 RA TION DESCRIPTOR),

/3G et only the configuration descriptor3/NULL);

……}

3.4.3 USB通讯

如何进行USB通讯,是以USB作为硬件接口的设备的关键部分,以下代码给出了设备驱动程序如何访问USB总线驱动程序:

N TSTA TUS CallUSBD(IN P KSDEV ICE device,IN PURB Urb)

{N TSTA TUS ntStatus,status=STA TUS SUCCESS;// status for return

DEV ICE CON TEXT3pdx=GETCON TEXT(de2 vice);//pointer to deExtension

PIRP irp;//interupt request

……

K eWait ForSingleObject(&pdx->WaitAccessFw,Exec2 utive,K ernelMode,FAL SE,NULL);

K eReset Event(&pdx->WaitAccessFw);//issue a syn2 chronous request

K eInitializeEvent(&event,NotificationEvent,FAL SE);

irp=IoBuildDeviceIoControlRequest(IOCTL IN TER2 NAL

USB SUBMIT URB,

device->PhysicalDeviceObject,NULL,0,NULL,0,

TRU E,&event,&ioStatus);

//Prepare for calling the USB driver stack

nextStack=Io G etNext IrpStackLocation(irp);

ASSERT(nextStack!=NULL);

//Set up the URB ptr to pass to the USB driver stack

nextStack->Parameters.Others.Argument1=Urb;

//Call the USB class driver to perform the operation.If the returned status

//is PENDIN G,wait for the request to complete.

ntStatus=IoCallDriver(device->PhysicalDeviceObject, irp);

if(ntStatus==STA TUS PENDIN G)

{status=K eWait ForSingleObject(

 &event,Suspended,K ernelMode,

 FAL SE,NULL);//&Timeout

 ntStatus=ioStatus.Status;}

if(N T SUCCESS(ntStatus))

{pdx->AccessFail=FAL SE;}

else

{pdx->AccessFail=TRU E;}

K eSet Event(&pdx->WaitAccessFw,0,FAL SE);

return ntStatus;}

3.5 BU G调试

开发过驱动程序的人应该都知道,驱动程序如果程序内部有一些小问题,例如变量没有初始化,循环在某些情况退出失败,都会很容易导致操作系统蓝屏或死机.因此就应该运用Dbgview进行打印信息跟踪,或运用修改注册表进行注册表跟踪,或使用微软的WinDbg进行蓝屏问题的内存拷贝分析.由于篇幅有限,具体操作这里不再累述.

3.6 数字签名

要想被V ISTA认证通过,就得通过微软的驱动程序数字签名,也称“数字驱动签署”,通过此认证,就表明驱动程序是和Windows系统是兼容的.要想获得微软的驱动数字签名,必须要通过微软的D TM (驱动程序测试管理器)的各项测试,其中包括43个严格的测试项目.涵盖系统、芯片组、软件、运行时效和稳定性等范畴.微软对测试的结果进行评估,然后决定是否通过认证.

4 结束语

文中是运用DD K作为编译环境,开发了基于USB2.0的WDM信号接收卡的驱动程序,在实际的测试运行后,性能良好、稳定,并能通过微软的数字驱动测试.在科技发展日新月异的今天,不断有新

(下转第160页)

图2 平均能量消耗仿真结果

有效的改进算法.提出的改进算法通过动态自适应调整信息素策略,使得无线传感器网络路由在网络传感器数量、平均能量消耗、生命周期、平均延时方面表现出了良好的可扩展性,同时使得基本蚁群算法的性能有显著的提高,有利于蚁群算法的应用和推广.

参考文献:

[1]孙利民,李建中,陈渝,等.无线传感器网络[M].北京:

清华大学出版社,2005.

[2]段海滨.蚁群算法原理及其应用[M].北京:科学出版

社,2005.

[3]Colorni A,Dorigo M,Maniezzo V,et al.Distributed opti2

mization by ant colonies[C]//Proceedings of the1st Euro2 pean Conference on Artificial Life.France,Paris,1991: 134-142.

[4]Dorigo M,G ambardella L M.Ant colonies for the traveling

salesman problem[J].BioSystems,1997,43(2):73-81.

[5]康望星.基于蚁群算法的无线传感器网络路由算法研究

[D].哈尔滨:哈尔滨工程大学,2006.

[6]Dorigo M,Maniezzo V,Colorni A.Ant system:optimiza2

tion by a colony of cooperating agents[J].Trans.on Systems,Man,and Cybernetics,1996,26(1):29-41. [7]宋莉,曹阳,康剑.基于蚁群系统的传感器网络广播与数

据聚集算法[J].武汉大学学报,2006,52(1):100-104.

[8]朱兴国,李士宁,谷建华,等.EERP:一种能源有效的无

线传感器网络路由协议[J].微电子学与计算机,2007, 24(8):22-24.

[9]姚仲欢,王高才,孙野,等.传感器网络中基于最短路径

树的低延时节能路由算法[J].微电子学与计算机, 2007,24(9):174-177.

作者简介:

郭新华 男,(1981-),硕士研究生.研究方向为系统控制与优化、嵌入式系统开发、运筹与决策.

蒋 艳 女,(1962-),博士后,副教授.研究方向为系统控制与优化、运筹与决策.

曹建霞 女,(1983-),硕士研究生.研究方向为计算机辅助设计、多媒体应用.

(上接第156页)

的硬件产品上市,而硬件产品能否正常使用又必须通过驱动来实现.Windows操作系统是目前世界占有率最高的操作系统,对微软的WDM驱动模型的研究,具有非常可观的市场前景.

参考文献:

[1]武安河.Windows2000/XP WDM设备驱动程序开发

[M].2版.北京:电子工业出版社,2005.

[2]Walter Oney.Programming the microsoft windows driver

model[M].USA:Microsoft Press,2003.

[3]Chris Cant.Windows WDM设备驱动程序开发指南[M].

孙义,马莉波,国雪飞,译.北京:机械工业出版社,2003.

[4]薛纪文,王会燃,加云岗.基于WDM的I/O端口访问设

计及实现[J].微电子学与计算机,2005,22(6):45-47.

[5]李武.USB嵌入式系统上层应用软件的设计与实现[J].

微电子学与计算机,2006,23(6):17-20.

作者简介:

祁 佳 女,(1982-),硕士研究生.研究方向为系统分析与集成.

罗 琦 男,(1958-),教授,博士生导师.

于 勇 男,(1982-),硕士研究生.研究方向为系统分析与集成专业.

windows驱动开发和调试环境搭建

Windows驱动开发和环境搭建 【文章标题】: Windows驱动开发和调试的环境设置 【文章作者】: haikerenwu 【使用工具】: VC6.0,VMware6.0.3,Windbg 【电脑配置】: 惠普笔记本xp sp3 (一)VMWare安装篇 VMWare的安装一路Next即可,关于其序列号,百度一下就能找到,虚拟机安装完成之后,需要安装操作系统,我在虚拟机中安装的是windows xp sp2系统。 点击“文件”----“新建”----“虚拟机” 进入新建虚拟机的向导,配置虚拟系统参数

选择虚拟系统文件的兼容格式(新手推荐选择默认选项) 按照默认设置继续点击下一步,选择好您需要的操作系统,此处我选择的是Windows XP Prefessional。 设置虚拟机名称和虚拟操作系统安装路径,我单独空出来一个F 盘,将虚拟机和虚拟操作系统全部装在该盘。

配置网络模式(推荐选择NA T,一般主机不用做任何的设置虚拟机就可以利用主机上网)。 配置虚拟磁盘的容量。在这里可以直接单击完成,来完成基本操作设置,磁盘默认空间是8GB,用户可以根据自己的实际使用情况来调整大小,也可以自定义分区。

操作完成之后,在“VM”菜单下有个“setting。。。”菜单,点击此菜单,在CD-ROM中选择合适的选项,我使用的是Use ISO image 选项,将我的xp sp2操作系统的ISO映像路径设置好,安装操作系统。点击ok之后,启动虚拟机,即开始安装操作系统,安装过程跟普通装机过程相同。安装完成之后,启动操作系统,然后在VM菜单下点击“Install VMWare Tools”,把虚拟操作系统的驱动装好。 (二)VMWare设置篇

platform设备驱动精讲,例程详细

总线设备驱动模型主要包含总线、设备、驱动三个部分,总线可以是一条真实存在的总线,例如USB、I2C等典型的设备。但是对于一些设备(内部的设备)可能没有现成的总线。Linux 2.6内核中引入了总线设备驱动模型。总线设备驱动模型与之前的三类驱动(字符、块设备、网络设备)没有必然的联系。设备只是搭载到了总线中。在linux内核中假设存在一条虚拟总线,称之为platform总线。platform总线相比与常规的总线模型其优势主要是platform总线是由内核实现的,而不用自己定义总线类型,总线设备来加载总线。platform 总线是内核已经实现好的。只需要添加相应的platform device和platform driver。具体的实现过程主要包括如下的过程: 两者的工作顺序是先定义platform_device -> 注册platform_device->,再定义platform_driver-> 注册platform_driver。 整体而言只需要完成两个步骤,也就是设备的实现和驱动的实现,每一个实现都包括相关结构体的定义和注册。 platform_device注册 需要注意的是platform_device 实质上是经过处理过的设备,在platform_device结构体中存在一个设备结构体,与之前的设备存在差别的是引入了设备资源。这些设备资源就能实现对设备寄存器,中断等资源的访问。平台设备的基本结构体如下: struct platform_device { /*设备名*/ const char * name; /*设备ID号*/ int id; /*结构体包含一个具体的device结构体*/ struct device dev; /*资源的数量*/ u32 num_resources; /*资源结构体,用来保存硬件的资源*/ struct resource * resource; /*平台设备的ID*/ struct platform_device_id *id_entry; }; 其中struct device 和struct resource 是重要的结构体。struct device 在总线设备驱动模型中已经提到了。这次讨论一下struct resource。 struct resource { /*资源的起始值,如果是地址,那么是物理地址,不是虚拟地址*/ resource_size_t start; /*资源的结束值,如果是地址,那么是物理地址,不是虚拟地址*/ resource_size_t end; /*资源名*/ const char *name; /*资源的标示,用来识别不同的资源*/ unsigned long flags; /*资源指针,可以构成链表*/ struct resource *parent, *sibling, *child; };

虚拟设备驱动程序的设计与实现

虚拟设备驱动程序的设计与实现 由于Windows对系统底层操作采取了屏蔽的策略,因而对用户而言,系统变得 更为安全,但这却给众多的硬件或者系统软件开发人员带来了不小的困难,因为只要应用中涉及到底层的操作,开发人员就不得不深入到Windows的内核去编写属 于系统级的虚拟设备驱动程序。Win 98与Win 95设备驱动程序的机理不尽相同,Win 98不仅支持与Windows NT 5.0兼容的WDM(Win32 Driver Mode)模式驱动程序 ,而且还支持与Win 95兼容的虚拟设备驱动程序VxD(Virtual Device Driver)。下面介绍了基于Windows 9x平台的虚拟环境、虚拟设备驱动程序VxD的基本原理和 设计方法,并结合开发工具VToolsD给出了一个为可视电话音频卡配套的虚拟设备 驱动程序VxD的设计实例。 1.Windows 9x的虚拟环境 Windows 9x作为一个完整的32位多任务操作系统,它不像Window 3.x那样依 赖于MS-DOS,但为了保证软件的兼容性,Windows 9x除了支持Win16应用程序和 Win32应用程序之外,还得支持MS-DOS应用程序的运行。Windows 9x是通过虚拟机 VM(Virtual Machine)环境来确保其兼容和多任务特性的。 所谓Windows虚拟机(通常简称为Windows VM)就是指执行应用程序的虚拟环 境,它包括MS-DOS VM和System VM两种虚拟机环境。在每一个MS-DOS VM中都只运 行一个MS-DOS进程,而System VM能为所有的Windows应用程序和动态链接库DLL(Dynamic Link Libraries)提供运行环境。每个虚拟机都有独立的地址空间、寄存器状态、堆栈、局部描述符表、中断表状态和执行优先权。虽然Win16、Win32应用程序都运行在System VM环境下,但Win16应用程序共享同一地址空间, 而Win32应用程序却有自己独立的地址空间。 在编写应用程序时,编程人员经常忽略虚拟环境和实环境之间的差异,一般认为虚拟环境也就是实环境。但是,在编写虚拟设备驱动程序VxD时却不能这样做 ,因为VxD的工作是向应用程序代码提供一个与硬件接口的环境,为每一个客户虚 拟机管理虚设备的状态,透明地仲裁多个应用程序,同时对底层硬件进行访问。这就是所谓虚拟化的概念。 VxD在虚拟机管理器VMM(Virtual Machine Manager)的监控下运行,而VMM 实 际上是一个特殊的VxD。VMM执行与系统资源有关的工作,提供虚拟机环境(能产

Windows驱动开发培训

Windows驱动开发培训 培训流程: 一、基础知识 在开始驱动开发之前,您应该知道操作系统原理以及驱动程序是如何在操作系统中进行工作的,了解这些基本原理将有助于您做出正确的设计决策并简化您的开发过程。 1、了解Windows操作系统构造\\ 可以链接进去 2、安装WDK,参考相关文档,熟悉WDK的内容\\ 可以链接进去 二、Windows驱动开发\\ 可以链接进去 一、基础知识 在开始驱动开发之前,您应该知道操作系统原理以及驱动程序是如何在操作系统中进行工作的,了解这些基本原理将有助于您做出正确的设计决策并简化您的开发过程。 1、了解Windows操作系统构造 (1)培训目标 深入了解Windows操作系统的系统结构以及工作原理 (2)培训内容 阅读书籍《深入解析Windows操作系统》的第3、4、6、7、9章,重点关注第九章“I/O系统” (3)培训任务 ①掌握Windows操作系统的系统结构 ②理解ISR、IRP、IRQL、DCP等概念的含义 ③了解注册表的用法,掌握注册表数据的查看和修改方法 ④了解进程和线程的内部机理以及线程的调度策略 ⑤了解I/O系统的内容,理解I/O请求以及I/O处理过程 注:以上相关内容,请在一周内完成。

2、安装WDK,参考相关文档,熟悉WDK的内容 (1)培训目标 了解WDK的安装过程,熟悉WDK的编译环境,掌握如何使用WDK的相关帮助文档;了解WDM驱动程序的基本结构 (2)培训内容 ①.阅读文档\\10.151.131.12\book\windows\MSWDM.chm,掌握WDM驱动程序的基本结构以及基本的编程技术。 ②.参考WDK的帮助文档:WDK documentation ,了解WDK的基本内容 (3)培训任务 ①理解分层驱动结构的含义,掌握设备和驱动程序的层次结构 ②理解“驱动对象”和“设备对象”的概念 ③理解2个基本例程:DriverEntry 和addDevice ④了解IRP的结构以及IRP处理的流程 ⑤初步了解I/O的控制操作 注:以上相关内容,请在一周内完成。 二、Windows驱动开发 学习如何基于WDK进行驱动程序的开发 1、培训目标 (1)学会根据WDK开发一个基本的Windows驱动程序和测试程序 (2)学会利用不同的IOCTL方式在内核模式和用户模式之间进行通讯 (3)学会如何在内核模式下和用户模式下访问注册表 (4)利用WinDbg跟踪程序,学会使用WinDbg进行调试 2、培训内容 (1)阅读\src\general\ioctl中的示例代码 (2)build并运行应用程序和驱动程序

设备驱动程序

驱动程序 驱动程序一般指的是设备驱动程序(Device Driver),是一种可以使计算机和设备通信的特殊程序。相当于硬件的接口,操作系统只有通过这个接口,才能控制硬件设备的工作,假如某设备的驱动程序未能正确安装,便不能正常工作。 因此,驱动程序被比作“硬件的灵魂”、“硬件的主宰”、和“硬件和系统之间的桥梁”等。 中文名 驱动程序 外文名 Device Driver 全称 设备驱动程序 性质 可使计算机和设备通信的特殊程序 目录 1定义 2作用 3界定 ?正式版 ?认证版 ?第三方 ?修改版 ?测试版 4驱动程序的开发 ?微软平台 ?Unix平台 5安装顺序 6inf文件 1定义 驱动程序(Device Driver)全称为“设备驱动程序”,是一种可以使计算机和设备通信的特殊程序,可以说相当于硬件的接口,操作系统只能通过这个接口,才能控制硬件设备的工作,假如某设备的驱动程序未能正确安装,便不能正常工作。 惠普显卡驱动安装 正因为这个原因,驱动程序在系统中的所占的地位十分重要,一般当操作系统安装完毕后,首要的便是安装硬件设备的驱动程序。不过,大多数情况下,我们并不需要安装所有硬件设备的驱动程序,例如硬盘、显示器、光驱等就不需要安装驱动程序,而显卡、声卡、扫描仪、摄像头、Modem等就需要安装驱动程序。另外,不同版本的操作系统对硬件设

备的支持也是不同的,一般情况下版本越高所支持的硬件设备也越多,例如笔者使用了Windows XP,装好系统后一个驱动程序也不用安装。 设备驱动程序用来将硬件本身的功能告诉操作系统,完成硬件设备电子信号与操作系统及软件的高级编程语言之间的互相翻译。当操作系统需要使用某个硬件时,比如:让声卡播放音乐,它会先发送相应指令到声卡驱动程序,声卡驱动程序接收到后,马上将其翻译成声卡才能听懂的电子信号命令,从而让声卡播放音乐。 所以简单的说,驱动程序提供了硬件到操作系统的一个接口以及协调二者之间的关系,而因为驱动程序有如此重要的作用,所以人们都称“驱动程序是硬件的灵魂”、“硬件的主宰”,同时驱动程序也被形象的称为“硬件和系统之间的桥梁”。 戴尔电脑驱动盘 驱动程序即添加到操作系统中的一小块代码,其中包含有关硬件设备的信息。有了此信息,计算机就可以与设备进行通信。驱动程序是硬件厂商根据操作系统编写的配置文件,可以说没有驱动程序,计算机中的硬件就无法工作。操作系统不同,硬件的驱动程序也不同,各个硬件厂商为了保证硬件的兼容性及增强硬件的功能会不断地升级驱动程序。如:Nvidia显卡芯片公司平均每个月会升级显卡驱动程序2-3次。驱动程序是硬件的一部分,当你安装新硬件时,驱动程序是一项不可或缺的重要元件。凡是安装一个原本不属于你电脑中的硬件设备时,系统就会要求你安装驱动程序,将新的硬件与电脑系统连接起来。驱动程序扮演沟通的角色,把硬件的功能告诉电脑系统,并且也将系统的指令传达给硬件,让它开始工作。 当你在安装新硬件时总会被要求放入“这种硬件的驱动程序”,很多人这时就开始头痛。不是找不到驱动程序的盘片,就是找不到文件的位置,或是根本不知道什么是驱动程序。比如安装打印机这类的硬件外设,并不是把连接线接上就算完成,如果你这时候开始使用,系统会告诉你,找不到驱动程序。怎么办呢参照说明书也未必就能顺利安装。其实在安装方面还是有一定的惯例与通则可寻的,这些都可以帮你做到无障碍安装。 在Windows系统中,需要安装主板、光驱、显卡、声卡等一套完整的驱动程序。如果你需要外接别的硬件设备,则还要安装相应的驱动程序,如:外接游戏硬件要安装手柄、方向盘、摇杆、跳舞毯等的驱动程序,外接打印机要安装打印机驱动程序,上网或接入局域网要安装网卡、Modem甚至ISDN、ADSL的驱动程序。说了这么多的驱动程序,你是否有一点头痛了。下面就介绍Windows系统中各种的不同硬件设备的驱动程序,希望能让你拨云见日。 在Windows 9x下,驱动程序按照其提供的硬件支持可以分为:声卡驱动程序、显卡驱动程序、鼠标驱动程序、主板驱动程序、网络设备驱动程序、打印机驱动程序、扫描仪驱动程序等等。为什么没有CPU、内存驱动程序呢因为CPU和内存无需驱动程序便可使用,不仅如此,绝大多数键盘、鼠标、硬盘、软驱、显示器和主板上的标准设备都可以用Windows 自带的标准驱动程序来驱动,当然其它特定功能除外。如果你需要在Windows系统中的DOS 模式下使用光驱,那么还需要在DOS模式下安装光驱驱动程序。多数显卡、声卡、网卡等内置扩展卡和打印机、扫描仪、外置Modem等外设都需要安装与设备型号相符的驱动程序,否则无法发挥其部分或全部功能。驱动程序一般可通过三种途径得到,一是购买的硬件附

虚拟设备驱动程序设计中的两个关键问题

虚拟设备驱动程序设计中的两个关键问题 在虚拟设备驱动程序(VxD)的设计中,两个尤为关键,且又令人困扰的问题是VxD 的虚拟化和VxD与应用程序间的通信机制。下面,对这两个问题作一详细的探讨。 一、VxD的虚拟化 由于Windows允许同时运行多个任务,所以出现多个进程试图同时访问同一物 理设备的情况时,如果多个应用程序通过同一个DLL驱动程序(注意和虚拟设备驱 动程序VxD的区别)访问设备,不需要对该设备虚拟化,驱动程序使之顺序访问;如果是多个Windows应用程序对相同设备同时访问,由于都运行于System VM(系统虚拟机),所以也不需要虚拟化,它们的访问将由一个驱动程序(Windows driver DLL)进行检测并使之串行化,而不是依靠VxD;如果多个VM试图访问同一 设备,由于DOS应用程序能够直接操纵硬件,所以必须对该设备进行虚拟化,一个 虚拟化设备的VxD负责可靠地检测多个VM试图访问同一设备的情况,并采取仲裁的 策略来解决这种冲突。这里可能有以下几种解决方案: 1、允许一个VM访问物理设备,同时忽略其它的VM。这是最简单的虚拟化 形式 。如VPD(Virtual Printer Device)。 2、允许一个VM访问物理设备,同时为其它的VM虚拟化设备。如VKD(Virtual Keyboard Device)分配给一个VM,并使之获得物理键盘的访问权(包括键盘中 断 在内),对其它的VM而言,VKD只向它们提供一个空的键盘缓冲区。 3、允许多个VM共享同一物理设备。尽管存在假象,但从VM的观点来看,这种 方法与独享访问一样。如VDD(Virtual Display Device),使每一个Windows环境 下的DOS VM认为是直接写入显存,其实只是被VDD映射到了一个窗口的缓冲区。 4、VxD独立访问物理设备的同时,允许一个VM访问虚拟设备,这是最复杂的 虚拟化形式。如VCD(Virtual Com Device),VCD缓冲区接收串行数据并通过映射中 断透明地传给相应的一个VM,VM在中断处理过程中读取串口数据寄存器,这些数 据的实质是VCD缓冲区已经接收的数据。 与物理设备一样,硬件中断很多时候也必须虚拟化,这种情况更为复杂。虚拟化中断实质上就是将硬件产生的中断映射到需要它的每一个VM(不管该VM是否 正在运行),替代VxD进行服务。在这里我们给出一个虚拟化中断的VxD实例的几 个重要回调过程,并采用最简单的仲裁策略来解决访问冲突(见程序1)。 typedef struct

字符设备驱动开发实验

字符设备驱动实验 实验步骤: 1、将设备驱动程序使用马克file文件编译 生成模块firstdev.ko 2、将模块加载到系统中insmod firstdev.ko 3、手动创建设备节点 mknod /dev/first c 122 0 4、使用gcc语句编译firsttest.c生成可执行 文件 5、运行可执行文件firsttest,返回驱动程序 中的打印输出语句。 查看设备号:cat /proc/devices 卸载驱动:rmmod firstdev 删除设备节点:rm /dev/first 显示printk语句,(打开一个新的终端)while true do sudo dmesg -c sleep 1 done

源码分析 设备驱动程序firstdev.c #include #include #include #include #include #include //#include static int first_dev_open(struct inode *inode, struct file *file) { //int i; printk("this is a test!\n"); return 0; }

static struct file_operations first_dev_fops ={ .owner = THIS_MODULE, .open = first_dev_open, }; static int __init first_dev_init(void) { int ret; ret = register_chrdev(122,"/dev/first",&first_dev_fo ps); printk("Hello Modules\n"); if(ret<0) { printk("can't register major number\n"); return ret; }

简单的虚拟字符设备驱动的实现

简单的虚拟字符设备驱动的实现 Linux業已成为嵌入式系统的主流,而各种Linux驱动程序的类型中,字符设备无疑是应用最广泛的。本文实现了一个简单的虚拟字符设备的驱动程序,用以演示Linux字符设备驱动的基本原理。在嵌入式Linux的教学中具有重要的作用。 标签:Linux 驱动程序字符设备虚拟嵌入式 Linux作为一种开放源代码的操作系统,在嵌入式系统领域业已成为主流,而为嵌入式Linux系统开发设备驱动程序,也成为一项重要的工作。Linux系统中的驱动程序主要分为三种:字符设备驱动程序、块设备驱动程序和网络驱动程序。其中字符设备是一类只能顺序读写,没有缓存的驱动程序,其实现方法相对简单,而应用则最为广泛。在嵌入式Linux的教学中,字符设备驱动程序也是一项重要内容。为了让学生能够理解字符设备驱动程序的原理,需要一个简单的字符设备驱动的例子,用以进行演示。 一、基本原理 把设备当作文件处理,是Linux系统的重要思想,即“一切皆文件”。在用户空间中,应用程序对字符设备的操作跟读写普通文件没有什么区别,也是通过open()、close()、read()、write()等函数实现的。操作系统将这些用户空间中的函数分别映射到内核空间中由驱动程序提供的对应接口。因此,内核空间中的驱动程序就需要通过对对应接口函数的实现来实现对用户空间中应用程序的支持。 file_opreations是字符设备驱动中最重要的结构,它包含了字符设备各种可能的接口函数。通常在嵌入式编程中,我们不需要全部实现,只需要实现我们实际用到的接口就可以了,这样可以有效降低程序的大小。该结构被定义在头文件“linux/fs.h”中,使用时只需声明该结构的一个变量并进行填充即可。 二、环境准备 为了进行嵌入式Linux的开发,必须首先安装Linux系统。这里采用最常用的Windows系统+VMWare虚拟机的形式,系统版本为RedHat Enterprise Linux 6.4,其自带的内核版本为2.6.32-358.el6.i686。该版本比之前沿用的RedHat9更新,同时也是一个被验证过的非常稳定的系统。 交叉编译器采用网上下载的Arm-Linux-gcc 4.5.1版本,同样兼顾到版本更新和稳定性之间的平衡关系。 各软件的安装过程本文不再赘述。

Windows驱动开发入门

接触windows驱动开发有一个月了,感觉Windows驱动编程并不像传说中的那么神秘。为了更好地为以后的学习打下基础,记录下来这些学习心得,也为像跟我一样致力于驱动开发却苦于没有门路的菜鸟朋友们抛个砖,引个玉。 我的开发环境:Windows xp 主机+ VMW ARE虚拟机(windows 2003 server系统)。编译环境:WinDDK6001.18002。代码编辑工具:SourceInsight。IDE:VS2005/VC6.0。调试工具:WinDBG,DbgView.exe, SRVINSTW.EXE 上面所有工具均来自互联网。 对于初学者,DbgView.exe和SRVINSTW.EXE是非常简单有用的两个工具,一定要装上。前者用于查看日志信息,后者用于加载驱动。 下面从最简单的helloworld说起吧。Follow me。 驱动程序的入口函数叫做DriverEntry(PDRIVER_OBJECT pDriverObj,PUNICODE_STRING pRegisgryString)。两个参数,一个是驱动对象,代表该驱动程序;另一个跟注册表相关,是驱动程序在注册表中的服务名,暂时不用管它。DriverEntry 类似于C语言中的main函数。它跟main的差别就是,main完全按照顺序调用的方法执行,所有东西都按照程序员预先设定的顺序依次发生;而DriverEntry则有它自己的规则,程序员只需要填写各个子例程,至于何时调用,谁先调,由操作系统决定。我想这主要是因为驱动偏底层,而底层与硬件打交道,硬件很多都是通过中断来与操作系统通信,中断的话就比较随机了。但到了上层应用程序,我们是看不到中断的影子的。说到中断,驱动程序中可以人为添加软中断,__asm int 3或者Int_3();前者是32位操作系统用的,后者是64位用的。64位驱动不允许内嵌汇编。下面是我的一个helloworld的源码:

操作系统与驱动开发试题

河北科技大学硕士学位研究生 2014——2015学年第1学期 《操作系统与驱动开发》课程期末考试试卷 学院信息学院专业电路与系统姓名程莉学号 2201414007 题号一二三四五六总分 得分 一.单项选择题(每小题1分,共10分) 1.操作系统的 D 管理部分负责对进程进行调度。 A.主存储器 B.控制器 C.运算器 D.处理机 2.分时操作系统通常采用 B 策略为用户服务。 A.可靠性和灵活性 B.时间片轮转 C.时间片加权分配 D.短作业优先 3.很好地解决了“零头”问题的存储管理方法是 A 。 A 页式存储管理 B 段式存储管理 C 多重分区管理 D 可变式分区管理 4.用WAIT、SIGNAL操作管理临界区时,信号量的初值应定义为 B 。 A.-1 B.0 C.1 D.任意值 5.在进程管理中,当 C 时,进程从阻塞状态变为就绪状态。 A.进程被进程调度程序选中 B.等待某一事件 C.等待的事件发生 D.时间片用完 6.某系统中有3个并发进程,都需要同类资源4个,试问该系统不会发生死锁的最少资源数 B 。 A.9 B.10 C.11 D.12 7.虚拟存储器管理系统的基础是程序的 B 理论。 A.全局性 B.局部性 C. 动态性 D.虚拟性 8.从用户的角度看,引入文件系统的主要目的是 D A.实现虚拟存储 B.保存系统文档

C.保存用户和系统文档 D.实现对文件的按名存取 9.操作系统中采用多道程序设计技术提高CPU和外部设备的 A A.利用率 B.可靠性 C.稳定性 D.兼容性 10.缓冲技术中缓冲池在 C 中。 A.主存 B. 外存 C. ROM D. 时间片轮转 二.填空(每空0.5分,共15分)。 11.进程存在的唯一标志是PCB 。 12.通常进程实体是由程序块、进程控制块和数据块三部分组成。 13.磁盘访问时间由寻道时间、旋转延迟时间和传输时间组成。 14.作业调度是从后备作业队列中选一些作业,为它们分配资源,并为它们创建进程。 15.文件的物理组织有顺序、链接和索引。 16.若一个进程已经进入临界区,则其它欲要进入临界区的进程必须___等待____。 17.信号量的物理意义是,当信号量值大于零时其值表示可分配资源的个数;当信号 量值小于零时,其绝对值表示等待使用该资源的进程的个数。 18.静态重定位在程序装入时进行; 而动态重定位在程序运行时进行。 19.分区管理中采用“最佳适应”分配算法时,宜把空闲区按长度递增次序登记在空闲 区表中。 20.所谓系统调用,就是用户在程序中调用操作系统所提供的一些子功能。 21.把逻辑地址映射为物理地址的工作称为地址映射。 22.设备管理中采用的数据结构有设备控制表、控制器控制表、通道控制表、 系统设备表等四种。 23.从资源管理(分配)的角度,I/O设备可分为独占设备、共享设备和虚 拟设备三种。 24.设备与控制器之间的接口信号主要包括数据、状态和控制。 25.DMA控制器由三部分组成,分别为主机与DMA控制器的接口、 DMA控制器与块设备的接 口和 I/O控制逻辑。 三.名词解释(每小题2.5分,共10分)。 26.虚拟存储器 答:虚拟存储器是指在具有层次结构存储器的计算机系统中,自动实现部分装入和部分替换功能,能从逻辑上为用户提供一个比物理贮存容量大得多,可寻址的“主存储器”。

Windows驱动程序开发环境配置

Windows驱动程序开发笔记 一、WDK与DDK环境 最新版的WDK 微软已经不提供下载了这里:https://https://www.doczj.com/doc/879171713.html,/ 可以下并且这里有好多好东东! 不要走进一个误区:下最新版的就好,虽然最新版是Windows Driver Kit (WDK) 7_0_0,支持windows7,vista 2003 xp等但是它的意思是指在windows7操作系统下安装能编写针对windows xp vista的驱动程序, 但是不能在xp 2003环境下安装Windows Driver Kit (WDK) 7_0_0这个高版本,否则你在build的时候会有好多好多的问题. 上文build指:首先安装好WDK/DDK,然后进入"开始"->"所有程序"->"Windows Driver Kits"->"WDK XXXX.XXXX.X" ->"Windows XP"->"x86 Checked Build Environment"在弹出来的命令行窗口中输入"Build",让它自动生成所需要的库 如果你是要给xp下的开发环境还是老老实实的找针对xp的老版DDK吧,并且xp无WDK 版只有DDK版build自己的demo 有个常见问题: 'jvc' 不是内部或外部命令,也不是可运行的程序。 解决办法:去掉build路径中的空格。 二、下载 WDK 开发包的步骤 1、访问Microsoft Connect Web site站点 2、使用微软 Passport 账户登录站点 3、登录进入之后,点击站点目录链接 4、在左侧的类别列表中选择开发人员工具,在右侧打开的类别:开发人员工具目录中找到Windows Driver Kit (WDK) and Windows Driver Framework (WDF)并添加到您的控制面板中 5、添加该项完毕后,选择您的控制面板,就可以看到新添加进来的项了。 6、点击Windows Driver Kit (WDK) and Windows Driver Framework (WDF),看到下面有下载链接,OK,下载开始。下载后的文件名为: 6.1.6001.18002.081017-1400_wdksp-WDK18002SP_EN_DVD.iso将近600M大小。

一个简单字符设备驱动实例

如何编写Linux设备驱动程序 Linux是Unix操作系统的一种变种,在Linux下编写驱动程序的原理和思想完全类似于其他的Unix系统,但它dos或window环境下的驱动程序有很大的区别。在Linux环境下设计驱动程序,思想简洁,操作方便,功能也很强大,但是支持函数少,只能依赖kernel中的函数,有些常用的操作要自己来编写,而且调试也不方便。本文是在编写一块多媒体卡编制的驱动程序后的总结,获得了一些经验,愿与Linux fans共享,有不当之处,请予指正。 以下的一些文字主要来源于khg,johnsonm的Write linux device driver,Brennan's Guide to Inline Assembly,The Linux A-Z,还有清华BBS上的有关device driver的一些资料. 这些资料有的已经过时,有的还有一些错误,我依据自己的试验结果进行了修正. 一、Linux device driver 的概念 系统调用是操作系统内核和应用程序之间的接口,设备驱动程序是操作系统内核和机器硬件之间的接口。设备驱动程序为应用程序屏蔽了硬件的细节,这样在应用程序看来,硬件设备只是一个设备文件,应用程序可以象操作普通文件一样对硬件设备进行操作。设备驱动程序是内核的一部分,它完成以下的功能: 1)对设备初始化和释放; 2)把数据从内核传送到硬件和从硬件读取数据; 3)读取应用程序传送给设备文件的数据和回送应用程序请求的数据; 4)检测和处理设备出现的错误。 在Linux操作系统下有两类主要的设备文件类型,一种是字符设备,另一种是块设备。字符设备和块设备的主要区别是:在对字符设备发出读/写请求时,实际的硬件I/O一般就紧接着发生了,块设备则不然,它利用一块系统内存作缓冲区,当用户进程对设备请求能满足用户的要求,就返回请求的数据,如果不能,就调用请求函数来进行实际的I/O操作。块设备是主要针对磁盘等慢速设备设计的,以免耗费过多的CPU时间来等待. 已经提到,用户进程是通过设备文件来与实际的硬件打交道。每个设备文件都都有其文件属性(c/b),表示是字符设备还是块设备。另外每个文件都有两个设备号,第一个是主设备号,标识驱动程序,第二个是从设备号,标识使用同一个设备驱动程序的不同的硬件设备,比如有两个软盘,就可以用从设备号来区分他们。设备文件的主设备号必须与设备驱动程序在登记时申请的主设备号一致,否则用户进程将无法访问到驱动程序. 最后必须提到的是,在用户进程调用驱动程序时,系统进入核心态,这时不再是抢先式调度。也就是说,系统必须在你的驱动程序的子函数返回后才能进行其他的工作。如果你的驱动程序陷入死循环,不幸的是你只有重新启动机器了,然后就是漫长的fsck。 二、实例剖析 我们来写一个最简单的字符设备驱动程序。虽然它什么也不做,但是通过它可以了解Linux的设备驱动程序的工作原理.把下面的C代码输入机器,你就会获得一个真正的设备

Windows 95下的虚拟设备驱动程序

Windows 95下的虚拟设备驱动程序 虚拟设备驱动程序(VxDs)在很大程度上支持了Windows 3.x和Windows 95。通 常,我们从两个级别的意义上来认识VxDs:从低级意义上来说,它们直接存取系统 的硬件;而从高级意义上来看,它们在最高优先级别上运行。 在Windows 95中,VxDs显得更加重要,Microsoft正是靠VxDs扩展了操作系统内 核的处理能力。Win 95中的VxDs可以处理涉及从文件系统到声卡以至网络系统的 各种事务。 可能您还未认识到:尽管VxDs本身是32位的,但它却诞生于16位的非线程、非 抢占性的操作系统。而现在人们期待甚至要求VxDs能运作于具有线程化、可抢占 性的操作系统,简单的变形是不能解决此问题的。 虚拟机假想 一台虚拟机(VM)只不过是人们的一个假想。而特别的,这个假想认为一个给定 的进程可对一台计算机的所有硬件设备进行独占性的存取,这些设备包括了内 存 、I/O口、中断和其它进程想要占用的部件。VxDs就是为了此假想产生的。 Windows 3.1中有两种虚拟机(VMs):DOS壳和Windows VM本身(后者称为" 系统 虚拟机"———所有的Windows应用程序运行于其中)。而虚拟机管理器(VMM),尽 管它本身不是一VM,但却充当着激活VMs和VxDs的主要管理员。例如,VMM要处理在 运行VMs时的抢占时间片工作。 另外,任何用来虚拟管理I/O设备的VxD都必须在VMM中登记。因此,如果一VxD 要占用一些特殊的I/O端口,就必须请求VMM挂起这个端口。这样,无论何时当一 Windows应用程序试图对此口进行存取操作时,VMM将把这个存取请求传给特定的 VxD。

虚拟块设备驱动程序设计与分析

如果只是为了应付考试,这个文档就太啰嗦了,不用看,不过还是可以帮助记忆,考试只会考其中加粗字体的几个函数中的一个,至于是哪个我不能断定,因此要记的还是比较多的,要是能理解就更好了,结合课本和下面的解释应该能大体上弄明白这个虚拟块设备驱动的 实现过程,毕竟设备驱动是内核的一部分,光看下面的解释也是还是很头晕的,不过坚持看下去还是有收获的,我也差不多花了半天时间,不过,要是打算……的话就可以直接跳过了。 #define MAJOR_NR 70 //我们创造的虚拟块设备的主设备号 #define DEVICE_NAME “bdemo”//我们创造的虚拟块设备的名字,当设备加载成功后可用lsmod命令查看到该设备模块名 #define blkdemo_devs 2 //虚拟块设备的个数 #define blkdemo_rahead 2 //读取块设备时预读的扇区个数 #define blkdemo_size 4 //每个虚拟块设备的大小,单位为KB #define blkdemo_blksize 1024 //设备每个数据块的大小,即block,单位为字节 #define blkdemo_hardsect 512 //设备每个扇区的大小,单位为字节 struct blkdemo_device { // 这里定义了我们将要创造的虚拟块设备的数据结构 int size; // 用来记录真实块设备的容量,即下面data指针所指向数据存储区的大小 int use_cnt; // 用来记录正在使用该块设备的程序的个数 int hardsect; // 用来保存该块设备每个扇区的大小,单位为字节,即设备的使用计数 u8 *data; // 该指针所指向的内存区域就是该块设备真正用来存储数据的区域,在该设备还未被加载函数初始化时,该指针为// 空,即系统还没有为该设备分配内存区域。 }; static int blkdemo_sizes[blkdemo_devs]; //用来保存我们创建的所有虚拟块设备的大小,单位为KB static int blkdemo_blksizes[blkdemo_devs]; //用来保存我们创建的所有虚拟块设备中每个数据块的大小,单位为字节static int blkdemo_hardsects[blkdemo_devs];//用来保存我们创建的所有虚拟块设备中每个扇区的大小,单位为字节 //上面的这三个数组将会在我们加载这些设备时被注册到内核的数据结构中(即让内核中与之相关的一些指针指向它们,让内核能够读取我们所创建的设备的一些重要信息 //对于一个新的设备,内核肯定不知道他为何物,要想让内核识别我们自己创造的设备,则必须将该设备的一些信息、使用这个设备的方//法等告诉内核,由于内核早已编译成型,至于如何去告诉内核就早已模式化。内核中有几个指针数组(书本page81)专门用来完成上面的部分任务: // blk_size[]; // blksize_size[]; // hardsect_size[]; // read_ahead[]; //这几个数组都为每一个主设备号留有一个位置,对于2.4的内核,主设备号和次设备号均用8位二进制来表示(即短整型的高八位和//低八位),因此这几个数组都包含有256个元素,每个元素都是与主设备号对应的一个指针,如果主设备号所对应的设备不存在,则该//指针置为空(NULL),其实其中很多指针都为空,因为一般电脑上都没有那么多不同类型的块设备,当然,对于我们所创造的这个块设//备而言,它与系统中所存在的其他块设备的类型都不同,要为其确定一个主设备号,这个没什么硬性的规定,只要找一个没被使用的主//设备号就可以了,这个程序中使用的是70(前面的MOJOR_NR宏)。上面我们定义了保存有虚拟块设备信息的数组,现在只要将他们的//首地址赋给这几个数组中下标70(主设备号)所对应的指针元素即可。这一过程是在后面的加载函数中完成的。 static int blksize = blkdemo_blksize; struct blkdemo_device blkdemo_dev[blkdemo_devs];//这里才真正创建了我们虚拟块设备对应的结构体变量(一个全局数组),//每个元素为对应一个虚拟块设备 虚拟块设备的打开函数(open()): int blkdemo_open(struct inode *inode, strcut file *filp) { //设备文件对应的节点(inode)结构中包含有对应的设备号 int num; num = DEVICE_NR(inode->i_rdev);//用DEVICE_NR宏可求出该节点所对应设备的次设备号,所以num即为次设备号if (!blkdemo_dev[num].use_cnt) { //如果该设备的使用计数为0,则说该设备没有被任何程序使用,当虚拟块设备没有被//任何程序使用时,内核先前为该设备所分配的存储区很可能已经被释放掉了,甚至对于可移动设备而言,有可能该设备都被拔掉了(当//然,我们的虚拟块设备是不可能的),因此,在打开该设备时要进行严格的检查,不然会导致设备打开出错而造成系统崩溃。 check_disk_change(inode->i_rdev);//首先检查该块设备是否发生了变化,比如已经被移除了(该设备不可能,所以//此处没有用if来判断,只是形式的调用了一下该函数。 if (!blkdemo_dev[num].data)//然后判断该设备的数据存储区域是否已经被释放掉了 return –ENOMEM; //如果是,则返回,告知系统该设备无法打开,-ENOMEM是一个内核中定义的宏,它代表的意思是//“error,no memory”。 }//如果上述情况均未发生,一切正常,则打开设备,对于这个虚拟的块设备,其实没有什么好打开的,不过还是意思一下:blkdemo_dev[num].use_cnt++; //将设备的使用计数加1,表示又多了个程序使用该设备。 MOD_INC_USE_COUNT; //并且将内核所管理的模块使用计数也加1,好让内核也知道多了一个程序使用该虚拟设备模块。模块使//用计数是内核管理模块时要用的,只有当一个设备的模块使用计数为0时才能卸载该模块,这个值也可以通过lsmod命令查看到return(0);//返回0,表示设备已成功打开 } 虚拟块设备的释放函数(release()): int blkdemo_release(struct inode *inode, struct file *filp) {//释放并不代表将此设备从内核中移除了,他是对调用它的程序而言的,只表示这个程序不再使用该设备了int num;

WINDOWS驱动编程

WDM驱动程序开发之读写设备寄存器:KIoRange类 2009-11-09 14:05 WDM驱动程序开发之读写设备寄存器:KIoRange类收藏 KIoRange类: 一、Overview KIoRange类将一系列特殊的外围总线的地址映射到CPU总线的地址空间。CPU总线上的地址即可能在CPU的I/O空间,也可能在CPU的内存空间,这取决于平台和外围总线的控制方式。考虑到可移植性,所有对I/O周期(I/O cycle)进行译码的设备驱动程序必须用这个类对I/O的位置(location)进行正确的访问(access)。KIoRange是KPeripheralAddress类的派生类。 一旦映射关系建立起来,驱动程序就用KIoRange类的成员函数去控制设备的I/O寄存器。这个类提供了8位、16位和32位I/O访问控制的函数。这些函数是以内联(in-line)函数方式来使用的,它们调用系统内相应的宏来产生依赖于平台的代码。 对I/O位置(location)进行访问的另一种备选方案是创建一个KIoRegister 的实例。这要通过取得一个KIoRange对象的数组元素来实现。 为了访问一系列外围总线内存空间的地址,需要用KMemoryRange类。 二、Member Functions 1、KIoRange - Constructor (4 forms) 构造函数 【函数原型】 FORM 1: KIoRange( void ); FORM 2: (NTDDK Only) KIoRange( INTERFACE_TYPE IntfType, ULONG BusNumber , ULONGLONG BaseBusAddress, ULONG Count, BOOLEAN MapToSystemVirtual =TRUE ); FORM 3 (WDM): KIoRange( ULONGLONG CpuPhysicalAddress, BOOLEAN InCpuIoSpace, ULONG Count, BOOLEAN MapToSystemVirtual =TRUE

相关主题
文本预览
相关文档 最新文档