PCI设备Windows通用驱动程序设计_第1页
PCI设备Windows通用驱动程序设计_第2页
PCI设备Windows通用驱动程序设计_第3页
PCI设备Windows通用驱动程序设计_第4页
PCI设备Windows通用驱动程序设计_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、pci 设备 windows通用驱动程序设计摘 要通用高速pci 总线目标模块全面地讨论了windows设备驱动程序编写时所面临的主要问题及解决方案关键词经常要在机的软件中访问和控制硬件设备包括 windows95/98windows 2000为了保证系统的安全性对应用程序访问硬件资源加以限制 windows下的驱动程序不仅仅包括物理设备的驱动程序为了简化问题本文将以撏酶咚伲校茫勺芟吣勘昴探讨pci 设备的驱动程序设计方案它可以完成一般pci 设备驱动所需的功能?y?3d2? ? 1y ?y?3d ? ?32dd?dd? ? ?y?3d?pc 机程序称为用户程序所以大多数情况下驱动程序也不能通

2、用一般至少要设计windows 9x和windows nt两个驱动程序版本同时它又推出一个新的win32 drivers mode (wdm)驱动类型如 usb设备这个新的类型实际是在windows nt的驱动模型的基础上增加了即插即用等内容先前叫windowsnt5.0 3? ?d3? ? wdm在近一两年还无法替代其它类型的设备驱动0 级2 级和 3 级而用户程序运行在3 级上具体的限制在不同的操作系统中是不同的windows 95支持的驱动类型很多主要是 vxd 和打印机驱动两类 运行在intel 系统的0 级上对任何i/o 设备有全部访问权 驱动通常以放在windowssystem 目

3、录下也可以在程序运行时根据需要动态地载入但打印机驱动程序不是vxd?windows 95类似kernel modeuser mode) 之分pci 通用驱动程序要求对各种硬件资源访问开发设备驱动采用的主要开发工具是微软为设备开发者提供的软件包device driver kit(ddk) ?d a? ?to ?a?t?ddk 中还定义了一些设备驱动可以调用的系统底层服务中断服务可安装文件系统服务等等但windows 95 的 ddk 由于主要使用汇编语言描述因此是基于c/c+的使用和维护都较windows ddk容易驱动程序的特点在设计驱动程序之前更需要详细了解硬件设备的特性需要了解的最主要的硬

4、件特性包括设备的总线结构设备采用什么总线结构非常关键如 isa 和 pci? ?y?3d ?22?寄存器要了解设置的控制寄存器以及这些寄存器工作的特性设备错误和状态要了解如何判断设备的状态和错误信号port也就是通过cpu 的 in/out指令进行数据读写但 pci 规范不包括从属dma 的说明设备内存许多设备自身带有内存有的设备还要通过驱动程序设置设备的接口寄存器在 ddk文档中有规定这是根据设备的不同而不同的但基本功能就是完成设备的初始化中断的设置如前面所说但驱动程序所要完成的工作却是相同的仅在需要的地方指出两个操作系统的不同? pci 器件的资源和对pci 器件中断的服务所有软件扩展 r

5、om 码pci bios 规范有完整的有关pci bios 功能的描述 在 pci 设备驱动程序的初始化过程中devicevendorindex 1y?pc ibios确认其存在总线号这是该器件利用总线号功能的 pci 配置空间设备驱动就需要从配置空间获得硬件的参数包括所用的中断号存储器的地址存储器映射方式等读写配置空间可以调用bios 中断 1ah?y?y? (0cfch) 进行读写最重要的是获得基址寄存器(badr)?3?y2?t? ?apci 设备分配新的资源而基址 4 是按内存方式映射的可以读对应端口的配置寄存器(configuration register)?d? 0 位表示其是按内

6、存方式设置的内存方式和i/o 方式的配置寄存器的含义参见文献如果要获得基址的大小然后读基址寄存器从第 4 位开始的0 的数目表示基址的大小则从第 2 位开始的0 的数目表示基址的大小查找pci 设备的工作是由halgtebusdata 完成的但 ddk 推荐使用haigetbusdataoffset 函数) 端口操作在 pc 机上所以处理方法也不同它不象内存有实模式和保护模式之分在 windows 9x下而不一定非通过专门的驱动程序来完成甚至可以不用专门设计驱动程序由于pci 总线是32位的总线标准而且以前大多数c/c+编译软件都没有提供双字的函数在 windows nt下级的用户程序和用户模

7、式驱动程序直接使用 i/o 指令所以任何对i/o 的操作都需要借助内核模式驱动来完成一是在驱动程序中使用ioreportresourceusage 报告资源占用函数读写另一种是驱动程序修改nt 的 i/opermissions map(iopm)?a ?3d2 ? 3?i/o 指令进行操作用户程序设计简单程序不能移植到非intel 的系统中 ? ? ? ? ?e?cpu 寻址方式上的不同windows 采用了分段分页机制如图这样使应用程序产生一种错觉这样做最大的好处就是一个程序可以很容易地在物理内存容量不一样的编程人员使用虚拟存储器可以写出比任何实际配置的物理存储器都大得多的程序通过分段机制再

8、通过分页机制线性地址被分割成页目录(page directory)? ?d?win32 进程时并建立它自己的页目录页目录的地址也同时放入进程的现场信息中系统首先从cpu 控制器cr3 中读出页目录所在的地址再根据页表得到实际代码最后再根据页偏移访问特定的单元但应用程序读写的是虚拟地址从物理地址到线性地址的转换工作也是由驱动程序来完成的使用ddk 的 vmmcall?y?3d ? ?3?2? a?vxd 的系统服务mapphystolinear pvoid mapphystolineag(const void * physaddr,dword nbytes,dword flags);其中第一个参

9、数physaddr 就是要映射的内存的物理地址的起始位置flags 必须设置为0?1? ? ?2? ?比如要映射物理内存ed000000h 开始的 4096 个字节 pchar *pointertopage=(pchar)mapphystolinear(pvoid)oxed000000,4096,0);而将 pointertopage 传递给调用驱动的用户程序而通过对这个指针的操作就可以实现对物理内存ed000000h 进行读写首先调用ioreportresourceusage 请求使用设备的内存再使用mmmapiospace 把设备的内存映射到虚拟空间调用 mmunmapiospace断开设

10、备的内存和虚拟空间的连接) 中断的设置响应与调用应该在驱动程序中完成完成ddk 还提供了响应中断事件的服务vpicd 服务用来管理所有硬件中断事件对一个特定的irq 中断源或者允许其它vxd 重载中断处理函数要处理硬件中断应该从vhardwareint继承一个类个类中在 windows nt中设备驱动首先使用 halgetinterrupuvector将与总线有关的中断向量转换为系统的中断向量 ?da ?3d?y?2 ? ?1|? ?t? 1? ?a?t ?deviceiocontrol 函数就可以同设备驱动程序交换数据了可以调用closehandle(hvxd)这种调用方式也是windows nt调用设备驱动的标准方法如 dpmi 方式在两个

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论