Win2000/XP下读写数据终端设备PCI寄存器的方法及系统

阅读: 评论:0

著录项
  • CN200710142882.5
  • 20070802
  • CN101131680A
  • 20080227
  • 中兴通讯股份有限公司
  • 毕泽红
  • G06F13/10
  • G06F13/10

  • 广东省深圳市南山区高新技术产业园科技南路中兴通讯大厦法务部
  • 中国,CN,广东(44)
  • 信息产业部电子专利中心
  • 梁军
摘要
本发明公开了一种Win2000/XP下读写数据终端设备PCI寄存器的方法及系统,所述方法包括:Win32应用程序通过虚拟设备驱动为自身所在进程向Win2000/XP操作系统申请IO端口读写权限,Win32应用程序向Win2000/XP操作系统发出读写PCI寄存器的请求,若Win2000/XP操作系统鉴权同意该请求,Win32应用程序根据PCI寄存器地址确定出PCI协议数,并通过向特定IO端口写入所述PCI协议数来实现对PCI寄存器的读写;所述系统包括权限申请模块、驱动申请权限模块、鉴权模块和寄存器读写模块。本发明使得Win32应用程序能够以间接方式读写PCI寄存器。
权利要求

1.一种Win2000/XP下读写数据终端设备PCI寄存器的方法,其特征在于, 包括步骤:

A、Win32应用程序通过虚拟设备驱动为自身所在进程向Win2000/XP操 作系统申请IO端口读写权限;

B、Win32应用程序向Win2000/XP操作系统发出读写PCI寄存器的请求, 若Win2000/XP操作系统鉴权该Win32应用程序所在进程具有IO端口读写权 限,则同意该请求;

C、Win32应用程序根据PCI寄存器地址确定出PCI协议数,并通过向特 定IO端口写入所述PCI协议数来实现对PCI寄存器的读写。

2.如权利要求1所述的方法,其特征在于,所述步骤A与步骤B之间还 包括虚拟设备驱动向Win32应用程序回复权限申请成功消息的步骤。

3.如权利要求1所述的方法,其特征在于,Win32应用程序采用异步方 式通过输入输出控制函数和虚拟设备驱动通信。

4.如权利要求1所述的方法,其特征在于,所述步骤A具体包括步骤:

Win32应用程序为自身所在进程向虚拟设备驱动申请IO端口读写权限;

虚拟设备驱动申请非缓冲空间,根据Win32应用程序所在进程的IO许可 位图将空间大小设定为8K字节,将其中和PCI寄存器有关的IO端口地址位 赋值为1,其余赋值为0;

虚拟设备驱动将所述空间的内容覆盖到Win32应用程序所在进程的IO许 可位图中。

5.如权利要求4所述的方法,其特征在于,所述步骤B中,当Win2000/XP 操作系统对Win32应用程序所在进程进行IO端口访问鉴权时,允许Win32应 用程序所在进程访问赋值为1的IO端口地址位,使得Win32应用程序可以读 写PCI寄存器。

6.如权利要求5所述的方法,其特征在于,虚拟设备驱动将所述空间的 内容覆盖到Win32应用程序所在进程的IO许可位图中之前,先对Win32应用 程序所在进程的IO许可位图的内容进行备份处理;

Win32应用程序读写PCI寄存器完成后,虚拟设备驱动根据所述备份的IO 许可位图的内容来恢复Win32应用程序所在进程的IO许可位图。

7.如权利要求1所述的方法,其特征在于,Win32应用程序根据数据终 端设备的总线号、设备号、功能号及目标读写PCI寄存器的地址确定出一个32 位的PCI协议数。

8.如权利要求7所述的方法,其特征在于,所述PCI协议数的第0至7 位是目标PCI寄存器的地址,第8至10位是PCI功能号的值,第11至15位 是PCI设备号的值,第16至23位,是PCI总线号的值,第24至30位是保留 的,为0,第31为是PCI配置空间使能位,设置为1。

9.一种Win2000/XP下读写数据终端设备PCI寄存器的系统,其特征在于, 包括权限申请模块、驱动申请权限模块、鉴权模块和寄存器读写模块,其中,

权限申请模块,属于Win32应用程序,用于通过驱动申请权限模块为自身 所在进程向Win2000/XP操作系统申请IO端口读写权限;

