CSDN博客

img CandyCat

VxD技术的应用

发表于2001/5/17 22:00:00  1107人阅读

VxD技术的应用 作者:汤琳 发布时间:2001/02/08
 
文章摘要:
  本文首先介绍了通过PC机实现V5协议测试的方法,引申出在Win95平台上的ISA总线数据传送问题,重点介绍了VxD技术。
       

正文:  

VxD技术的应用   

1 PC机V5协议测试方法

  1.1前言
  现代电信网的发展趋势是网络集中、高效、优化。随着Internet的普及,通信业务网的接入能力受到严峻的考验。电信网络发展宽带通信业务和多媒体业务的任务已刻不容缓。要想实现接入网的数字化、宽带化和智能化,必须解决当前电信网中传输瓶颈的问题。现有的采用模拟传输方式为主要传送媒体的接入网,难以适应接入网网络升级和提供新业务的要求。因此V5接入网将成为现代接入网的标志。现代接入网的重要特征是:它与交换机之间的业务节点接口应为开放的、标准的V5接口,V5接口在提供综合业务和新业务等方面具有无可比拟的优越性,V5接入网取代远端模块是发展的必然。由于设备供应商本能的保护性反应,V5.X接口的开放性缺乏法规保障;而且不同厂商设备之间互通性、兼容性及完备性较差。因此V5接口协议测试成为令人非常关注的问题。在理想的情况下,不同厂家按相同协议标准生产的设备应能在网路环境下正常通信,但是实际情况并非如此,由于设计者对标准的不同理解,以及各个厂家持不同的技术政策,导致其产品的某些性能要么偏离标准,要么是标准的一个子集。这样,使得不同设备生产厂家生产的本地交换机(LE)和接入网(AN)设备在互连时出现一些问题(如系统启动过程不一致而无法连接等)。设备在使用过程中也会因协议配合或设备存在的缺陷出现一些问题(如表现为V5二层链路频繁建链或出现大量呼损等)而影响服务质量。而当设备互连发生问题时,又急需用统一的尺度来衡量设备的一致性,以找出问题的根源。目前,随着V5接口在我国商用的展开,各种设备蜂拥而来,这样,解决通信设备互连产生的协议问题将成为推广V5接口应用的一个不可忽略的因素,V5协议分析仪对于这些问题的查找定位和分析解决是至关重要的。我们自行研制的V5协议测试仪具有使用方便,成本低,易于升级的优越性,而VxD技术正是其中的关键技术。

  1.2 V5协议测试仪原理
  V5协议测试仪(以下简称为V5TS)由两部分组成:ISA总线标准的硬件插卡和协议处理软件。每块板卡最多可处理一条2048kbit/s数据链路中的3条C通路(TS16、TS15和TS31),可根据测试需要选择一块或两块板卡;协议处理软件以Windows95/98作为运行平台。硬件插卡及其协议处理软件组成一个完整的测试系统,可用作LE侧或AN侧的V5协议测试设备或监测设备。
  V5TS的测试原理如图1-1所示。方式A和B为协议仿真方式,方式C为协议监视方式。方式A中,V5TS模拟AN侧来
测试LE侧的V5功能;方式B中,V5TS模拟LE侧来测试AN侧的V5功能;在方式C中,V5TS是作为监视设备工作的,可以监听LE和AN之间传递的信息帧。
  
                图1-1
  测试的依据是原邮电部颁发的《接入网V5.2接口现场测试规范》,共有7组84项测试条款,如表1-1所示.
          表1-1 接入网V5.2接口现场测试规范
  

  1.3测试仪硬件原理
  ISA总线插卡的结构如下图1-2所示。

  
                图1-2 V5TS硬件结构图
  其中E1 Controller 采用了Brooktree公司的Bt8510,完成物理层功能和TS16的LAPD操作;HSCX(高级串行通信控制器)选用了Siemens公司的SAB82525,完成了TS15和TS31的LAPD操作;μP使用了DALLAS半导体公司的DS80C320;DPRAM(双端口随机存储器)运用了IDT71342,用于μP(微处理器)和MP(主处理器)之间的数据通信;I/O Port用于在μP和MP之间传递控制信号。与本文有关的就是DPRAM和I/O Port。

  1.4测试仪软件框架
  测试仪的软件部分根据实现的处理器的不同分为两大模块:μP模块和MP模块。
  其中μP模块采用汇编语言作为程序开发语言,主要完成硬件初始化工作和消息收发工作;MP模块分为四个子模块:
  · 主控模块;
  · 系统管理模块;
  · 协议处理模块;
  · 数据收发模块。
  由于我们使用的操作平台为Windows95平台,在MP的数据收发模块中必须调用VxD程序以完成与ISA插卡的数据交换。

