windows nt环境下fddi网卡驱动程序设计 |
|
字号: 小 大 |
n; yhfddichar.minorndisversion=yhfddi_ndis_minor_version; 这两个属性决定驱动程序是ndis的哪个版本所支持,我们所用的是ndis3.0
yhfddichar.disableinterrupthandler=yhfddidisableinterrupt; yhfddichar.enableinterrupthandler=yhfddienableinterrupt; yhfddichar.isrhandle=yhfddiinterruptservice; yhfddichar.handleinterrupthandler=yhfddihandleinterrupt;
以上四项属性是中断处理所需的上边缘服务函数的入口点(句柄)。fddi网卡驱动程序需要有smt站管理功能,而smt是以中断处理方式进行的,故这四项属性在fddi网卡驱动程序中是很重要的。
yhfddichar.initializehandler=yhfddiinitialize; 此项注册的是驱动程序的初始化函数句柄。
yhfddichar.queryinformationhandler= yhfddiqueryinformation; yhfddichar.setinformationhandler=yhfddisetinformation; 这两项注册的是参数查询和设置函数的句柄。
yhfddichar.sendhanler= yhfddisend; yhfddichar.transferdatahandler= yhfdditransferdata; 主要提供数据发送和接收函数句柄。
yhfddichar.resethandler=yhfddireset; 此项注册网卡软硬件重置函数句柄。
yhfddichar.halthandler= yhfddihalt; 此项注册网卡驱动程序挂起函数句柄。
yhfddichar.checkforhandler=null; yhfddichar.reconfigurehandler=null; 这两个上边缘服务函数是fddi网卡驱动程序所不提供的,故置为null。
填好这些结构以后,调用以下函数实现驱动程序的注册:
ndismregisterminiport( yhfddiwrapperhandle, &yhfddichar, sizeof(yhfddichar));
其中yhfddiwrapperhandle是在此之前初始化wrapper调用ndisminitializewrapper所得的句柄。
如果调用ndismregisterminiport不能返回ndis_status_success,必须在退出driverentry之前释放已经分配的资源(如yhfddiwrapperhandle等),故调用
ndisterminatewrapper(yhfddiwrapperhandle,null)。
这样驱动程序没能正确注册,亦不能正常运行。
第四节 网卡驱动程序对象查询与设置
如果ndis的管理实体要查询或设置一个特定的网络对象,它必须提供一个32位的oid。oid的结构如下:图2.3.0 oid结构图
由上可以看到,oid可分为三大类:
所有ndis驱动程序都有的一般对象;
特定介质的对象;
特殊的与具体实现相关的对象(如多目地址表的长度)。
一般的和特定介质的oid被记录在windows nt ddk中,对于这些oid ddk文本指明了相关的对象能否通过miniportqueryinformation查询参数和通过miniportsetinformation设置参数。
oid也可被分为操作特性(如多目地址表长度参数)和统计参数(如广播包接收)。最后oid可分为必须的和可选的两种。
oid的前三个字节表明oid的不同类别,而最后一个字节确定这一类别内特定的信息管理对象。
针对于fddi网卡,被查询的oid的第一个字节为0x03。而ndis所查询的介质相关参数为:
0x03010104 oid_fddi_long_max_list_size 0x03010108 oid_fddi_short_max_list_size 0x03010102 oid_fddi_long_current_addr 0x03010106 oid_fddi_short_current_addr
tcp/ip传输驱动程序所要查询的fddi oid为:
0x03010102 oid_fddi_long_current_addr 0x03010103 oid_fddi_long_multicast_list 0x03010107 oid_fddi_short_multicast_list
通过以上两阶段的查询,ndis和tcp/ip驱动程序就分别了解了网卡驱动程序对其的支持,从而进行相应的捆绑,以便数据传输时正确选择网卡驱动程序。
第五节 开发环境与调试方法
开发环境:
fddi网卡驱动程序的开发环境为nt server 3.51,sdk,ddk for workstation 3.51, vc++4.1,硬件平台为586。
调试平台:
主机为nt server 3.51,windbg32 目标机为nt workstation3.51 (check 944)
调试方法:
※利用dbgprint把目标机上关键信息通过串口传到主机进行分析,以得出ndis驱动程序的调度机制和运转状况;
※利用assert产生异常断点,由主机对异常进行控制
※自定义宏,进行分级控制,以根据不同情况产生不同调试信息
第四章 与smt移植相关的问题讨论
在本yhfddi网卡驱动程序中,smt的移植是极其关键的一部分,主要承担了驱动程序中硬件初始化和中断延迟处理。但由于smt是相对独立的软件,这样就有一个ndis wrapper与smt间参数传递的问题。所以本章主要讨论miniport驱动程序与smt的关系和移植smt过程中初始化的要求、中断处理的要求,ndis wrapper与smt如何传递参数。
(一)miniport fddi网卡驱动程序与smt的关系。
在第一章已经谈及网卡驱动程序主要实现osi参考模型中的物理层和mac层。而对于fddi网络的物理层又可分为介质相关子层和介质无关子层。
对于我们的fddi/pci是基于x.3.19、x3.148、x3.166和x3.229而实现的。
smt在整个iso七层模型中属低两层范畴。下图是iso模型与fddi层次的对应关系,从而可知fddi miniport驱动程序在nt网络结构中的位置。
即在windows nt fddi网卡驱动程序应包含smt,实现fddi拓扑环上的站管理。
而在驱动程序内部smt主要是在miniport驱动程序中的中断延迟处理上边缘服务中实现的,也可以说是将smt嵌入中断延迟处理程序中,实现ndis接口对smt的正确调度。
yh-fddi驱动程序的实现可分为硬件无关部分和硬件相关部分。
移植smt过程中初始化的要求.
这里的初始化主要是指硬件初始化,包括寄存器的初始化和数据结构的初始化,由smt共用的硬件相关例程库中硬件初始化部分来完成. 我们在开发过程序是调用fddi_main(bdd_t*bdd)这个函数来调用smt共用的硬件相关例程库的.可见使用fddi_main(bdd_t*bdd)时,需要传递bdd这个参量,而bdd_t这个数据结构的定义如下: 它包含了各类硬件寄存器的基址,所以要对其进行正确赋值就必须首先在nt的内存中映射一块虚存与网卡内存相对应,也就实现了bdd_t结构的赋值,对fddi_main(bdd_t *bdd)的正确调用.
因此,我们在调用fddi_main前首先将网卡上寄存器内存空间映射到nt的虚存空间上,并将bdd结构正确赋值.以映射bsi_phy_base为例,具体过程如下:
pchar destination; bdd_t *bdd; ndis_physical_address physicaladdress; ulong baseaddress; ndis_status status; baseadress =0x0d0000+bsi_phy_base; ndissetphysicaladdresshigh(physicaladdress,0); ndissetphysicaladdresslow(physicaladdress,baseaddress); status=ndismmapiospace( (pvoid *)&destination, miniportadapterhandle, physicaladdress, bsi_phy_len ); bdd->bsi_vir_base=(pchar) destination; adapter-> bdd->bsi_vir_base= bsi_vir_base; /*对adapter结构中的bdd结构赋值,以便在其它上边缘函数中使用这些虚存基地址*/中断处理要求.
对于中断处理,在smt中主要调用cspintrhandandler()来实现.我们的fddi网卡驱动程序是miniport方式的,若在isr中做此处理将占用大量系统资源,使系统崩溃,所以我们采用只在isr中进行中断的排队,而在dpc中调用cspintrhandler()来完成中断处理.
在中断处理方面还有一个中断屏蔽和中断使能的问题,这两方面smt并不提供,故我们要正确处理. 具体处理方法见第三章.
ndis wrapper与smt间参数如何传递.
miniport方式的网卡驱动程序中,网卡上有中断时,系统反映给ndiswrapper,再由wrapper调度中断处理上边缘服务实现中断处理,在我们的yhfddi网卡驱动程序的中断具体处理是smt完成的所以在调用cspintrhandler时应将adapter结构传进smt以便在以后应用.
如在处理接收中断时,处理的最后应调用ndisindicatefddireceive,向ndiswrapper指示以接收到一个数据包,而ndisindicaterfddireceive的调用需要adapterminiporthandle作为参数,这就必须一级级从中断延迟处理函数(yhfddi handleinterrupt)中将adapter结构传递下来. 当然,其它方面如发送,也会有类似的问题需要考虑.
总之,对于smt的移植,需要详尽的在程序中做好接口,才能实现与smt的数据交换.
结束语
ndis规范在网络两层间提供了一个统一界面,ndis对网络本身而上一页 [1] [2] [3] [4] 下一页 |
|
编辑:Cn-Admin |
 |
GoogLe 提供的内容 |
更多... |
|
|
|
|
|
 |
最新推荐论文 |
更多... |
|
|
|
|
|
|
|