




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、pci2040芯片驱动程序的开发摘要vxd是virtual v:tul x driver的简写,即虚拟设备驱动程序。x代表各种设备的名字,如虚拟键盘驱动程序(vkd),虚拟鼠标驱动程序(vmd)等等。vxd程序是硬件成功初始化的途径。记得dos程序认为它们拥有系统的一切,当它们在虚拟机中运行时,windows需要给它们一个实机器的替身。vxd程序就是这些替身。vxd程序通常虚拟一些硬件设备,所以,例如当一个dos程序认为它在同键盘通讯时,实际是虚拟键盘驱动程序在和dos程序通讯。一个vxd程序通常控制真正的硬件设备并对该设备在各个虚拟机之间的共享进行管理。 尽管如此,并不是说每个vxd程序必须
2、和一个硬件设备相连。虽然vxd程序是用来虚拟硬件设备的,但是我们也可以把vxd程序看作是在第0级别的dll。例如,如果你需要做一些只有在第0级别才能做的工作,你就可以编一个vxd程序来为你完成这个工作。这样,由于此vxd程序并没有虚拟任何设备,你就可以把它仅仅看作是你的程序的扩展。 vxd程序是windows 9x特有的,它在windows nt下不能运行。所以如果你的程序是依靠vxd的,它就不能被移植到windows nt平台上去。 vxd是系统中权力最大的实体。由于它们可以对系统作任何事情,所以它们是极度危险的。一个恶意的/错误的vxd程序可以毁掉整个系统。对于恶意的/错误的vxd程序没有
3、任何的保护措施。驱动程序:英文名为“device driver”,全称为“设备驱动程序”是一种可以使计算机和设备通信的特殊程序,可以 说相当于硬件的接口,操作系统只有通过这个接口,才能控制硬件设备的工作,假如某设备的驱动程序未能正确安装,便不能正常工作。 因此,驱动程序被誉为“ 硬件的灵魂”、“硬件的主宰”、和“硬件和系统之间的桥梁”等。刚安装好的系统操作系统,很可能驱动程序安装得不完整。硬件越新,这种可能性越大。菜菜熊之前看到的“图标很大且颜色难看”就是没有安装好驱动的原因。 在软件测试中:在自底向上测试中,要编写称为测试驱动的模块调用正在测试的模块。测试驱动模块以和将来真正模块同样的方式挂
4、接,向处于测试的模块发送测试用例数据,接受返回结果,验证结果是否正确。 随着电子技术的飞速发展,电脑硬件的性能越来越强大。驱动程序是直接工作在各种硬件设备上的软件,其“驱动”这个名称也十分形象的指明了它的功能。正是通过驱动程序,各种硬件设备才能正常运行,达到既定的工作效果。 硬件如果缺少了驱动程序的“驱动”,那么本来性能非常强大的硬件就无法根据软件发出的指令进行工作,硬件就是空有一身本领都无从发挥,毫无用武 之地。这时候,电脑就正如古人所说的“万事俱备,只欠东风”,这“东风”的角色就落在了驱动程序身上。如此看来,驱动程序在电脑使用上还真起着举足轻重的 作用。 从理论上讲,所有的硬件设备都需要安
5、装相应的驱动程序才能正常工作。但像cpu、内存、主板、软驱、键盘、显示器等设备却并不需要安装驱动程序也可以正常工作,而显卡、声卡、网卡等却一定要安装驱动程序,否则便无法正常工作。这是为什么呢? 这主要是由于这些硬件对于一台个人电脑来说是必需的,所以早期的设计人员将这些硬件列为bios能直接支持的硬件。换句话说,上述硬件安装后就 可以被bios和操作系统直接支持,不再需要安装驱动程序。从这个角度来说,bios也是一种驱动程序。但是对于其他的硬件,例如:网卡,声卡,显卡等等 却必须要安装驱动程序,不然这些硬件就无法正常工作。 第一章 绪论 驱动程序实际上可以理解为是一系列控制硬件设备的函数。在do
6、s系统中,一个驱动程序可能是一个连到应用程序.exe中的一个模块或者是与应用程序分开的一个独立部分;在widows系统中,封装驱动程序的方法是制作一个dll或vxd。在早期,由于我们一般涉及的与计算机相关的硬件设备都是标准设备,它们的驱动程序是由厂家或专门的程序开发人员提供并加以封装,用户只需了解与驱动程序相连的windows应用程序接口(api),而无需知道其内部运行机制。但是如果硬件是非标准设备,我们必须针对该特定硬件自己来设计windows环境下的设备驱动程序。the application programming interface api 我所面对的硬件是一块超声波探伤卡,它集成在一
7、块pci插卡上,桥接芯片采用了pci2040,因为它可以和dsp无缝连接。我要做的工作是首先利用主机通过并口启动模拟采样部分,当采样数据放大后进入a/d变换后存入储存器,在数据存储器中存满一帧时,硬件向主机发中断,主机响应中断后通过pci2040芯片读出存放在数据存储器中的采样数据,然后进行后续处理并将结果显示于屏幕。我编写的应用程序的软件平台是window95/98,采样的工具是visualc+6.0(简称vc+),因为它是一种面向对象的编程语言,具有良好的交换性,可以根据用户对界面上的控件或菜单操作作出相应的处理,而且它可以自动根据要求生成框架,我们要做的只是对空的函数框架进行填充。由于应
8、用程序运行在ring3级,它不能对硬件进行直接访问,也不会响应硬件中断,必须通过驱动程序来响应中断以及访问硬件。该硬件显然不是windows标准组件,系统不会提供相应的vxd驱动程序,因此必须自己编写pci2040的硬件安装信息文件和驱动程序。值得一提的是在通过并口与硬件通信时理论上也得写vxd但是由于并口是windows标准组件,windows已经封装了一些常用的api函数(如_inp()和_outp()等函数),可以在应用程序中直接使用,而且像打印机等利用并口传输数据的硬件的驱动程序已经被认为不属于虚拟设备驱动程序了。ring3在cpu的所有指令中,有一些指令是非常危险的,如果错用,将导致
9、整个系统崩溃。比如:清内存、设置时钟等。如果所有的程序都能使用这些指令,那么你的系统一天死机n回就不足为奇了。所以,cpu将指令分为特权指令和非特权指令,对于那些危险的指令,只允许操作系统及其相关模块使用,普通的应用程序只能使用那些不会造成灾难的指令。形象地说,特权指令就是那些儿童不宜的东东,而非特权指令则是老少皆宜。 intel的cpu将特权级别分为4个级别:ring0,ring1,ring2,ring3。windows只使用ring0和ring3,ring0只给操作系统用,ring3谁都能用。如果普通应用程序企图执行ring0指令,则windows会显示“非法指令”错误信息。因为有cpu的
10、特权级别作保护。在本论文安排上首先介绍驱动程序的产生背景、实现原理和开发工具,然后介绍pci总线及pci2040芯片,最后说明我的驱动程序以及相应的应用程序。第二章 windows环境下的驱动程序在dos操作系统时代,对于一个应用程序而言它总认为自己是唯一运行的程序,因此常常可以直接访问硬件,独占所有的系统内存以及系统运行时间,当然也就不需要设备驱动程序。但是到了windows时代,dos应用程序并不是唯一运行的程序,系统中同时可能有若干个应用程序在运行,这就使得系统不可能让它随意的直接访问硬件,否则就会引起混乱导致系统崩溃。为了解决这个问题,人们提出了将系统的资源虚拟化,让应用程序运行在一个
11、虚拟的环境中的虚拟机(vm)上,而管理程序和驱动程序运行在实际机器上(ring0级),由它们来处理针对硬件的操作。2.1虚拟机(vm) 虚拟资源是由系统产生的假象,它是硬件(甚至是软件)资源的仿真,当系统虚拟了所有或者几乎所有的程序可以访问的资源时,它就创造了一个“虚拟机”(vm)。概括起来,windows的虚拟机完全透明地仿真了以下地资源和性能:l 可访问的内存空间;l i/o操作;l 中断操作;l 外围设备(显示器、键盘等);虚拟机的管理主要由虚拟机管理器(vmm)完成。vmm利用系统的硬件创造了几个相互独立的虚拟机,每个虚拟机都有自己的虚拟环境,而且每个虚拟环境可能与物理环境根本不同。让
12、所有的windows应用程序(win16应用程序和win32应用程序)运行在一个vm上,称为系统vm;而每一个dos应用程序都分别运行在各自的一个vm上,这样便解决了dos和windows应用程序的兼容问题。2.2处理器运行模式及各种程序优先级 为了创建和维护虚拟机,vmm开发了80386以及以后的兼容处理器的特殊性能。这些处理器有三种运行模式:实模式、保护模式和v86模式,它们决定了处理器所能寻址的地址空间,如何实现逻辑地址到物理地址的转换以及如何保护对内存和i/o端口的访问。windows95/98利用了其中的保护模式和v86模式两种模式,以下各项也是针对这两种模式而言。windows95
13、/98执行环境支持四种不同的基本模式: 管理程序、win32应用程序、win16应用程序和dos应用程序。其中管理程序在ring0级(最高级)中运行,能够访问和控制实际硬件环境,也就是说它们在真正的计算机上运行,而不是在虚拟机上运行,在所有构成windows的组件中,只有vmm和vxd在管理环境中执行。windows应用程序在ring3级(最低级)的保护模式上运行,它们不能直接访问硬件,一旦执行一个对硬件的操作就会引起一个异常事件,这时处理器切换到ring0级,并且将控制权交给相应的控制器。所有windows应用程序分享一个系统虚拟机。每个dos应用程序运行在各自的v86虚拟机(类似于系统虚拟
14、机)上,标注为ring3级(最低级),它访问的硬件资源和中断也被隐藏和虚拟了。23如何实现虚拟机当在虚拟机中执行程序时,windows必须能够捕获并透明的“代替”以下功能:l 对i/o端口查询l 对一个内存映射的外围设备查询。l 可能导致传送到虚拟机之外的操作,如一个异常时间或中断。2.3.1捕获i/o操作不论保护模式还是v86模式,操作系统都可以捕获输入和输出指令来防止应用程序直接访问i/o映射的设备。windows98/95使用i/o优先级(iopl)和i/o允许映射(iopm)(0表示拒绝,1表示允许)来控制vm访问i/o地址。在保护模式中,每个代码段都有一个相关的优先级描述器,它存储在
15、描述器列表中。当在保护模式中执行一个i/o指令时,处理器将段的iopl和当前代码段的优先级(cpl)比较,如果cpliopl且iopm=0,处理器才执行指令,否则产生一个异常事件。在v86模式中,处理器只参照iopm,与iopl无关。windows和它的标准组件vxd可以捕获pc机上的所有标准i/o设备,由于我们使用的不是标准硬件,因此要自己编写vxd,流程也相似先向vmm申请捕获我们的硬件端口的服务,安装回调处理器,当vm访问该端口时产生异常进入我们的回调处理中,由我们自己编写的函数进行处理。2.3.2捕获内存操作windows主要根据页错误机制实现对存储器映射设备访问的虚拟化。要捕获对某个
16、设备内存的访问,设备vxd会将页表中对应于为了内存的页标注为“不可用”。当在虚拟环境中运行的程序试图访问这个页时,会产生一个错误。vmm的异常处理器会调用已注册的设备vxd的页错误处理器进行相关处理。2.3.3捕获中断和异常事件windows必须能够捕获一些具有优先级的指令,因为它们可能会绕过处理器的保护特性或干扰虚拟机的完整性。如影响处理器中断标志指令(cli,sti,popf,iret等),调入描述表的指令(lldt,lgdt,lidt等)。解决的方法是在ring3层上一旦执行一个有优先级的指令,就会引起一个异常事件。这时处理器就会切换到ring0层并将控制交给相应的控制器。2.4各种驱动
17、程序比较l vxd vxd是虚拟设备驱动程序,是系统用于对各种硬件资源识别,管理,维护运作的扩展。vxd和vmm(虚拟机管理器)一起合作,维持着系统的运作。vxd模式从win3x时代就开始了.一直到了win98还一直在ms的win系列操作系统中起主导作用。vxd运作在intel系列cpu保护模式下的ring0,拥有对硬件的最高控制权。l kmdkmd是kernel mode driver的缩写,它是windowsnt下提出的管理,维护硬件运作的驱动程序模式。该driver运行于windowsnt的kernel模式下(类似于ring0),但是,一个kmd的运作环境在不同的时候是根本不同的。dri
18、ver收到设备请求时的运行环境很可能和设备请求实际操作的运行环境根本不同,因此在windowsnt下driver的运作也受到windowsnt本身的许多限制。l wdmwdm是win32 driver model的简写,它可以和windows2000兼容,乃微软力推的全新的驱动程序模式,它实际也可以理解为一个即插即用(pnp)的kmd。但是由于windows98对wdm的支持有限,而且wmd的代码很长,能用vxd时一般不采wdm,因此目前wdm的实际应用还不多,但随着windows2000/nt的普及wdm必将成为主流的驱动程序模式。2.3驱动程序的开发工具l ddk开发虚拟设备驱动程序(vx
19、d)的常规方法是使用microsoft出品的设备驱动程序开发工具包ddk(device developer kit)。它有windows98 ddk和windows2000 ddk两个版本。前者能够开发windows95/98/me/nt下的vxd、kmd和wdm驱动程序,后者可以开发windows98/me/nt/2000下的kmd和wdm驱动程序。它要求设计者必须对windows的体系结构、设备驱动程序的结构、虚拟机管理器(vmm)以及intel cpu体系结构有深入的了解,而且需要保护模式的汇编语言编程经验。 因此,在实际中ddk一般不常被人使用,取而代之的是下面二种开发工具。l vto
20、olsdvireo公司出色的vtoolsd由可视的vxd代码生成器quickvxd、c运行库、vmm/vxd服务库、c+类库以及vxd的装入程序等组成。利用quickvxd生成的框架程序和经充分测试过的c运行库或c+类库可以绕过ddk用c或c+来编制驱动程序,这就大大地简化了开发的难度,提高了可靠性。框架程序可以直接在visual c+集成开发环境中用nmake编译为vxd。由于利用vtoolsd主要针对windows85/98驱动程序编程,写出的vxd程序相对比较简洁,而且它容易上手,因此我在实际编写vxd设备驱动时使用了该工具。l windriverwindriver是美国krftech公
21、司出品的用于编写驱动程序的另一种工具包。它包括1个类似于q uickvxd的代码生成器windriver wizard、1个windriver发行包、2个公用程序。与vtoolsd一样,windriver工具包的优点在于可以使编程人员用c或c+语言来编写设备驱动 程序,而不是将大量精力放在编写那些复杂的、难于调试的内核模式代码。 以上介绍的3种工具各有优点。ddk功能强大,编程灵活,适用范围广,可应用于各类硬件驱动程序的编写,但对编程人员的要求较高,编程难度较大。vtoolsd主要工作环境是在windows 98/95下,它具有较强的开发能力和较高的开发效率,是编程人员常用的工具。windri
22、ver的适用面比前二者窄,它主要针对isa/pci插卡,而对其他类硬件的技术支持较少,但它编写的程序可同时工作在windows95/98/nt操作系统第三章vxd虚拟设备驱动程序vxd是虚拟设备驱动程序(virtual x driver)的缩写,中间的x表示某一类设备。如vkd.vxd表示键盘的驱动程序,当然一个vxd并非一定对应一个硬件设备,有的vxd只是为其他的vxd或应用程序服务,有的vxd也可能只是对应一个不存在的硬件。但是所有的vxd都有一个共同的特点,即“到任何地方做任何事情”。它们可以访问内存地址,访问硬件端口,捕获其他程序对内存和端口的访问,甚至可以截获硬件中断,vxd模式从w
23、indows3.1时代就开始了,一直到windows95/98/me它还一直在微软的操作系统中起主导作用。3.1vxd的开发工具在编写vxd时我采用了vireo公司的vtoolsd工具,它由quickvxd,debugmonitor及inf edit等组成。quickvxd工具(见图32)可以快速生成vxd的代码框架,开发者只需填写几个选项然后在生成的框架中再增加自己的代码,编程效率比较高而且程序比较简洁,quickvxd的使用在下面将详细介绍。debugmonitor工具(见图31)具有两个功能,一个是用来观察vxd在debug状态下的输出流,另一个是可以强制执行和终止vxd的运行。图31i
24、nf edit工具主要是用来编写安装硬件信息的.inf文件,当cmos检测到新硬件时它会按照安装信息来安装硬件。当然我们可以使用任何一种文本编辑器来编写安装文件,只要最后以inf作为后缀名就行了,但是由inf文件中的节是分层排列的且比较多,使得直接写很困难,如果使用inf edit工具就比较简单,只需安照它的类目一一填写即可自动生成所需文件。3.2vxd的创建windows支持静态安装和动态安装vxd。静态安装是在windows初始化时安装vxd并一直保存在windows中,动态安装的vxd是在一个应用程序或其他vxd的控制下安装和卸载。如果选择静态安装,由于我的应用程序并不是一直在执行,而v
25、xd始终占用着一定的内存资源以及宝贵的中断口,这样导致了资源浪费。因此我使用了动态安装,只有当应用程序运行时,通过creatfile()函数动态打开vxd,申请内存资源,挂钩中断口,然后响应中断进行数据采集、处理和显示,当用户关闭应用程序时,它首先通过closehandle()关闭vxd,vxd在中止前释放所有先前它申请的资源。在使用quickvxd开发vxd只需在dynamically loadable选项中打勾就行了(图31),其中device name是指我们的vxd的设备名,每个vxd都有设备名这儿是指pci2040芯 图32片,device id是用来标识设备,只有当该vxd需要提供
26、对其他vxd的调用入口时才用,且不能任意取应该由microsoft公司提供,一般情况直接用undefined_device_id就行了,device initialization order确定windows对vxd的安装顺序,比如你想要你的vxd先于vdd初始化就应该设置为vdd_init_order-1,一般情况也使用默认值。3.3vxd的事件通知vmm提供了大量的消息与vxd进行通信,对于编程人员来讲要做的工作就是写消息处理程序。消息数目总共将近40个(详见附录a),但是一般情况我们只使用其中的很少一部分,限于篇幅下面仅详细介绍pci2040芯片的驱动程序用到的几个消息。l sys_dy
27、namic_device_init 通知可动态加载的vxd加载并初始化,在其中作一些初始化工作,如设备的初始化,挂钩中断口和安装硬件中断处理函数。当该消息处理函数返回值为真时,表示初始化成功,否则初始化失败,系统将vxd从内存中移去。l sys_dynamic_device_exit通知可动态卸载的vxd从内存中移去,并且释放它先前申请的资源。当处理函数返回值为真时表示vxd安全卸载,否则将阻止系统卸载vxd。l pnp_new_devnode 通知vxd设备结点已经装载了硬件,此时vxd可以去取配置管理器分给它的配置了。l w32_deviceiocontrol该消息主要用来进行win32程
28、序和vxd的通信,在第五章中有详细介绍。在quickvxd中提供了大部分vxd控制消息,我们只需在想要的消息上打勾就可以在生成的驱动程序框架中包含该消息。windows95 control message是指windows95支持的 图22消息(图22),而control message是指windows3.1和windows95都支持的消息。中。3.4vxd访问硬件设备计算机的硬件可以被定位于i/o空间和内存空间,这两种空间是完全独立的而且i/o地址空间比内存空间小的多,对于80386后的处理器而言前者只有64kb而后者有4gb。映射到i/o地址空间的硬件设备只能通过专门的i/o指令如in、
29、out命令(c语言中为inp和outp)来访问。映射到内存空间范围的硬件可以象访问内存一样进行访问,一般使用mov、add、or等指令(c语言中则通过指针来访问)。在实际访问过程中vxd访问i/o映射硬件可以直接使用i/o指令访问,但对于内存映射硬件则复杂的多。因为尽管vxd运行在ring0级,但它所见的是平面内存,只能用线性地址,因此在每次访问一个硬件前必须先配置页表,保证设备的物理地址与一个线性地址相联系,而这个线性地址可以作为一个指针来由我们进行内存访问,就好像我们在直接对硬件操作一样。由于我们的pci插卡是动态配置的内存映射设备,它每次分配的物理地址可能会改变的,因此在进行地址转换时采
30、用的也是动态转换。3.5vxd处理硬件中断在windows环境下,将所有的idt(中断描述符表)指向vmm的一个例程,由vmm来确定它是做为异常事件处理还是中断的结果被调用。vmm自己只管理异常事件,所有的中断由vpicd (虚拟可编程中断处理器)处理。如果一个vxd为中断进行了注册,vpicd就将这个中断交给它处理,否则vpicd将中断交给vm由它来处理。vxd通过调用vpicd的服务vpicd_virtualize_irq()来为硬件中断注册 ,并将会调例程的地址交给vpicd。一旦vxd进行了注册,它就可以处理硬件中断。 2.3vxd的其它开发工具l ddkddk(device deve
31、loper kit)是专业软件开发人员常用的microsoft公司出品的设备驱动程序开发工具包。它有windows98 ddk和windows2000 ddk两个版本。前者能够开发windows95/98/me/nt下的vxd、kmd和wdm驱动程序,后者可以开发windows98/me/nt/2000下的kmd和wdm驱动程序。ddk虽然功能强大,但它要求设计者必须对windows的体系结构、设备驱动程序的结构、虚拟机管理器(vmm)以及intel cpu体系结构有深入的了解,而且需要保护模式的汇编语言编程经验, 因此,在实际中ddk一般不常被人使用。l windriverwindriver
32、是美国krftech公司出品的用于编写驱动程序的另一种工具包。它包括1个类似于quickvxd的代码生成器windriver wizard、1个windriver发行包、2个公用程序。与vtoolsd一样,windriver工具包的优点在于可以使编程人员用c或c+语言来编写设备驱动程序,而不是将大量精力放在编写那些复杂的、难于调试的内核模式代码。以上介绍的几种工具各有优点。ddk功能强大,编程灵活,适用范围广,可应用于各类硬件驱动程序的编写,但对编程人员的要求较高,编程难度较大。vtoolsd主要工作环境是在windows 98/95下,它具有较强的开发能力和较高的开发效率,是编程人员常用的工
33、具。windriver的适用面比前二者窄,它主要针对isa/pci插卡,而对其他类硬件的技术支持较少,但它编写的程序可同时工作在windows95/98/nt操作系统。第四章pci2040芯片驱动程序的开发pci(peripheral component interconnect)总线主要为pentium微处理器的开发使用而设计的,它定义了32位数据总线,且可扩展为64位,使用33mhz时钟频率,最大数据传输率为132264mb/s,支持无限读写猝发操作,支持即插即用,支持并发工作方式,即多组外围设备可与cpu并发工作。pci总线以其优良性能和适应性已成为pentium以上微机的主流总线。要开
34、发基于pci接口的设备就需要选择pci总线接口芯片,目前常用的有s5933,an3042,plx9030等,但是它们不便于和dsp连接。41 pci2040控制芯片ti公司推出的pci2040 pci桥控制器(内部结构如图41)可以很方便的通过主机接口实现多达四片c54x或c6x系列dsp与pci总线的连接。同时它提供了两种数据传输方式:hpi方式和gpbus总线传输方式,其中gpbus总线传输方式比较简单但是传输的速度有所限制,因此我们采用了hpi传输方式。在hpi方式下,主机可以通过三个hpi寄存器实现对dsp片内dram的访问。这三个寄存器分别是:(1)hpi地址寄存器(hpia):由主
35、机直接访问。寄存器中保存了当前要访问的dsp片内存储器地址。(2)hpi数据寄存器(hpid):由主机对其直接访问。如果当前操作是读,则将数据从hpia当前所指向的存储器中读入该寄存器;如果当前操作是写,则将该寄存器内容写入hpia当前所指向的存储器中。当进行较大的数据块读写操作时,可以通过地址自增方式对hpid进行读写。(3)hpi控制寄存器(hpic):被主机和c54x直接访问。它映象在c54x数据存储器的地址002ch处,该寄存器中保存了hpi的控制和状态位。在进行第一个数据或地址寄存器操作前必须先初始化hpic的bob位(若为零表示传输的第一个字节是高字节,否则表示传输的第一个字节是低
36、字节)。这是因为主机接口总是传送8位字节,而hpic寄存器(通常是主机首先要寻址的寄存器)又是一个16位的寄存器,在主机这边就以相同内容的高字节与低字节来管理hpic寄存器。 图41pci总线规范要求任何pci设备必须提供256字节的配置空间,它用来实现无需用户干预的安装、配置和引导;完全的设备再定位,由与设备无关的软件进行系统地址映射。pci2040的配置空间如下: 图42其中设备id用以标识特定的设备,具体的代码由供应商来分配;供应商id用以表明设备的制造者,这二者是识别pci设备的唯一标识。对于pci2040来讲,当读vendordevice id时,返回值为ac60104c。4.3 即
37、插即用体系即插即用(pnp)是微软公司为了使新硬件设备的安装和配置更加容易而采取的一种策略。pnp设备能够自身识别,自动提出资源需求,并且可以在运行时接收资源分配,较新类型的扩展总线如pci、eise、pcmcia等,其任一设备都定义为即插即用的,这些总线也都满足即插即用的要求。配置管理器是即插即用体系结构的核心元件。它由四个软件元件来工作:l 枚举器l 仲裁器l 设备安装器l 设备驱动器其中,枚举器生成设备结点树并参与总线中的设备配置。枚举过程发生在计算机开机时,枚举结束后设备结点树包含的信息有:可用的系统资源、需要的设备驱动程序和资源的要求。当用户将卡插上时,系统的枚举器将自动识别新设备然
38、后查找所有的已知的.inf文件看是否有与设备id号相匹配的,如果有则在新生成的注册表项内复制相应文件,否则提示用户插入一张安装盘。设备信息安装文件(.inf)包含了驱动程序的名称,驱动程序应该复制到的目录,以及在驱动程序安装时必须生成和修改的注册表入口。在编写inf文件时,我使用了vtoolsd开发包中的inf editor工具,以下是我所编写的pci2040安装信息文件。 versionsignature=$chicago$class=pci bridge /设备类型为pci桥设备provider=%string0% /供应商的名称 classinstalldestinationdirsde
39、faultdestdir=11 /将驱动程序安装在c:windowssystem目录下 manufacturer %string1%=section_0 section_0 %string2%=sevenstar,pciven_104c&dev_ac60 sevenstar copyfiles=copyfiles_sevenstar addreg=addreg_sevenstar copyfiles_sevenstar pci2040.vxd /驱动程序的名称为pci2040.vxd addreg_sevenstar hkr,devloader,0,pci2040.vxd /在注册表中添加相关
40、信息 sevenstar_logconfig configpriority=normal irqconfig=3,7,9,10,15 /指定pci2040可选的中断口 controlflags sourcedisksnames 1=pci2040驱动盘,0000-0000 sourcedisksfiles pci2040.vxd=1 strings string0=南京七星公司 string1=sevenstar string2=pci总线控制器44pci2040驱动程序的开发首先利用quickvxd工具写出pci2040.vxd程序的框架,其中包括将要使用的消息如sys_dynamic_de
41、vice_init,sys_dynamic_device_exit,pnp_new_devnodew32_deviceiocontrol等,设置创建方式为动态创建,然后利用vc6.0+软件打开程序框架后进行编写。图43是vxd的处理过程: 虚拟化中断口 设备初始化 物理地址转换成线性地址 获得分配的资源 传递给应用程序 硬件中断处理 通知应用程序 硬件中断 释放资源 图43441设备初始化在pci设备驱动程序的初始化过程中,可以向config_address(0cf8h)寄存器写入一个配置地址,再对config_data(0cfch)寄存器进行读就会启动pci配置周期,就读出了设备的配置空间的
42、寄存器中的值。00寄存器号功能号设备号总线号保留 3130 2423 16 15 1110 8 7 2 1 0图44其中第32位决定是否进行pci的配置访问。1表示使能,0表示禁止。理论上只要知道了总线号,设备号,功能号就可以直接取得系统对pci2040芯片配置以后配置空间的所有寄存器的内容。但是由于我们没有直接找到这几个id,因此第一次必须自己通过枚举方式来获得这几个id。在枚举过程中: 1依次向config_address中写入所有可能的总线号,设备号和功能号,将寄存器号固定为0即第一个寄存器 2读出config_data寄存器中的值,它对应于配置空间首寄存器中的值即vendordevic
43、e id3将读出的值和pci2040芯片的vendordevice id(ac60104c)比较,直到二者相等此时写入的配置地址即为它的配置空间首寄存器的地址,在此基础上加上偏移量即可得到配置空间其他寄存器的地址。下面就是获得pci2040芯片各个id的枚举过程,由于这些id是不变的,因此执行一次后可以直接使用。for(int i=0x80000000;i12)/除以4k得多少页#define pageoff(p) (ulong)(p)&0xfff)/偏移地址为低4k位#define pagebase(p) (ulong)(p)&0xfff)/基址为高位#define _npages_(p,k
44、) (pagenum(char*)p+(k-1)-pagenum(p)+1)pvoid mapdevice(pvoid physaddress, dword sizeinbytes)#ifdef use_map_phys_to_linearreturn mapphystolinear(physaddress, sizeinbytes, 0);#elsepvoid linear;ulong npages = _npages_(physaddress, sizeinbytes);linear = pagereserve(pr_system,npages,pr_fixed);/分配一块不和具体的物理
45、地址相关联的线性地址空间pagecommitphys(pagenum(linear),npages,pagenum(physaddress),pc_incr | pc_writeable | pc_user);/将线性地址和物理地址联系起来linpagelock(pagenum(linear), npages, 0);return (pvoid) (ulong)linear+pageoff(physaddress);#endif/返回值为线性地址的指针。由于资源是动态分配的,当程序结束时应该释放资源其中包括锁定的线性页表,否则会出现内存泄漏的错误甚至导致死机。.解除设备的内存映射时,可以调用l
46、inpageunlock(),pagedecommit()和pagefree()函数,它们分别是映射函数的逆过程。下面是关于解除内存映射的一段程序:void unmapdevice(pvoid linearaddress, dword sizeinbytes)#ifdef use_map_phys_to_linear/ cannot unmap#elselinpageunlock(pagenum(linearaddress),_npages_(linearaddress, sizeinbytes),0);pagedecommit(pagenum(linearaddress),_npages_(
47、linearaddress, sizeinbytes),0);pagefree(memhandle)linearaddress,0);#endif443硬件中断编程vtoolsd提供两种硬件中断类:vhardwareint类和vsharedhardwareint类,它们的区别在于后者允许一个irq被多个vxd虚拟化,即多个vxd共享一个硬件中断,这也是我们经常它的原因。在vsharedhardwareint类中我们使用了hook()函数将vxd与分配给我们的irq挂起勾来,每次硬件发出中断时激发onsharedhardwareint函数,在该函数中进行处理或通知win32程序让它来处理。整个流
48、程如下: pmyirq=new myhwint();/创建一个派生类实例if(!pmyirq|!pmyirq-hook()break;/虚拟化系统分给的中断 bool myhwint:onsharedhardwareint(vmhandle) vwin32_queueuserapc(callbackapc, (dword)&x, thethread);/通知win32程序的回调函数sendphysicaleoi();/通知vpicd中断处理结束return false;/必须返回false以让其他vxd捕获该中断 第五章应用程序的开发我的应用程序是用vc6.0+开发的,在应用程序中主要做了两件
49、事情,一是利用从vxd获得的内存映射地址对pci2040进行初始化设置,二是响应vxd的中断通知读取数据并显示与屏幕。它的流程如下:硬件中断 读取采样数据 显示于屏幕对硬件进行设置 获取线性地址 打开vxd图5151打开vxd当应用程序运行后首先要做的是动态打开vxd,我们使用了createfile()函数来打开pci2040.vxd文件,hdevice = createfile(.pci2040.vxd, 0,0,0,create_new, file_flag_delete_on_close, 0);返回值是vxd的设备句柄,.pci2040.vxd表示按照默认路径查找文件pci2040.vxd,首先是c:windowssystem目录,然后才是当前目录。如果返回值是invalid_handle_value表示有错误,可以调用getlasterror()获得错误信息,错误代码若为2,表示找不到要加载的vxd,可能导致原因是没有vxd文件或即使有但它不能动态加载;错误代码若为50,表示虽然vxd存在,但系统不支持deviceiocontrol()函数。52应用程序与vxd通信在windows中,win32应用程序主动对vxd的通信方法只有一种,就是利用设备输入输出控制函数deviceiocontrol()
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 土地租赁合同页2
- 专业教练培训委托合同
- 品牌战略规划与实施合同
- 八年级语文下册 第四单元 13《最后一次讲演》教学实录 新人教版
- 2023一年级语文上册 第五单元 9 日月明配套教学实录 新人教版
- 卫生管理方法和技巧
- 2023七年级数学下册 第2章 整式的乘法2.1 整式的乘法2.1.2 幂的乘方与积的乘方第1课时 幂的乘方教学实录 (新版)湘教版
- 《小数点位置向左移动的规律》(教学设计)-2024-2025学年五年级上册数学冀教版
- 2024年九年级语文上册 第一单元 诗词诵读《浣溪沙》教学实录 鄂教版
- 国家食品安全宣传
- ICD-10疾病编码完整版
- Project项目管理(从菜鸟到实战高手)
- 《生产安全事故应急预案管理办法》考试复习题库100题(含答案)
- 北江实验中学2022-2023学年七年级下学期期中道德与法治试题
- DL-T-302.1-2011火力发电厂设备维修分析技术导则第1部分:可靠性维修分析
- 运动性病症(课堂课件)
- (正式版)JTT 1482-2023 道路运输安全监督检查规范
- 建筑施工人员的职业道德培训计划
- 《养成学习习惯》ppt课件完整版
- 年产10万吨聚氯乙烯生产工艺设计毕业设计
- 高中18岁成人仪式主题活动设计
评论
0/150
提交评论