2 VxD技术简介

  2.1 VxD的概念
  Intel处理器从386开始具有4个特权级,即0级到3级。0级特权级最高,而3级最低。这四个级别可形象的看成是4个同心圆,出于性能的考虑,Win95仅使用了0级和3级,一般的程序运行于3级,0级程序可以使用处理器的所有资源和能力。VxD(Virtual Device Driver)是用来扩展Windows操作系统功能的一类程序。它以DLL的形式链入Windows操作系统的核心层(ring 0)。VxD主要解决不能被ring 3层应用程序处理的一系列问题。

  2.2 高层应用程序中的处理
  Windows 95 通过DeviceIoControl函数实现设备输入输出控制(IOCTL)接口,该函数可以向指定的VxD发送命令和传递相应的数据。可以用CreateFile函数打开此VxD,用DeviceIoControl向此VxD发送命令,最后用CloseHandle函数关闭此VxD即可。
  下面简单介绍一下上述三个函数:
  1) HANDLE CreateFile( LPCTSTR lpFileName, DWORD dwDesiredAccess,
    DWORD dwShareMode,LPSECURITY_ATTRIBUTES lpSecurityAttributes,
    DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes,
    HANDLE hTemplateFile );
  函数成功调用将返回一个指定文件的打开的句柄。参数lpFileName是指向一个字符串的指针,该字符串包含需生成或打开的对象名,对象包括文件、磁盘设备、目录等,在此我们使用的是VxD文件;dwDesiredAccess是访问对象的模式,有读、写、读写或设备查询等;dwShareMode是对象的共享模式,如果该参数为零则对象不可共享;lpSecurityAttributes是指向安全属性结构的指针,该结构决定了返回的句柄能否被子进程继承;  dwCreationDisposition指出了当文件存在或不存在时的各种操作,如值CREATE_ALWAYS代表生成一个新文件,如果文件已经存在则覆盖原文件并清除原有的属性;dwFlagsAndAttributes指明了文件属性和标志,如FILE_ATTRIBUTE_HIDDEN代表文件属性为隐藏;hTemplateFile是一个句柄,该句柄指向一读属性的模板文件,Windows95中的此参数必须为NULL。
  2) BOOL DeviceIoControl(HANDLE hDevice,DWORD dwIoControlCode,
    LPVOID lpInBuffer,DWORD nInBufferSize,LPVOID lpOutBuffer,
    DWORD nOutBufferSize,LPDWORD lpBytesReturned,
    LPOVERLAPPED lpOverlapped );
  函数成功调用返回为非零值。参数hDevice是要执行操作的设备的句柄,由调用CreateFile而获得;dwIoControlCode指出了操作的控制代码;lpInBuffer为指向一缓冲区的指针,缓冲区中是有待操作的数据;nInBufferSize是lpInBuffer缓冲区的大小,单位是字节;lpOutBuffer也为指向一缓冲区的指针,缓冲区中是操作的输出数据;nOutBufferSize是lpOutBuffer缓冲区的大小,单位是字节;lpBytesReturned指向一变量以接收存储到lpOutBuffer中的数据的大小,单位也是字节;lpOverlapped是OVERLAPPED结构的指针。
  3) BOOL CloseHandle( HANDLE hObject );
  若函数调用成功则返回一个非零值。参数hObject是一个打开对象的句柄。
  可以在调用CreateFile函数时指定模块名、文件名或标志某个VxD的登记簿项来打开一个静态的或动态可装载的VxD。若此VxD存在且支持设备IOCTL接口,CreateFile将返回一个设备句柄,此句柄可作为DeviceIoControl函数调用时的参数。否则CreateFile将失败,并将上一个错误值设为ERROR_NOT_SUPPORTED或ERROR_FILE_NOT_FOUND。错误值可调用函数GetLastError获得。
  在打开VxD时,必须按下列形式指定其名称://./VxDName,其中VxDName可以是指定模块名、文件名或标志某个Vx的登记簿项的名称。
  我们指定扩展名.VXD,函数将在标准搜索路径(一般为Windows下的system)中查找此文件,如:
  HANDLE hDevice;
  hDevice=CreateFile("////.//testv5.vxd",0,0,NULL,0,FILE_FLAG_DELETE_ON_ CLOSE, NULL);
  同一个VxD可以打开任意多次,每次打开时,CreateFile都会提供此VxD的一个唯一句柄,但内存中决不会装入两份VxD。为保证系统能在关闭VxD的最后一个事例时将其从内存中清除,在打开动态可装载的VxD时应指定FILE_FLAG_DELETE_ON_CLOSE值。
  可用DeviceIoControl向VxD发命令。此时应指定先前打开的设备句柄,控制代码及输入输出参数。设备句柄标志了要向其发送命令的VxD,控制代码则指定了要此VxD完成的一个操作。
  DeviceIoControl的输入输出参数包括用于向VxD传入数据或接收VxD中传出数据的缓冲区的大小或地址。是否要用到这些参数取决于指定的VxD如何处理控制代码。
  当用户结束某个VxD之后,可用CloseHandle函数将与其相关的设备句柄关闭。下例将关闭某个句柄:       CloseHandle(hDevice)。将VxD关闭并不需要将其从内存中删除,CloseHandle在系统中没有与此VxD相关的有效句柄时将会把此VxD从内存中清除。

  2.3 VxD程序中的处理
  VxD可通过处理VxD的控制过程中W32_DEVICEIOCONTROL消息以支持设备IOCTL接口。
  当应用程序调用CreateFile函数时,系统向指定的VxD的控制过程发送W32_DEVICEIOCONTROL消息以决定此VxD是否能够支持设备IOCTL接口。对于动态可装载VxD,系统在首次打开此VxD时将向其发送SYS_DYNAMIC_INIT控制消息。