驱动申请权限模块,属于虚拟设备驱动程序,用于为Win32应用程序向 Win2000/XP操作系统申请IO端口读写权限;

鉴权模块,属于Win2000/XP操作系统,用于鉴权Win32应用程序所在进 程是否具有IO端口读写权限;

寄存器读写模块,属于Win32应用程序,在OS鉴权模块确定Win32应用 程序所在进程具有IO端口读写权限时,用于根据PCI寄存器地址确定出PCI 协议数,并通过向特定IO端口写入所述PCI协议数来实现对PCI寄存器的读 写。

10.如权利要求9所述的系统,其特征在于,还包括权限释放模块和驱动 释放权限模块,其中,

权限释放模块、属于Win32应用程序,通过和驱动释放权限模块交互,完 成自身所在的Win32应用程序的IO端口读写权限的释放;

驱动释放权限模块,属于虚拟设备驱动程序,用于通过和Win2000/XP操 作系统交互为Win32应用程序释放IO端口读写权限。

说明书
技术领域

技术领域

本发明涉及通信领域的数据终端设备,尤其涉及一种Win2000/XP下读写 数据终端设备PCI寄存器的方法及系统。

背景技术

基于PCMCIA(Personal Computer Memory Card International Association, PC机内存卡国际联合会)物理接口的数据终端设备,往往内置USB主控制器 芯片,例如NEC和Philips 1562等等,这些芯片在PC侧以符合PCI(Peripheral Component Interconnect,外部设备互连)总线协议的USB(Universal Serial Bus, 通用串行总线)主控制器的形式存在,同时暴露出PCI寄存器,通常芯片厂家 对主控制器的配置信息就保存在这些寄存器中。

芯片出厂时配置信息通常被固化在PCI寄存器中,对于需要修改寄存器值 的场合,一般通过昂贵的专有设备来实现。而芯片应用厂商往往没有专有设备, 出于成本和兼容性的考虑,只能在PC机中对PCI寄存器进行修改。

在Win98的操作系统下,现有技术可通过直接访问IO端口来实现PCI寄 存器的读写,而在Win2000/XP的操作系统下,由于Win2000/XP操作系统把 系统分层,使得Win32程序,即普通的应用程序无法直接对PCI寄存器进行读 写,从而导致在必须使用Win2000/XP操作系统的场合,无法完成对PCI寄存 器的读写。

发明内容

本发明提供一种Win2000/XP下读写数据终端设备PCI寄存器的方法及系 统,用以解决现有技术中无法在Win2000/XP下用Win32应用程序读写数据终 端设备的PCI寄存器的问题。

一种Win2000/XP下读写数据终端设备PCI寄存器的方法,包括步骤:

A、Win32应用程序通过虚拟设备驱动为自身所在进程向Win2000/XP操 作系统申请IO端口读写权限;

B、Win32应用程序向Win2000/XP操作系统发出读写PCI寄存器的请求, 若Win2000/XP操作系统鉴权该Win32应用程序所在进程具有IO端口读写权 限,则同意该请求;

C、Win32应用程序根据PCI寄存器地址确定出PCI协议数,并通过向特 定IO端口写入所述PCI协议数来实现对PCI寄存器的读写。

所述步骤A与步骤B之间还包括虚拟设备驱动向Win32应用程序回复权 限申请成功消息的步骤。

Win32应用程序采用异步方式通过输入输出控制函数和虚拟设备驱动通 信。

所述步骤A具体包括步骤:

Win32应用程序为自身所在进程向虚拟设备驱动申请IO端口读写权限;

虚拟设备驱动申请非缓冲空间,根据Win32应用程序所在进程的IO许可 位图将空间大小设定为8K字节,将其中和PCI寄存器有关的IO端口地址位 赋值为1,其余赋值为0;

虚拟设备驱动将所述空间的内容覆盖到Win32应用程序所在进程地IO许 可位图中。

所述步骤B中,当Win2000/XP操作系统对Win32应用程序所在进程进行 IO端口访问鉴权时,允许Win32应用程序所在进程访问赋值为1的IO端口地 址位,使得Win32应用程序可以读写PCI寄存器。

