PCI设备Windows通用驱动轨范设计
所要完成的工作却是不异的,所以下面以Windows 9x为主进行介绍,仅在需要的处所指出两个操作系统的分歧。下面从这几方面谈判解决这些问题的路子#e#下面从这几方面谈判解决这些问题的路子:
(1)设备初始化
PCI设备驱动轨范要实现识别PCI器件、寻址PCI器件的资本和对PCI器件间断的处事。PCI系统BIOS功能供给了BIOS的访谒与节制的具体特征,所有软件(设备驱动轨范、扩展ROM码)将经由过程尺度间断号1AH挪用BIOS功能访谒非凡部件。PCI BIOS规范有完整的有关PCI BIOS功能的描述[3]。
在PCI设备驱动轨范的初始化过程中,操作指定器件识别号(device_id)、厂商识别号(vendor_id)、检索号(index)搜索PCI器件,经由过程挪用PCI BIOS确认其存在,并确定其物理位置:总线号、器件号和功能号,这是该器件/功能在系统中的独一寻址标识表记标帜。操作总线号、器件号和功能号可以寻址该器件/功能的PCI设置装备摆设空间(configuration space)。
接下来,设备驱动就需要从设置装备摆设空间获得硬件的参数。PCI设备的良多参数,搜罗所用的间断号,端口地址的规模(I/O)体例、存储器的地址(存储器映射体例)等,都可以从PCI设置装备摆设空间的各基址所对应的寻址空间中获得。读写设置装备摆设空间可以挪用BIOS间断1AH,
也可以先向设置装备摆设空间地址寄放器(0CF8H)写入总线和设备号(在前面搜索PCI器件时获得的)和寄放器号,再对设置装备摆设空间数据寄放器(0CFCH)进行读写。对设备驱动来说,最主要的是获得基址寄放器(BADR),不能认为PCI器件资本老是设计设备时设置的初值,系统可能会按照硬件情形为PCI设备分配新的资本。我们所设计的PCI设备使用的基址1-3都是按I/O空间映射的,而基址4是按内存体例映射的。确定一个端口是按什么体例映射的,可以读对应端口的设置装备摆设寄放器(Configuration Register)。读出后,判定其0位,若是0位为数值0,暗示其是按内存体例设置的,否则为I/O体例设置的。内存体例和I/O体例的设置装备摆设寄放器的寄义参见文献[3]。若是要获得基址的巨细,可以向基址寄放器写入FFFFH,然后读基址寄放器,若是是内存体例,从第4位起头的0的数目暗示基址的巨细,若是是I/O体例,则从第2位起头的0的数目暗示基址的巨细。
在Windows NT下,查找PCI设备的工作是由HalGetBusData完成的,也可以使用前述的法子读取设置装备摆设寄放器,但DDK举荐使用HaiGetBusDataOffset函数。
(2)端口操作
在PC机上,I/O端口寻址空间和内存寻址空间是分歧的,所以措置体例也分歧。I/O空间是一个64K字节的寻址空间,它不象内存有实模式和呵护模式之分,在各类模式下寻址体例不异。在Windows 9x下,用户轨范可以直接使用I/O指令,而不必然非经由过程专门的驱动轨范来完成,所以若是软件对硬件的操作美全是经由过程I/O端口操作来完成的,甚至可以不用专门设计驱动轨范,直接由应用轨范来完成对硬件的节制。因为PCI总线是32位的总线尺度,在进行I/O操作时凡是要进行双字(DWORD)操作,而且以前年夜年夜都C/C++编译软件都没有供给双字的函数,所以需要机关双字操作读写函数inpd/outpd。
在Windows NT下,系统不许可处于优先级3级的用户轨范和用户模式驱动轨范直接使用I/O指令,若是使用了I/O指令将会导致特权指令意外(privileged instruction exception)。所以任何对I/O的操作都需要借助内核模式驱动来完成。具体的做法有两种:一是在驱动轨范中使用IoReportResourceUsage陈述资本占用,然后使用READ_PORT_XXX、WRITE_PORT_XXX函数读写,最后使用IoReportResourceUsage打消资本占用;另一种是驱动轨范改削NT的I/OPermissions Map (IOPM),以使系统许可用户轨范对指定的I/O端口进行操作,这时用户轨范采用凡是的I/O指令进行操作。后者的利益是速度快、用户轨范设计简单,但牺牲了移植性,轨范不能移植到非Intel的系统中,而且若是多个轨范同时读写统一端口轻易导致冲突。
(3)内存的读写
Windows工作在32位呵护模式下,呵护模式与实模式的根柢区别在于CPU寻址体例上的分歧,这也是Windows驱动轨范设计中需要着重解决的问题。Windows采用了分段、分页机制(图1),这样使应用轨范发生一种错觉,好象轨范中可以使用很是年夜的物理存储空间。这样做最年夜的益处就是一个轨范可以很轻易地在物理内存容量纷歧样的、设置装备摆设规模分歧很年夜的计较机上运行,编程人员使用虚拟存储器可以写出比任何现实设置装备摆设的物理存储器都年夜得多的轨范。
- 声卡安装向导中文版(11-12)
- VxWorks实时操作系统下MPC8260ATM驱动的实现(11-11)
- Linux内核解读入门(11-09)
- Linux操作系统网络驱动程序编写(04-11)
- Linux系统下USB摄像头驱动程序开发(04-25)
- Linux系统中如何正确安装摄像头驱动(04-25)