当应用程序调用DeviceIoControl时,系统将调用由给定的设备句柄标识的VxD之控制过程。此时EAX寄存器中包含有W32_DEVICEIOCONTROL消息,ESI寄存器中包含有一个DIOCParams结构的地址。此结构中包含应用程序在DeviceIoControl函数中指定的所有参数以及其它一些信息。VxD应检测DIOCParams结构的dwIoControlCode成员以决定待执行的操作,lpvInBuffer成员中包含VxD完成该操作所需的一些支持数据。在处理完控制代码之后,VxD应将它需要返回给应用程序的信息拷贝到lpvOutBuffer成员所指的缓冲区中。
  若VxD成功地处理了控制代码,则在返回前应将EAX寄存器清零.否则应将EAX置为某个非零值。

3. V5协议测试仪中VxD程序的设计

  3.1 VxD程序的编写工具
  我们选用MicroSoft 的VC++和Vireo Software的VtoolsD for Win95作为程序开发语言,NuMege的SoftIce95作为调试工具。
  VtoolsD开发包提供了对VxD编程的全线C++类库支持,其中最重要的是Quick VxD程序,它提供了诸多选项用来快速生成VxD代码框架,这与VC++中的Class Wizard是极为相似的。在Quick VxD可视化编程环境中,Quick VxD根据编程者的各种选择快速创建一个VxD工程文件。此文件包括:C/C++头文件,C/C++代码文件,C/C++工程文件。头文件中含有VxD所必须的类声明,还有VxD控制消息处理函数声明,Windows ring3 API调用VxD的调用入口声明等;代码文件中,QuickVxD预先生成了许多须继续编程来扩充其内在功能的类成员函数。编程者通过在这些类成员函数中添加代码,从而完成定制的功能。

  3.2 编写中的细节问题
  在V5协议测试仪中,VxD程序主要完成对ISA插卡的双口RAM的读写操作。我们命名插卡设备为TESTV5,设备类为Testv5Device,我们在应用中只须对Testv5Device的成员函数OnW32DeviceIoControl 进行一些改动。
  在高层程序和VxD程序中,我们定义了两个常量DIOC_WRITE和DIOC_READ,作为高层程序传递给VxD的控制代码,根据控制代码的不同,VxD程序中的OnW32DeviceIoControl函数对DPRAM进行读或写操作。根据插卡上硬件的跳线,DPRAM的起始地址为0x000D0000,对DPRAM的读写操作实际上就如同简单的数组的赋值。由于存储器的大小有限制,我们在读写操作中要注意判断是否到达存储器尾部。

4. 后记

  我们的实际思路使得测试仪具有很好的扩展性和可升级性,我们利用相同的硬件实现了七号信令的监测,不同的只是协议分析软件,而VxD技术可以类似的应用。在设计中我们使用了ISA总线,随着计算机技术的不断发展,我们会采用PCI总线技术,VxD技术在Windows 95/98平台下仍将有其顽强的生命力,我们可以用其实现DMA,以提高数据交换的速度。

作者会员名:tliwant

 
阅读全文
0 0

相关文章推荐

img
取 消
img