虚拟设备驱动将所述空间的内容覆盖到Win32应用程序所在进程的IO许 可位图中之前,先对Win32应用程序所在进程的IO许可位图的内容进行备份 处理;

Win32应用程序读写PCI寄存器完成后,虚拟设备驱动根据所述备份的IO 许可位图的内容来恢复Win32应用程序所在进程的IO许可位图。

Win32应用程序根据数据终端设备的总线号、设备号、功能号及目标读写 PCI寄存器的地址确定出一个32位的PCI协议数。

所述PCI协议数的第0至7位是目标PCI寄存器的地址,第8至10位是 PCI功能号的值,第11至15位是PCI设备号的值,第16至23位,是PCI总 线号的值,第24至30位是保留的,为0,第31为是PCI配置空间使能位,设 置为1。

一种Win2000/XP下读写数据终端设备PCI寄存器的系统,包括权限申请 模块、驱动申请权限模块、鉴权模块和寄存器读写模块,其中,

权限申请模块,属于Win32应用程序,用于通过驱动申请权限模块为自身 所在进程向Win2000/XP操作系统申请IO端口读写权限;

驱动申请权限模块,属于虚拟设备驱动程序,用于为Win32应用程序向 Win2000/XP操作系统申请IO端口读写权限;

鉴权模块,属于Win2000/XP操作系统,用于鉴权Win32应用程序所在进 程是否具有IO端口读写权限;

寄存器读写模块,属于Win32应用程序,在OS鉴权模块确定Win32应用 程序所在进程具有IO端口读写权限时,用于根据PCI寄存器地址确定出PCI 协议数,并通过向特定IO端口写入所述PCI协议数来实现对PCI寄存器的读 写。

还包括权限释放模块和驱动释放权限模块,其中,

权限释放模块、属于Win32应用程序,通过和驱动释放权限模块交互,完 成自身所在的Win32应用程序的IO端口读写权限的释放;

驱动释放权限模块,属于虚拟设备驱动程序,用于通过和Win2000/XP操 作系统交互为Win32应用程序释放IO端口读写权限。

本发明通过虚拟设备驱动来为Win32应用程序和PCI硬件搭桥,以间接的 方式使得Win32应用程序能够读写PCI寄存器,从而解决了现有技术中无法在 Win2K/XP下用Win32程序读写数据终端设备的PCI寄存器的问题,达到了方 便的PCI寄存器读写的效果,节省了时间和成本,提高了数据终端设备产品研 发的定制化能力和速度。

附图说明

图1为本发明Win2000/XP下读写数据终端设备PCI寄存器的系统的结构 框图;

图2为本发明Win2000/XP下读写数据终端设备PCI寄存器的方法的流程 图;

图3为本发明中虚拟设备驱动为Win32应用程序所在的进程申请读写IO 端口的权限的流程图;

图4为本发明中PCI协议数的示意图;

图5为本发明中Win32应用程序通过向特定IO端口写入PCI协议数的示 意图。

具体实施方式

为解决上述现有技术中存在的无法在Win2000/XP下用Win32应用程序读 写数据终端设备的PCI寄存器的问题,本发明通过虚拟设备驱动来为Win32 应用程序和PCI硬件搭桥,以间接的方式使得Win32应用程序能够读写PCI 寄存器。

下面将结合各个附图对本发明的具体实现过程进行进一步详细的说明。

请参阅图1,该图为本发明Win2000/XP下读写数据终端设备PCI寄存器 的系统的结构框图,由图中可见,本发明所述系统从逻辑的角度涉及到4个层 面,一是Win32应用层,二是驱动层,三是OS(操作系统)层,四是PCI硬 件层。其中OS层和PCI硬件层是已有的技术,也就是说OS层指Win2000/XP, 已经提供了对读写IO端口的鉴权,由于现有技术中Win32应用程序的IOPM (IO Permission Bit Map,IO许可位图)无法通过该鉴权,而导致不能读写IO 端口,更不能读写PCI寄存器。PCI硬件层是指数据终端设备,这类设备一般 都嵌入了USB和PCI的转接芯片,而这些芯片的配置寄存器如果能够方便的 被读写,将给数据卡厂商带来极大的便利性和可扩展性。Win32应用层和驱动 层是本发明的重点,本发明根据Win32应用程序不被OS内核信任,而虚拟设 备驱动被内核信任的特点,利用虚拟设备驱动来为Win32应用程序申请读写IO 端口的权限。

本发明中,应用层依赖驱动层来申请和释放权限,驱动层完成实际的申请 和释放功能。Win32应用程序通过OS层把PCI寄存器的地址解析成IO端口 地址,操作系统OS层和PCI硬件层交互实现对PCI寄存器的读写,从而从应 用程序的角度,实现了直接读写PCI寄存器。

由图1可见,本发明所述系统主要包括以下模块:鉴权模块、PCI硬件模 块、权限申请模块、权限释放模块、驱动申请权限模块、驱动释放权限模块和 寄存器读写模块。其中鉴权模块和PCI硬件模块是现有技术已经实现的模块, 而其他模块属于创新部分,下面分别简述一下各个模块的主要功能。

鉴权模块,属于Win2000/XP操作系统的一部分,用于鉴权Win32应用程 序所在进程是否有操作IO端口的权限。

PCI硬件模块,是由硬件组成的计算机外设,进一步说,只要以基于USB 架构的PCI总线方式实现的硬件,即只要硬件中包括USB Host Controller芯片 组,例如Philips、NEC等,就在本发明适用的范围之内。

权限申请模块,属于上层Win32应用程序的一部分,功能是通过和驱动申 请权限模块交互,完成自身所在的Win32应用程序的IO端口读写权限的申请。

权限释放模块,属于上层Win32应用程序的一部分,功能是通过和驱动释 放权限模块交互,完成自身所在的Win32应用程序的IO端口读写权限的释放, 释放权限的目的主要是为了维护Win2000/XP操作系统的稳定性和安全性。

驱动申请权限模块,属于虚拟设备驱动程序的一部分,功能是通过 Win2000/XP操作系统对自身的信任,为上层Win32应用程序申请IO端口读写 权限。

驱动释放权限模块,属于虚拟设备驱动程序的一部分,功能是通过 Win2000/XP操作系统对自身的信任,为上层Win32应用程序释放IO端口读写 权限。

寄存器读写模块,属于上层Win32应用程序的一部分,功能是把要读写的 PCI寄存器映射为IO端口地址,并对其进行读写。

上述七个模块从逻辑的角度分属于四个层面,其中权限申请模块、权限释 放模块和寄存器读写模块属于Win32应用层,驱动申请权限模块和驱动释放权 限模块属于驱动层,鉴权模块属于OS层,PCI硬件模块属于硬件层。本发明 系统的各个组成模块之间互相影响,紧密依存,共同实现了在Win2000/XP下 读写数据终端设备的PCI寄存器。

请参阅图2,该图为本发明Win2000/XP下读写数据终端设备PCI寄存器 的方法的流程图,其主要包括步骤:

步骤10、Win32应用程序向虚拟设备驱动发出读写PCI寄存器的请求,请 求替自己所在进程申请IO端口的读写权限。

本步骤中,Win32应用程序通过IOCTL(Input Output Control,输入输出 控制)函数的方式和虚拟设备驱动通信,实现必须采用异步的方式来完成。 Win32应用程序异步打开虚拟设备,发送异步IOCTL请求给虚拟设备驱动, 虚拟设备驱动直接开始处理或者将请求入队。若虚拟设备驱动将请求入队,则 向Win32应用程序返回Pending(挂起),并依次处理队列中的请求,此时Win32 应用程序必须处理驱动Pending(挂起)的情况,并且建议处理Cancel(取消) 的情况。进一步说,由于虚拟设备驱动的特殊性,Win32应用程序不能用同步 等待的方式来获取结果,本部分中有三个关键技术点:一个是:Win32应用程 序应该用多线程的方式来处理和虚拟设备有关的交互,另一个是Win32应用程 序必须异步处理包括Pending和Cancel在内的多种情况。三是若驱动返回 Pending,Win32应用程序需要使用信号量来挂起等待,而驱动执行完实际的请 求后,必须给Win32应用程序发送信号量来通知,这样Win32应用程序就可 以根据返回的结果看对IOPM的修改是否成功。

步骤11、虚拟设备驱动向Win2000/XP操作系统内核申请读写IO端口的 权限。

请参阅图3,该图为本发明中虚拟设备驱动为Win32应用程序所在的进程 申请读写IO端口的权限的流程图,其具体实现过程为:

步骤110、虚拟设备驱动申请NonCache(非缓冲)空间,根据Win32应 用程序所在进程的IO许可位图将空间大小设定为8K字节;

操作系统是根据进程的IOPM(IO Permission Bit Map,IO许可位图)来 确定进程是否有访问IO端口的权限。Win2000/XP支持至少16位的IO端口寻 址,也就是64K个IO设备地址,如果用一个bit表示一个IO设备,那么需要 8K的空间,Windows操作系统给每个进程分配8K空间用于标志对IO端口的 访问情况。本步骤中需要将非缓存空间大小设定为0x2000,也就是8K字节。

步骤111、虚拟设备驱动将申请的非缓存空间中和PCI寄存器有关的IO端 口地址位赋值为1,其余赋值为0;

虚拟设备驱动将和PCI寄存器有关的IO端口地址,即该空间的0xcf8和 0xcfc位赋值为0x1,把其他bit赋值为0x0。进一步说,就是允许Win32应用 程序所在进程对0xcf8和0xcfc的IO端口进行访问。

步骤112、虚拟设备驱动将所述空间的内容覆盖到Win32应用程序所在进 程的IO许可位图中;

另外,为了本发明方案的稳定性和安全性,需要在对IOPM块覆盖之前, 先对其内容进行备份处理,然后再覆盖,覆盖后,Win32应用程序可以依此完 成对PCI寄存器的读写,读写完成之后,需要根据备份的IOPM内容来恢复 IOPM。

步骤12、虚拟设备驱动向Win32应用程序返回权限申请成功消息。

步骤13、Win32应用程序向Win2000/XP操作系统发出读写PCI寄存器的 请求,Win2000/XP操作系统接到请求后,认为PCI寄存器属于IO端口,于是 查该Win应用程序所在进程的IO端口读写权限,Win2000/XP操作系统会根据 赋值的0x1来允许对0xcf8和0xcfc这两个IO端口地址的访问。

步骤14、Win32应用程序根据数据终端设备的总线号、设备号、功能号及 目标读写PCI寄存器的地址确定出一个32位的PCI协议数。

请参阅图4,该图为本发明中PCI协议数的示意图,PCI协议数的第0到 7位,共8bit是寄存器地址,根据PCI协议0到1bit必须为0,也就是说寄存 器号必须大于4,这个所有芯片的配置寄存器都大于4,是满足的。PCI协议数 的第8到10位,共3bit是PCI功能号的值,也就是说功能号是不超过7的数 值。PCI协议数的第11到15位,共5bit是PCI设备号的值,也就是说设备 号是不能超过31的数值。PCI协议数的第16到23位,共8bit是PCI总线号 的值,也就是说总线号是不能超过255的数值。PCI协议数的第24到30位是 保留的,为0。第31为是PCI配置空间使能位,应该设置为1。进一步说,就 是用IO端口这种方式对PCI寄存器进行读写,能够寻址最多256条总线,32 个设备,8功能,128寄存器的寻址,并且对寄存器寻址必须第0到1位是保 留的0。

步骤15、Win32应用程序通过向特定IO端口写入所述PCI协议数来实现 对PCI寄存器的读写。

请参阅图5,该图为本发明中Win32应用程序通过向特定IO端口写入PCI 协议数的示意图,本发明中完成对PCI寄存器的读写是靠向特定IO端口读写 PCI协议数来完成的,对于PCI寄存器,需要对IO端口地址0xcf8和0xcfc进 行访问,当Win32应用程序已经申请了对这两个地址读写的权限以后,就可以 开始实现对PCI寄存器的读写了。对于读,先向0xcf8写入PCI协议数,之后, 对应PCI设备的寄存器的值会自动反映到IO端口地址0xcfc上,此时Win32 应用程序从0xcfc地址读取数值即可。对于写,先向0xcf8写入PCI协议数, 然后向IO端口地址0xcfc写入需要设定的值即可。

显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发 明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及 其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。

本文发布于:2023-04-15 06:44:02,感谢您对本站的认可!

本文链接:https://patent.en369.cn/patent/4/87004.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 369专利查询检索平台 豫ICP备2021025688号-20 网站地图