公务员期刊网 精选范文 驱动程序设计范文

驱动程序设计精选(九篇)

驱动程序设计

第1篇:驱动程序设计范文

关键词: μC/OS-II;驱动设备管理;串口驱动

中图分类号:TP316文献标识码:A文章编号:1009-3044(2007)06-11649-02

1 引言

uC/OS-II 是一个简单、高效的嵌入式实时操作系统内核,被应用到各种嵌入式系统中。目前,它支持 x86、ARM、PowerPC、MIPS 等众多体系结构,并有上百个商业应用实例,其稳定性和可用性是经过实践验证的。uC/OS-II仅仅是操作系统内核,没有象其它嵌入式操作系统一样提供了文件系统管理和驱动设备管理部分,所以对于在uC/OS-II操作系统下开发应用程序的人员来说,应用程序是直接调用设备的底层函数,这就需要开发应用程序的人员能够比较了解底层的细节,一旦硬件设备较多,需要访问硬件设备的应用程序较多,应用程序开发人员要自己解决驱动程序的管理问题就比较麻烦。而拥有了驱动设备管理模块,驱动程序的安装可交给底层开发人员来完成,应用程序的开发人员就可以通过统一的接口函数来访问底层,同时也方便多个设备驱动程序的统一管理。

2 驱动设备管理模块的设计

驱动设备管理模块相当于操作系统和底层设备驱动程序的桥梁,一方面底层的相关函数在执行的时候可能需要操作系统提供的资源,另一方面,上层应用程序是通过操作系统来获取对底层设备的信息和对其操作的权力,在设计中,建立了驱动设备列表和驱动程序描述表来实现上述两个主要功能。下面对这两个表作详细介绍:

驱动设备列表是一个双向链表,驱动设备列表的大小是动态的,因此可以任意向其中添加新设备,应用程序通过设备来访问驱动设备列表,来找到该设备在驱动程序描述表对应的索引号,再从驱动程序描述表里面找到该设备的底层操作函数。链表设备的结构体定义如下:

typedef struct dlnode{

struct dlnode *next;

struct dlnode *previous;

unsigned short drvNum;

DEV_HDR *head;

} DL_NODE;

驱动设备列表程序中提供了3个主要功能函数供底层开发人员和应用程序的开发人员使用

(1)添加设备 dlladd(unsigned char drvName )

此函数向链表中添加新的节点,与此同时也会向操作系统申请操作该设备的需要的信号量的资源,以及存储数据所用的缓冲区,申请缓冲区的大小是由该设备的特性所决定,这个可以由底层设计人员在设备加入函数中设定。

(2)卸载设备 dlldelect(unsigned char drvName )

当开发人员决定卸载这个设备的时候就调用此函数,它在链表中删除这个设备对应得节点,并且释放该设备申请的各种资源。

(3)查找unsigned short dllGet(UNIT8 drvName)

这个函数主要是提供给应用程序的开发人员使用,对于应用程序的开发人员来说通过设备名来查找设备索引号。

驱动程序描述表主要是存储驱动程序底层函数的入口点,它不同于驱动设备列表,结构上来说它不是动态的,它向操作系统申请了固定的空间来存储这个表,故这个表的大小由底层开发人员根据可能需要的最多的设备数量来设定,整个表由多个结构体DRV_ENTRY组成,表的定义为DRV_ENTRY DrvTable[MAX_DEV];每个设备都是以结构体DRV_ENTRY的形式在表中存储,如果一个设备对应DrvTable中的第i成员DrvTable[i] ,那么I 就是它的索引号结构体定义如下:

typedef struct {

unsigned char drvName;

unsigned char in_use;

FUNCPTR de_open ;

FUNCPTR de_close ;

FUNCPTR de_read ;

FUNCPTR de_write ;

FUNCPTR de_ioctrl ;/ *de_open,……de_ioctrl就是该设备对应的不同底层函数的入口*/

}DRV_ENTRY ;

驱动程序描述表的主要功能是应用程序根据设备索引号来找到该表中对应的设备,并且找到该设备的底层函数入口,该设备的底层函数入口是在设备安装到表里的时候加入的,用户调用该安装程序传入实参来安装各种设备的驱动程序,设备安装函数如下:

unsigned char DrvInstall

(unsigned char i, FUNCPTR popen, FUNCPTR pclose,FUNCPTR pread, FUNCPTR pwrite, FUNCPTRpioctrl) // 传入的参数为底层函数

{ unsigned char *err;

unsigned char i ;

DRV_ENTRY *pDrvEntry= NULL;

OSSemPend (pdevtable_event, WAIT_FOREVER, err);/*此信号量在添加设备函数 dllall中定义并初始化*/

if(*err == OS_NO_ERR)

return(FALSE);

else{

pDrvEntry = &DrvTable[i];//查找与索引号对应的设备

pDrvEntry->in_use = TURE;

pDrvEntry->de_open = popen; // 将底层函数的入口放在表中pDrvEntry->de_close= pclose;

pDrvEntry->de_read = pread;

pDrvEntry->de_write = pwrite;

pDrvEntry->de_ioctrl = pioctrl;

OSSemPost (pdevtable_event); // 释放该信号量

if(*pDrvEntry != NULL)

return(FALSE);

else

return(TRUE);} }

除了设备安装函数之外,还有设备删除,显示设备信息等函数,它们都是对驱动程序描述表的操作,结构和设备安装函数类似。

3 驱动设备管理功能的具体应用

3.1 串口驱动程序简介

串行通信是两个设备之间的一种通讯标准,两个设备通过收、发数据信号线线进行全双工数据通讯,数据在一根数据信号线上一位一位地进行传输,每一位数据都占据一个固定的时间长度。这种通信方式的特点是,使用的数据线少,在远距离通信中可以节约通信成本,其传输速度比并行传输慢。串口驱动程序主要是对设备的串行接口进行控制,使其能够通过串行接口与通讯另一方进行数据交换,它的分5个主要部分组成:串行接口的初始化,串行接口的关闭,读取串行接口的数据,向串行接口发送数据,串行接口的通讯参数设定,这5个部分的功能就对应open,close ,red ,write ,ctrl这5个底层通用接口函数,在NEC PD78F0376 平台下分别UART_init,UART_close,UART_read,UART_SendChar,UART_ctrl。其中UART_read为读取串行接口的数据操作,它的具体结构如下:

void UART_read(unsigned char *p)

{while(buffer.status != RX_FULL);

//检查缓冲区标志位,看是否已经满

DI(); //进入临界区

memcpy(p, buffer.buffer,UART_BUFFERSIZE);

//接收缓冲区数据

EI();//退出临界区

prx_uart = buffer.buffer;

//重新将接收缓冲区数据的指针移到缓冲区开始的位置

}UART_read为向串行接口发送数据,它的具体结构如下

UART_SendChar (unsigned char *ucData){

TXB6 = *ucData;//将要传输的数据写入到发送寄存器

while(!STIF6); //等待传输标志位指示传输完成

STIF6=0;//清零传输标志位

3.2 将串口驱动程序加入操作系统中

这个部分由底层开发人员完成,它的主要工作有:初始化驱动设备列表,在驱动设备列表中加入一个名叫UART的设备 dlladd(UART ),在这个函数在申请系统资源的同时,返回该设备地索引号,并将在驱动程序描述表中该设备的结构体inuse状态置为TURE,该设备在驱动设备列表和驱动程序描述表中已经建立,执行DrvInstall(UART ,UART_init,UART_close,UART_read,UART_SendChar,UART_ctrl),这个步骤是将串口驱动程序函数的入口加入到驱动程序描述表中,最后要将串口接收的中断服务程序加入到操作系统中去。

3.3 应用程序通过设备驱动程序管理模块访问设备

应用程序需要知道要访问的设备的设备名,访问串口设备执行dllGet(UART),该函数返回该设备在驱动程序描述表中的索引号I,根据索引号执行DrvFind(I),该函数返回驱动程序描述表与该设备对应的设备入口结构体drventry;在这个结构体中就有该设备的底层函数入口,要执行设备相应的操作如打开,调用Drvopen (drventry)即可,这对应用程序开发者来说是较为方便的

4 结语

文章给出的设备驱动程序管理模块其作用是为上层控制设备驱动程序带来方便,并不针对某个特定的开发环境,仅要求在μC/OS-II操作系统下,具有通用性,实际的底层开发人员还需要根据硬件环境的不同自己编写open,close ,red ,write ,ctrl等底层操作函数。

参考文献:

[1]周启平,张扬. VxWorks下设备驱动程序及BSP开发指南[M].北京: 中国电力出版社,2004.

[2]任哲. 嵌入式实时操作系统μC/OS-Ⅱ原理及应用[M].北京: 北京航空航天大学出版社, 2005.

[3](美)Jean J.Labrosse,邵贝贝译.嵌入式实时操作系统μC/OS-II(第2版).北京: 中国电力出版社,2001.

[4]刘乐善,叶济忠,叶永坚.微型计算机接口技术原理及应用.武汉: 华中理工大学出版社,2000.

[5]孙涵芳 Intel 16位单片机[M].北京: 北京航空航天大学出版社.

[6]J. Glenn Brookshear. Computer Science: An Overview, Sixth Edition, 北京:人民邮电出版社,2003.

第2篇:驱动程序设计范文

关键词:嵌入式;CF卡;低层驱动;存储设备

中图分类号:TB文献标识码:A 文章编号:1672-3198(2012)12-0162-01

0 引言

设备驱动程序是构成Linux内核的主要部分,不合理的驱动设计会导致系统内核出现紊乱,由于不稳定而导致系统崩溃,使行成重要数据丢失或严重后果。因此,设计合理的驱动程序,有助于保障系统的整体稳定性。在S3C2410开发板下设计合理的驱动程序是本文研究的重点。

S3C2410的硬件平台是基于ARM公司的ARM920T处理器核,采用32位微控制器,价格低,功耗低,性能高;软件平台通过u-boot移植和内核编译完成,所有这些特性使S3C2410为 linux操作系统内核驱动程序设计提供了较好的解决方案。

目前,嵌入式系统中应用最广泛的存储卡是CF卡。多数情况下,使用PCMCIA控制器实现CF卡的操作,为了减少设备使用和成本降低,本文在没有PCMCIA控制器情况下,探讨分析设备驱动程序设计步骤,CF卡的配置及底层驱动如何工作等问题,研究实现了利用CF卡作为存储设备的嵌入式Linux系统。

1 系统设计

嵌入式系统使用CF卡作为存储设备的设计目前有很多,而开发设备的选型不同,开发的方法不同,本系统使用Linux操作系统,以S3C2410为开发平台,以ARM920T处理器为模板来实现CF卡的嵌入式系统。

驱动程序开发首先需对Linux操作系统中原有的IDE程序进行改造,用后台程序管理CF卡的热插拔事务,同时CF卡以Memory寻址访问方式进行8位寻址。在对Linux设备进行驱动程序设计时,具体设计步骤如下:

(1)启动系统,将设备登记到相应的设备数组,并返回设备的主驱动号。利用设备号对此数组进行索引。调用设备注册函数module_register_chrdev()进行设备注册。

(2)为驱动函数定义功能函数,当系统调用这些功能函数时,系统将自动运行函数定的模块实现特有的功能。

(3)当一个模块使用完成时,启动动态的卸载模块函数,调用cleanup_module()函数,并调用设备注销函数即可卸载函数。

在进行设计时,需注意Linux设备驱动程序接口和几个重要的数据结构。具体有以下四层接口:应用进程与内核、内核与文件、文件系统与设备驱动程序、设备驱动程序与硬件设备。

每个驱动程序都有一个数据结构,包含的函数指针指向所开发的接口,内核用主设备号作为索引访问数据结构。

2 接口和重要的数据结构

设备驱动程序是操作系统硬件设备和内核的接口,Linux 操作系统中,Linux 操作系统采用统一的接口,在硬件设备、设备驱动程序、文件系统、内核、应用程序进程间有相连的接口。

驱动程序有一个file_operations的数据结构,该数据结构提供了很多接口,其中常用的接口有open、read、write、seek、release等,为驱动程序开发提供了保障。驱动程序中struct inode数据结构为设备和文件对应了唯一的inode号,驱动程序中同时也使用了struct file、struct device 数据结构。

3 CF卡基本配置

CF卡在存储操作前,对CF卡进行的相关配置主要有以下几个方面:配置GPIO并分配寻址端口,用于传输CF卡信号。配置CF卡的属性存储空间和寻址访问方式。在系统中CF卡使用Memory寻址访问方式,将属性寄存器配置为0x00,其他属性寄存器保持默认值。验证对属性寄存器的值,当驱动属性值与默认值不匹配时,则说明Memory寻址访问方式没有正确使用CF卡,此时需修改属性值为默认值即可。

4 CF卡驱动程序设计

4.1 底层驱动实现

CF卡存储备份需要通过CF卡的底层驱动实现,这就要求CF卡能准确的接收及响应系统对它的I/0请求。具体流程如下:

(1)在读写命令时,使用LBA寻址模式来访问CF卡。当驱动对CF卡的I/O请求进行正确接收后,此时把相关参数值和ATA命令值写入对应的寄存器,并向CF卡ATA命令,即完成了ATA命令。

(2)填写ATA命令控制块后,CF卡可以利用轮询的方法对发送的命令做出响应。

(3)受外部环境影响造成CF卡没有接收到命令或者接收命令出错时,可以使用软重置将其恢复到初始状态,并重新发送该ATA命令。

快捷的实现存储备份需使CF卡能及时响应热插拔,把CF卡设定为TureIDE工作模式,这样CF卡就可以随意移动。在系统层注册字符型设备CFMGR文件实现探测热插拔事件、与应用层通信,实现分配或释放系统资源,从而驱动CF卡;在应用层及时监听热插拔事件并采用Select阻塞机制,达到尽量少的占用CPU资源。

4.2 驱动程序实现

驱动程序的作用在于为应用程序提供机制,它是内核的一部分。该驱动程序实现了设备初始化,在内核和设备间相互传送数据,读取、回送数据,检测错误等功能,开发的难点在于高效请求处理、中断、1/O操作等方面功能设计。

5 结语

本文通过系统驱动程序的设计流程分析,研究程序开发的接口和数据结构,对CF卡进行配置,研究开发驱动程序,实现了CF卡存储备份和快速热插拔,使其便于在其他系统中应用。

参考文献

[1]嵌入式Linux 中CF卡的管理研究[EB/OL].140.112.99.135/ntu/showthread.php?threadid=67.

第3篇:驱动程序设计范文

一、两种任务驱动教学方式定义

1、正向任务驱动

(1)对应学生学习阶段:初级阶段---认知程序。

(2)任务驱动方式:根据任务编写程序,运行程序,得出结果。

(3)任务驱动目标:已知程序清单,完成程序运行结果,并对结果进行分析。

2、逆向任务驱动

(1)τρ生学习阶段:中级阶段---剖析程序

(2)任务驱动方式:根据结果完成程序填空,运行程序,得出结果。

(3)任务驱动目标:已知程序结果,完成程序填空,并对运行结果进行验证。

二、正向任务驱动式

正向任务驱动式是在任务和程序已知的情况下,只需运行程序,得出结果,再对结果进行分析来完成任务。其任务形式是”任务->程序->?”,需要完成结果,故称为正向任务驱动。

教学一例:

1、提出任务:(1)求5!的值。(2)问s设定为什么类型的数据变量可以容纳积值?

要求:通过程序运行和结果分析,实现对程序的理解和对知识点的掌握。

2、给出条件:给出二组程序。给出条件。

方法一:

#include

main( )

{ int s;

s=5*4*3*2*1;

printf(“s=%d”,s); }

方法二:

#include

main( )

{ float s;

s=5*4*3*2;

printf(“s=%f”,s); }

要求:通过运行程序,记录结果,达到看懂程序。

3、收集学生对求5!任务解决的方法及结果分析。

方法一:输出结果:s=120

方法二:输出结果:s=120.000000

两种方法运行结果一致。

同学们得出:s变量设定为int和float类型时都可以容纳正确积值。

要求:在对结果分析后,学生应该掌握数据变量与容纳数据大小之间的关系。

4、任务驱动反思:”任务->程序->?”的任务驱动形式难度系数小,多用于知识入门阶段。任务通过结果对比完成。在新知识入门阶段学习中,有利于同学们熟悉程序,掌握知识点。同时可以提高学生学习兴趣,树立学习自信心。

要求:教师应归纳知识要点。

三、逆向任务驱动式

逆向任务驱动式是在任务和结果已知的情况下,需要补写程序,运行程序,再对结果进行验证来完成任务。其任务形式是”任务->?->结果”,需要完成填空,故称为逆向任务驱动。

教学一例:

1、提出任务:求1+2+ … +99+100的值。(1)对程序填空(共2空);(2)运行程序,记录结果,并验证结果。

要求:通过程序补写和结果验证,实现掌握循环控制语句的使用方法。

2、给出条件:部分程序和输出结果已给出。

#include

main( )

{ int i=1,sum=__⑴__;

while(i

{ sum=sum+i; __⑵__ ; }

printf("sum=%d\n",sum); }

给出结果:sum=5050

要求:重点掌握循环控制变量i的初值、终值和步长值设定,以及用于累加和变量的初值清零工作。

3、收集学生对任务解决的方法及结果分析。

方法一填空:(1)0 (2)i=i+1

程序运行结果:sum=5050(程序运行结果和给出结果一致)

结论:这部份同学认识到,变量sum用于存放累加值,初值应清零。

因此:⑴空填0;而数列每项值是加1递增,因此:⑵空填i=i+1。

方法二填空:(1)1 (2)i=i+1

程序运行结果:sum=5051(程序运行结果和给出结果不一致,计算结果错误。)

结论:少数同学忽视了变量sum初值应该清零。

因此:⑴空填1 ;而数列每项值是加1递增,因此:⑵空填i=i+1。

要求:在完成程序填空后,学生应该掌握循环控制变量初值、终值、步长值的设定方法。

4、任务驱动反思:”任务->?->结果”的任务驱动形式难度系数中,多用于知识巩固阶段。任务通过程序填空和结果验证实现。

要求:教师应归纳知识要点。循环控制变量三要素(初值、终值、步长值)的设定是完成任务的重要前提。

第4篇:驱动程序设计范文

前言

windows nt是一个功能全面的操作系统,具有完全集成式的连网能力,它的网络模型开始于mac子层,网络接口卡(network interface card以后简称网卡或nic)驱动程序驻留在其中。通过相关的网卡把windows nt与网络连接起来,但一直到80年代后期,许多传输协议的实现受限于mac层接口的独特实现,因为mac层定义了协议与网卡之间的转换机制。

1989年,microsoft和3com两公司提出了一个定义mac层与osi模型高层协议驱动程序之间的网络设备接口规范(network device interface specification : ndis),ndis给数据交换提出了一个灵活的环境,它规范了软件接口──称为ndis接口,传输协议可用它与网卡驱动程序进行通信。因此在windows nt环境下开发核心态网卡驱动程序应遵循ndis规范。

对于高速网络fddi(fiber distributed data interface)网卡驱动程序还需要smt(station management)站管理功能的实现,否则将不能作为一个fddi站连入环结构中,只能实现点到点间的数据通信。故有必要将smt软件移植到网卡驱动程序中,这将又导致对miniport nic驱动程序编程框架的破坏,于是有必要形成fddi网卡驱动程序(包含smt)与windows nt操作系统的良好接口──由逻辑网卡的注册和mac层驱动程序的初始化来完成。

所以,本课题旨在深入研究应用microsoft公司的ddk(device driver kit)将smt移植于windows nt的fddi网卡驱动程序过程中如何注册miniport nic驱动程序。即怎样正确注册逻辑网卡和mac驱动程序的初始化。着重讨论与初始化相关的上边缘函数的使用和调用关系以及初始化过程中遇到的各种问题的具体解决。

第一章windows nt环境下fddi网卡驱动程序

总体结构介绍

第一节windows nt网络结构

§1.1.1 windows nt网络体系结构

windows nt的网络体系结构是基于国际标准化(iso)制定的标准模型──开放式系统互连(open system interconnection:osi)参考模型分层建立的,这种方式有利于随时扩展其它功能和服务。

windows nt网络模型开始于mac子层,网卡驱动程序就驻留在其中。它通过相关的网卡把windows nt与网络连接起来,图中的多个网卡表明在一台运行windows nt的计算机上能使用多种网卡。

这一网络体系结构包括两个重要接口──ndis接口与传输驱动

程序接口(tdi)。这两个接口把两个层隔离开来,办法是相邻的部件只允许按单一的标准来写,不允许多重标准。例如一个网卡驱动程序(在ndis接口的下面)就不需要特地按每个传输协议来写它的代码块,恰恰相反,该驱动程序是写给ndis接口的,它通过符合ndis的相应传输协议来请求服务。这些接口包含在windows nt的网络体系结构中,以容纳可移植、可互换的模块。

在两个接口之间,是传输协议。它在网络中起着组织者的作用。一个传输协议规定了数据以何种方式呈递给下一个接收层,以及如何对数据相应地进行打包。它通过ndis把数据传给网卡驱动程序,并通过tdi把数据传给转发程序(redirector)

tdi之上是转发程序,它把本地的网络资源申请转送给网络。

为了能和其他厂商的网络互连,windows nt允许有多个转发程序。对于每一个转发程序windows nt计算机必须也有一个相应的供应者(provider)(由网络厂商提供)。多供应者路由选择程序决定适当的供应者,然后借助于供应者,对应用请求到相应的转发程序做出选择。

§1.1.2 windows nt网络驱动程序

windows nt支持两种类型的网络驱动程序

传输驱动程序

实现数据链路层中的逻辑链路控制子层协议和传输层协议。向 下与ndis接口,向上与tdi接口。

网卡驱动程序

实现对物理层的管理和数据链路层中介质访问控制子层协议,通过ndis向下管理物理网卡,向上与传输驱动程序通信。

§1.1.3 windows nt网卡驱动程序

windows nt环境下的网卡驱动程序也分为两种:

miniport网卡驱动程序:miniport驱动程序只须实现与网络硬件相关的操作(包括发送和接收)。而所有底层网卡驱动程序的通用操作(如同步),一般由ndis接口程序来实现。

full网卡驱动程序:full网卡驱动程序必须实现所有硬件相关和同步、排队等操作。例如full网卡驱动程序为了响应数据接收,需要保持本身的捆绑信息,而miniport就可以由ndis接口库来实现。

在windows nt的早期版本中,full网卡驱动程序要求开发者实现许多底层操作,来处理多处理器的核心问题以及处理器、线程的同步,这样不同的开发者在大量重复着许多相同的工作。

而miniport网卡驱动程序允许开发者仅仅写一些与网络硬件相关的代码即可,而那些通用的函数由ndis接口库来实现,这样开发出来的驱动程序减少了不必要的工作。

第二节miniport驱动程序的结构

ndis接口规范了网卡驱动程序的实现,同时也对tdi驱动程序的实现提出了一定的要求,在nt中,ndis约束下的网卡驱动程序、tdi驱动程序和系统的关系如下图所示:

图2.0 ndis约束下的网卡驱动程序、tdi驱动程序和系统的关系

miniport驱动程序包括驱动程序对象、驱动程序源代码和ndis接口库代码。windows nt ddk提供ndis.h作为miniport驱动程序的主要头文件,定义了miniport驱动程序的入口点、ndis接口库函数和通用数据结构。

上边缘函数的作用是网卡驱动与ndis接口库进行通信,而下边缘函数是tdi协议驱动程序与ndis通信的手段。

§1.2.1 miniport网卡对象

ndis用一个叫做逻辑网卡的软件对象来描述系统中的每块网卡,而逻辑网卡与windows nt设备对象的通信由i/o子系统来管理,描述网卡的设备对象包括相关的网络信息如名字、网络地址和网卡内存基地址等,它还包含与硬件相关的驱动程序状态数据(捆绑数目,捆绑句柄,包过滤数据库等)。ndis分配一个句柄到miniportinitialize这个上边缘函数的一个结构中,然后miniport网卡驱动程序将在以后提供这个句柄来给ndis调用,这个结构一直被ndis保持,并且对miniport驱动程序不透明。

当miniport网卡驱动程序初始化一块网卡时,它创立自己的内部数据结构来描述网卡,记录需要它管理的与设备相关的状态信息。当miniport网卡驱动程序调用ndismsetatttibutes或ndismsetattributesex两ndis库函数时,它传递一个句柄给这数据结构。这样,当调用miniport驱动程序入口点时,它就传递这个句柄来验证驱动程序所对应的网卡的正确性。这个数据结构为miniport网卡驱动程序所拥有并维护。

§1.2.2网络对象标识符

miniport nic驱动程序还需要维护一组对象,这些对象是系统定义的对象标识符(object idetifier:oid)来标识,以描述驱动程序的性能和当前状态信息。为查询这些信息,上层驱动程序调用ndisrequest向ndis接口库指示oid。oid表示了调用所需的信息类型,如miniport驱动程序所支持的lookahead缓冲区大小等。ndis接到上层驱动程序的查询请求,将oid传递给上边缘函数miniportqueryinformation实现对oid的查询,如果上层驱动程序请求改变状态信息则调用miniportsetinformation实现对oid的设置。

§1.2.3 miniport网卡驱动程序代码

典型的miniport nic驱动程序必须有一些函数来通过ndis接口实现上层驱动程序与硬件的通信。这些函数称为上边缘服务函数。

这些上边缘服务函数由驱动程序的开发者根据驱动程序面向的特定低层网络类型和硬件以及相应环境,可以有选择地实现,但必须保证驱动程序最基本的功能,这些基本功能包括初始化、发送、中断处理、重置、参数查询与设置和报文接收。

miniportinitialize:操作系统根据系统配置信息,检测出网卡已安装时,由ndis接口在初始化时调用,主要完成低层网络类型确定,对应于物理网卡的逻辑网卡初始化,中断信息注册,网卡与主机通讯方式的确认。i/o端口的申请与注册,内存映像,mib的初始化,物理网卡的验证与初始化等。

miniportreconfigure:支持网卡参数动态变化,和miniportinitilize一样由ndis接口以初始化级别调度执行(不能屏蔽中断,必须由驱动程序承认并清除在此期间产生的中断),支持即插即用和软配置的网卡在动态改变参数时,必须提供此函数。

miniportqueryinformation:查询网卡的状态以及网卡驱动程序的操作或统计参数,如是否支持组通讯、网卡的物理速率是否支持回环、是否支持直接拷贝等,这些参数以oid方式统一管理。

miniportsetinformation:ndis接口或协议驱动程序通过调用此接口改变驱动程序维护的oid库,一些操作参数的改变也将同时改变驱动程序状态,例如组地址的设置。

miniportreset:包括网卡硬件重置和驱动程序软件重置,软件重置包括驱动程序状态重置,以及一些相关的参数重置,还需考虑有些参数的恢复,重置时不必完成所有正在活跃的外部请求,但必须释放已占用的外部资源。

miniporthalt:挂起网卡并释放该网卡驱动程序占用的所有资源,在此期间不屏蔽中断。

miniportisr:高优先级的中断处理程序,进行的工作包括初始中断处理类型,决定是否进行中断转交,对卡上中断进行处理 等,该服务类型只在以下情况被调用:

ndis接口调用miniportinitialize和miniporthalt两函数时。

.中断处理类型设为每此中断处理过程都调用时。

为使系统能及时响应所有硬件中断,高优先级的硬件中断处理程序应尽可能的减少运行时间,防止长时间的屏蔽低优先级中断,避免造程中断丢失。

miniporthandleinterrupt:由中断延时处理程序在中断延时处理时进行调用。ndis排队所有的延时处理,该服务主要处理发送完成、报文接收、描述符用尽、溢出、网卡异常等中断。

miniportsend:ndis收到上层发送请求时经过若干协议处理再向下调用此服务过程,发送的packet已含有llc和mac头,该服务过程进行边界对齐、packet约束重整、描述符映射和报文发送、以及发送资源和packet缓冲队列管理。

miniporttransferdata:多个已和网卡捆绑的协议驱动程序在接收到报文到达指示后,向网卡驱动程序发出传送请求以拷贝各自所需的报文数据部分,网卡驱动程序根据各协议驱动程序对单个packet是否进行多次拷贝,以决定是否暂存只允许单次拷贝的packet等。

miniportcheckhandle:ndis每秒调用此服务函数一次,驱动程序发现网卡异常时报告给ndis由ndis调用miniportreset进行硬件重恢复。

miniportenableintrrupt:中断使能。

miniportdisableinterrupt:中断屏蔽。

另外,每个网卡驱动程序必须有一个初始化入口点,由driver entry函数实现,它和系统相关,由操作系统在装入驱动程序时调用,主要完成初始化ndis wrapper,再由wrapper初始生成驱动程序管理块并完成相应各种初始化工作,登录网卡驱动程序所有上边缘服务入口点,同时写入ndis版本信息。

§1.2.4 ndis接口库

ndis接口库包括在ndis.sys中,它是一个核态函数库,有一套抽象的函数,无论协议驱动程序还是nic驱动程序都连接到这个库中,以实现上下层之间的操作。

第二章fddi网卡驱动程序的加载和运行

第一节 网卡驱动程序的安装

windows nt网卡驱动程序安装的目的是实现网卡相应硬件信息和驱动程序在windows nt注册库中的注册,使windows nt能够正确识别网卡,了解所必需的软硬件信息并能在windows nt启动时加载相应驱动程序。

网卡驱动程序安装时,首先在主群组的控制面板中选择“网络”,然后添加网卡,指定相应信息文件──oemsetup.inf的路径,以完成以下两个必要的操作:

复制驱动程序到相应的系统目录(windows nt根目录\system32\drivers\)中;

在windows nt注册库中存入相应软硬件信息。

下面主要以fddi网卡为例介绍安装驱动程序所必需的工作:

§2.1.1网卡一般硬件参数

对于fddi网卡,必须在编写其oemsetup.inf文件时确定以下硬件参数:

总线类型:pci(5)……括号中的数字5表示pci总线在ndis中的总线类型代码;

厂商代号:0x5588……系统加载时确定网卡的标记,也是编程时确定pci槽号的标识;

cfid: 0x01;

介质类型:光纤(3) ……括号中的数字表示光纤在ndis中的介质类型代码;

是否支持全双工:支持。

对于其它的硬件信息在此inf配置信息文件中可有可无,如若配置,则可在驱动程序的编写时利用这些信息,方便编程,同时有利于其它应用对其参数的确定和使用。

§2.1.2 fddi网卡加载时需在注册库登录表里做的网络配置

网卡驱动程序的安装通常将创建登录表中的四个不同子键:

software registrion键,对应于驱动程序,存在于hkey_local_machine\software\company\ productname\version中。我们的fddi网卡驱动程序所对应的是hkey_local_machine\software\net612\yhfddi\yhfddi1.0;

网卡的软件登录键,存在于hkey_local_machine\software\microsoft\ windows nt\nt3.51\networkcards\yhfddi1;

驱动程序的服务登录键,存在于hkey_local_machine\system\currentcontrolset\services

网卡的服务登录键,存在于hkey_local_machine\system\currentcontrolset\services

对于每一个网络部件,一个名为netrules的特殊子键在邻近的驱动程序或网卡登录子键里创建,netrules标识网络部件为网络整体的一部分。

fddi网卡驱动程序对应的标准软件登录表项将出现在以下路径:

hkey_local_machine\software\net612\yhfddi\yhfddi1.0;

驱动程序对应的标准项的值为:

description =yhfddi/pci adapter controller

install date =……

……

refcount =0x01

servicename =yhfddi

softwaretype =driver

title =yhfddi/pci adapter controller

而且在yhfddi驱动程序相关的netrules子键下,这些值项为:

bindable =yhfddi driver yhfddi adapter non exclusiver

bindform =“yhfddisys”yes no container

class = reg_multi_sz “yhfddi driver basic”

infname =oemnad1.inf

type =yhfddisys ndisdriver yhfddidriver

use =driver

yhfddi网卡在如下路径的networkcards子键里介绍:

hkey_local_machine\software\microsoft\

windows nt\nt3.51\networkcards\yhfddi1;

网卡的标准项包括以下这些值:

description =yhfddi/pci adapter controller

install date =……

manufacturer =net612

productname =yhfddi

servicename =yhfddi01

title =[01]yhfddi/pci adapter controller

§2.1.3编写inf信息配置文件

gui inf描述语言被windows nt用以书写系统所有部件的配置文件,当然也可以用以书写网络系统各部件的配置文件,该配置文件描述了网络部件安装、配置、删除的执行过程。当网络部件进行初始安装或二次安装(通常通过ncpa进行)时,安装程序读取部件对应的配置文件,进行解释执行。gui inf描述语言由节、命令、逻辑操作、变量规范、流程控制以及一套调用dll或外部程序的机制组成,其中,节是配置文件的主体,节可分为install节(类似于函数),shell节(也类似于函数,但可调用insall和shell节),detect节(不包含命令),一个配置文件一般由若干不同类型的节组成。驱动程序的开发者根据需要可以在配置文件中编写相应代码,使得用户和系统之间能进行交互,并且由用户决定一些配置参数。

nt网卡配置文件有其一套规范,驱动程序开发者必须按规范编写配置文件,一般来说,一个配置文件至少应该提供下面三个节:

安装入口点:[identify]shell节。该节主要功能是给出安装部件的类型名,系统通过它识别该部件属于哪一大类(display,mouse,scsi,network等)中的哪一类(网络adapter,driver,transport,service,network和netprovidor),同时,还需要给出映像文件和配置文件所在的源介质及标识。

[returnoption]shell节。系统执行安装identify节后,执行该节。它主要功能是检查所需安装的部件是否支持的硬件平台和语言,并给出网卡名(有些配置文件支持多类网卡,此时必须让用户进行选择,并获得选择结果)。

[installoption]shell节。该节是配置文件得主体,也是上次安装完后再次进行配置、删除、更新的入口点。主要功能是拷贝映像文件和配置文件,生成配置的各种选项,创建该部件在注册库中对应的各种登录子树并更新重写。

第二节 驱动程序的加载过程

§2.2.1 windows nt的启动过程

第一阶段:调入装入程序。和硬件平台相关,x86机器首先由rom装入根扇区,再由根扇区装入ntldr;

第二阶段:硬件检测。x86机器调ntdetect程序最大限度地获取各种硬件设备信息,引导hal及基本卷设备驱动程序,以便引导nt内核;

第三阶段:获取注册库中各种控制信息,如用户定义的非页内存大小;第四阶段:初始化注册库 \registry\machine下system和hardware并创建currentcontrolset,为装入相关硬件设备驱动程序作准备;

第五阶段:装入基本核心驱动程序;

第六阶段:释放一些已经完成使命的装入初始数据块;

第七阶段:进一步初始化注册库,以便有些依赖于基本核心驱动程序的上层驱动程序能顺利装入;

第八阶段:服务控制器装入应该由该服务控制器装入的各种驱动程序。

§2.2.2 fddi网卡驱动程序的加载过程

在windows nt启动的第五个阶段,将加载核心驱动程序。而对于ndis网卡驱动程序是在ndis接口(ndis.sys)加载后调入运行,向ndis wrapper注册、初始化、查询设置参数等。

windows nt启动时,相应的实体如nt的服务控制器根据注册库中yhfddi驱动程序的配置注册信息,初始化ndis wrapper,并装入相应的驱动程序,生成驱动程序管理块结构,申请内存以保存各种信息,向ndis wrapper注册驱动程序。初始化和注册完毕后,再由服务控制器读取注册库中相应的链接信息。

在ndis wrapper和yhfddi驱动程序初始化和注册成功后,ndis wrapper根据系统相应的注册信息,加入和yhfddi驱动程序所对应的fddi网卡,同时读入网卡的注册信息,并进行网卡注册和网卡初始化。

在以上过程成功后,wrapper将查询和设置驱动程序的各种参数,了解驱动程序对哪些操作支持,决定对上层驱动程序的支持范围。

第三节fddi网卡驱动程序的注册

driverentry函数是windows nt ddk规定的核心驱动程序的入口点,wrapper识别到入口点后,调入驱动程序,在driverentry函数内完成两个基本注册任务:

调用ndisminitializewapper函数向ndis接口报告驱动程序将以miniport类网卡驱动程序注册。ndis建立它需要记录的驱动程序状态信息,同时返回ndiswrapperhandle,驱动程序保存这个句柄,以利后来调用ndisxxxconfiguration和initialization等函数。

填写ndisxx_miniport_characteristics属性结构,主要记录ndis版本号和驱动程序支持的miniportxxx函数的入口点,然后调用ndismregisterminiport函数实现驱动程序的整体注册。

以yhfddi为例所要注册的属性结构的内容大致如下:

ndis_miniport_characteristics yhfddichar;

(ndis_miniport_characteristics这个结构将在第三章介绍)

yhfddichar.majorndisversion=yhfddi_ndis_major_version;

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对网络本身而言,是一个带有协议功能的标准接口,对实现者而言,它应该是一个环境,这种环境不仅带有协议功能,更重要的是带有和软、硬平台无关的核心功能支持,它不会受软、硬平台的变化严重影响,无疑,它是软件的移植和兼容的可靠保证,ndis把网络的一部分共性抽象出来,并根据具体的操作系统实现系统和平台相关的基础库以保证ndis的标准性和对开发者提供最大的功能支持,这也将加速和规范开发过程,但是,在操作系统之上提供ndis基础库获得标准同时也失去直接作用于操作系统带来的灵活性以及更强的功能支持,同时,ndis处于网络中层和低层之间,低层网络的快速发展和ndis对网络部分共性的抽象必然导致ndis对实现者的滞后,例如ddk3.51提供的ndis开发环境只支持10m以太网、fddi、令牌网(802.5)、localtalk、arcnet等,而对新出现的快速以太网及atm不提供支持,这对我们如何在ndis环境下实现诸如atm的lan emulation,ip over atm、快速以太网带来很大问题。

smt是实现fddi网卡驱动程序的关键,然而由于应用ddk开发miniport驱动程序时要遵循其结构框架,所以要想完整地按其结构移植smt,就必须分解smt适应之,即要求对smt有一个很好的理解。但smt是庞大的给开发带来了一定的困难。

参考文献

【1】《device driver kit用户手册》

【2】《device driver kit核心驱动程序设计》

【3】《device driver kit网络驱动程序设计》

第5篇:驱动程序设计范文

Abstract: Windows nt is a fully functional operating system, with a fully integrated ability of networking, it started in the network model of the MAC son layer, network interface card (network interface card as nic or after nic drivers) stay in it. Through the network card related the Windows nt and network connected, but until the late 80's, many transmission implementation of the protocol is restricted to the MAC layer interface of unique realization, because the MAC layer defines the agreement and nic conversion between mechanism.

中图分类号:TP311 文献标识码:A 文章编号:

对于高速网络fddi(fiber distributed data interface)网卡驱动程序还需要smt(station management)站管理功能的实现,否则将不能作为一个fddi站连入环结构中,只能实现点到点间的数据通信。故有必要将smt软件移植到网卡驱动程序中,这将又导致对miniport nic驱动程序编程框架的破坏,于是有必要形成fddi网卡驱动程序(包含smt)与windows nt操作系统的良好接口──由逻辑网卡的注册和mac层驱动程序的初始化来完成。

所以,本课题旨在深入研究应用microsoft公司的ddk(device driver kit)将smt移植于windows nt的fddi网卡驱动程序过程中如何注册miniport nic驱动程序。即怎样正确注册逻辑网卡和mac驱动程序的初始化。着重讨论与初始化相关的上边缘函数的使用和调用关系以及初始化过程中遇到的各种问题的具体解决。

1 windows nt环境下fddi网卡驱动程序

1.1 windows nt网络结构

1.1.1 windows nt网络体系结构

windows nt的网络体系结构是基于国际标准化(iso)制定的标准模型──开放式系统互连(open system interconnection:osi)参考模型分层建立的,这种方式有利于随时扩展其它功能和服务。

windows nt网络模型开始于mac子层,网卡驱动程序就驻留在其中。它通过相关的网卡把windows nt与网络连接起来。

这一网络体系结构包括两个重要接口──ndis接口与传输驱动程序接口(tdi)。这两个接口把两个层隔离开来,办法是相邻的部件只允许按单一的标准来写,不允许多重标准。例如一个网卡驱动程序(在ndis接口的下面)就不需要特地按每个传输协议来写它的代码块,恰恰相反,该驱动程序是写给ndis接口的,它通过符合ndis的相应传输协议来请求服务。这些接口包含在windows nt的网络体系结构中,用来容纳可移植、可互换的模块。

1.1.2 windows nt网络驱动程序

windows nt支持两种类型的网络驱动程序

 传输驱动程序

实现数据链路层中的逻辑链路控制子层协议和传输层协议。向 下与ndis接口,向上与tdi接口。

 网卡驱动程序

实现对物理层的管理和数据链路层中介质访问控制子层协议,通过ndis向下管理物理网卡,向上与传输驱动程序通信。

1.1.3 windows nt网卡驱动程序

windows nt环境下的网卡驱动程序也分为两种:

 miniport网卡驱动程序:miniport驱动程序只须实现与网络硬件相关的操作(包括发送和接收)。而所有底层网卡驱动程序的通用操作(如同步),一般由ndis接口程序来实现。

 full网卡驱动程序:full网卡驱动程序必须实现所有硬件相关和同步、排队等操作。例如,full网卡驱动程序为了响应数据接收,需要保持本身的捆绑信息,而miniport就可以由ndis接口库来实现。

在windows nt的早期版本中,full网卡驱动程序要求开发者实现许多底层操作,来处理多处理器的核心问题以及处理器、线程的同步,这样不同的开发者在大量重复着许多相同的工作。

而miniport网卡驱动程序允许开发者仅仅写一些与网络硬件相关的代码即可,而那些通用的函数由ndis接口库来实现,这样开发出来的驱动程序减少了不必要的工作。

1.2miniport驱动程序的结构

ndis接口规范了网卡驱动程序的实现,同时也对tdi驱动程序的实现提出了一定的要求。 miniport驱动程序包括驱动程序对象、驱动程序源代码和ndis接口库代码。windows nt ddk提供ndis.h作为miniport驱动程序的主要头文件,定义了miniport驱动程序的入口点、ndis接口库函数和通用数据结构。

1.2.1 miniport网卡对象

ndis用一个叫做逻辑网卡的软件对象来描述系统中的每块网卡,而逻辑网卡与windows nt设备对象的通信由i/o子系统来管理,描述网卡的设备对象包括相关的网络信息如名字、网络地址和网卡内存基地址等,它还包含与硬件相关的驱动程序状态数据(捆绑数目,捆绑句柄,包过滤数据库等)。ndis分配一个句柄到miniportinitialize这个上边缘函数的一个结构中,然后miniport网卡驱动程序将在以后提供这个句柄来给ndis调用,这个结构一直被ndis保持,并且对miniport驱动程序不透明。

1.2.2网络对象标识符

miniport nic驱动程序还需要维护一组对象,这些对象是系统定义的对象标识符(object idetifier:oid)来标识,以描述驱动程序的性能和当前状态信息。为查询这些信息,上层

驱动程序调用ndisrequest向ndis接口库指示oid。oid表示了调用所需的信息类型,如miniport驱动程序所支持的lookahead缓冲区大小等。ndis接到上层驱动程序的查询请求,将oid传递给上边缘函数miniportqueryinformation实现对oid的查询,如果上层驱动程序请求改变状态信息则调用miniportsetinformation实现对oid的设置。

1.2.3 miniport网卡驱动程序代码

典型的miniport nic驱动程序必须有一些函数来通过ndis接口实现上层驱动程序与硬件的通信。这些函数称为上边缘服务函数。

这些上边缘服务函数由驱动程序的开发者根据驱动程序面向的特定低层网络类型和硬件以及相应环境,可以有选择地实现,但必须保证驱动程序最基本的功能,这些基本功能包括初始化、发送、中断处理、重置、参数查询与设置和报文接收。

1.2.4 ndis接口库

ndis接口库包括在ndis.sys中,它是一个核态函数库,有一套抽象的函数,无论协议驱动程序还是nic驱动程序都连接到这个库中,以实现上下层之间的操作。

2 fddi网卡驱动程序的加载和运行

2.1 网卡驱动程序的安装

windows nt网卡驱动程序安装的目的是实现网卡相应硬件信息和驱动程序在windows nt注册库中的注册,使windows nt能够正确识别网卡,了解所必需的软硬件信息并能在windows nt启动时加载相应驱动程序。

网卡驱动程序安装时,首先在主群组的控制面板中选择“网络”,然后添加网卡,指定相应信息文件──oemsetup.inf的路径,以完成以下两个必要的操作:

复制驱动程序到相应的系统目录(windows nt根目录\system32\drivers\)中;

在windows nt注册库中存入相应软硬件信息。

2.1.1网卡一般硬件参数

对于fddi网卡,必须在编写其oemsetup.inf文件时确定以下硬件参数:

总线类型:pci(5)……括号中的数字5表示pci总线在ndis中的总线类型代码;

厂商代号:0x5588……系统加载时确定网卡的标记,也是编程时确定pci槽号的标识;

cfid: 0x01;

介质类型:光纤(3) ……括号中的数字表示光纤在ndis中的介质类型代码;

是否支持全双工:支持。

对于其它的硬件信息在此inf配置信息文件中可有可无,如若配置,则可在驱动程序的编写时利用这些信息,方便编程,同时有利于其它应用对其参数的确定和使用。

2.1.2 fddi网卡加载时需在注册库登录表里做的网络配置

网卡驱动程序的安装通常将创建登录表中的四个不同子键: software registrion键,对应于驱动程序,存在于hkey_local_machine\software\company\ productname\version中我们的fddi网卡驱动程序所对应的是hkey_local_machine\software\net612\yhfddi\yhfddi1.0;

网卡的软件登录键,存在于hkey_local_machine\software\microsoft\ windows nt\nt3.51\networkcards\yhfddi1;

驱动程序的服务登录键,存在于hkey_local_machine\system\currentcontrolset\services 网卡的服务登录键,存在于hkey_local_machine\system\currentcontrolset\services

对于每一个网络部件,一个名为netrules的特殊子键在邻近的驱动程序或网卡登录子键里创建,netrules标识网络部件为网络整体的一部分。

2.1.3编写inf信息配置文件

gui inf描述语言被windows nt用以书写系统所有部件的配置文件,当然也可以用以书写网络系统各部件的配置文件,该配置文件描述了网络部件安装、配置、删除的执行过程。当网络部件进行初始安装或二次安装(通常通过ncpa进行)时,安装程序读取部件对应的配置文件,进行解释执行。gui inf描述语言由节、命令、逻辑操作、变量规范、流程控制以及一套调用dll或外部程序的机制组成,其中,节是配置文件的主体,节可分为install节(类似于函数),shell节(也类似于函数,但可调用insall和shell节),detect节(不包含命令),一个配置文件一般由若干不同类型的节组成。驱动程序的开发者根据需要可以在配置文件中编写相应代码,使得用户和系统之间能进行交互,并且由用户决定一些配置参数。

nt网卡配置文件有其一套规范,驱动程序开发者必须按规范编写配置文件,一般来说,一个配置文件至少应该提供下面三个节:

安装入口点:[identify]shell节。该节主要功能是给出安装部件的类型名,系统通过它识别该部件属于哪一大类(display,mouse,scsi,network等)中的哪一类(网络adapter,driver,transport,service,network和netprovidor),同时,还需要给出映像文件和配置文件所在的源介质及标识。

[returnoption]shell节。系统执行安装identify节后,执行该节。它主要功能是检查所需安装的部件是否支持的硬件平台和语言,并给出网卡名(有些配置文件支持多类网卡,此时必须让用户进行选择,并获得选择结果)。

[installoption]shell节。该节是配置文件得主体,也是上次安装完后再次进行配置、删除、更新的入口点。主要功能是拷贝映像文件和配置文件,生成配置的各种选项,创建该部件在注册库中对应的各种登录子树并更新重写。

2.2 驱动程序的加载过程

2.2.1 windows nt的启动过程

第一阶段:调入装入程序。和硬件平台相关,x86机器首先由rom装入根扇区,再由根扇区装入ntldr;

第二阶段:硬件检测。x86机器调ntdetect程序最大限度地获取各种硬件设备信息,引导hal及基本卷设备驱动程序,以便引导nt内核;

第三阶段:获取注册库中各种控制信息,如用户定义的非页内存大小;第四阶段:初始化

注册库 \registry\machine下system和hardware并创建currentcontrolset,为装入相关硬件设备驱动程序作准备;

第五阶段:装入基本核心驱动程序;

第六阶段:释放一些已经完成使命的装入初始数据块;

第七阶段:进一步初始化注册库,以便有些依赖于基本核心驱动程序的上层驱动程序能顺利装入;

第八阶段:服务控制器装入应该由该服务控制器装入的各种驱动程序。

2.2.2 fddi网卡驱动程序的加载过程

在windows nt启动的第五个阶段,将加载核心驱动程序。而对于ndis网卡驱动程序是在ndis接口(ndis.sys)加载后调入运行,向ndis wrapper注册、初始化、查询设置参数等。

windows nt启动时,相应的实体如nt的服务控制器根据注册库中yhfddi驱动程序的配置注册信息,初始化ndis wrapper,并装入相应的驱动程序,生成驱动程序管理块结构,申请内存以保存各种信息,向ndis wrapper注册驱动程序。初始化和注册完毕后,再由服务控制器读取注册库中相应的链接信息。

在ndis wrapper和yhfddi驱动程序初始化和注册成功后,ndis wrapper根据系统相应的注册信息,加入和yhfddi驱动程序所对应的fddi网卡,同时读入网卡的注册信息,并进行网卡注册和网卡初始化。

在以上过程成功后,wrapper将查询和设置驱动程序的各种参数,了解驱动程序对哪些操作支持,决定对上层驱动程序的支持范围。

2.3 fddi网卡驱动程序的注册

driverentry函数是windows nt ddk规定的核心驱动程序的入口点,wrapper识别到入口点后,调入驱动程序,在driverentry函数内完成两个基本注册任务:

调用ndisminitializewapper函数向ndis接口报告驱动程序将以miniport类网卡驱动程序注册。ndis建立它需要记录的驱动程序状态信息,同时返回ndiswrapperhandle,驱动程序保存这个句柄,以利后来调用ndisxxxconfiguration和initialization等函数。

填写ndisxx_miniport_characteristics属性结构,主要记录ndis版本号和驱动程序支持的miniportxxx函数的入口点,然后调用ndismregisterminiport函数实现驱动程序的整体注册。

2.4网卡驱动程序对象查询与设置

如果ndis的管理实体要查询或设置一个特定的网络对象,它必须提供一个32位的oid。

一般的和特定介质的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驱动程序就分别了解了网卡驱动程序对其的支持,从而进行相应的捆绑,以便数据传输时正确选择网卡驱动程序。

2.5开发环境与调试方法

开发环境:

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产生异常断点,由主机对异常进行控制

自定义宏,进行分级控制,以根据不同情况产生不同调试信息

3与smt移植相关的问题讨论

在本yhfddi网卡驱动程序中,smt的移植是极其关键的一部分,主要承担了驱动程序中硬件初始化和中断延迟处理。但由于smt是相对独立的软件,这样就有一个ndis wrapper与smt间参数传递的问题。所以本章主要讨论miniport驱动程序与smt的关系和移植smt过程中初始化的要求、中断处理的要求,ndis wrapper与smt如何传递参数。

3.1miniport fddi网卡驱动程序与smt的关系

在第一章已经谈及网卡驱动程序主要实现osi参考模型中的物理层和mac层。而对于fddi网络的物理层又可分为介质相关子层和介质无关子层。

对于我们的fddi/pci是基于x.3.19、x3.148、x3.166和x3.229而实现的。

smt在整个iso七层模型中属低两层范畴。fddi网卡驱动程序应包含smt,实现fddi拓扑环上的站管理。

而在驱动程序内部smt主要是在miniport驱动程序中的中断延迟处理上边缘服务中实现的,也可以说是将smt嵌入中断延迟处理程序中,实现ndis接口对smt的正确调度。

yh-fddi驱动程序的实现可分为硬件无关部分和硬件相关部分。

3.2移植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为例,

中断处理要求.

对于中断处理,在smt中主要调用cspintrhandandler()来实现.我们的fddi网卡驱动程序是miniport方式的,若在isr中做此处理将占用大量系统资源,使系统崩溃,所以我们采用只在isr中进行中断的排队,而在dpc中调用cspintrhandler()来完成中断处理.

在中断处理方面还有一个中断屏蔽和中断使能的问题,这两方面smt并不提供,故我们要正确处理.

4结束语

ndis规范在网络两层间提供了一个统一界面,ndis对网络本身而言,是一个带有协议功能的标准接口,对实现者而言,它应该是一个环境,这种环境不仅带有协议功能,更重要的是带有和软、硬平台无关的核心功能支持,它不会受软、硬平台的变化严重影响,无疑,它是软件的移植和兼容的可靠保证,ndis把网络的一部分共性抽象出来,并根据具体的操作系统实现系统和平台相关的基础库以保证ndis的标准性和对开发者提供最大的功能支持,这也将加速和规范开发过程,但是,在操作系统之上提供ndis基础库获得标准同时也失去直接作用于操作系统带来的灵活性以及更强的功能支持,同时,ndis处于网络中层和低层之间,低层网络的快速发展和ndis对网络部分共性的抽象必然导致ndis对实现者

的滞后,例如ddk3.51提供的ndis开发环境只支持10m以太网、fddi、令牌网(802.5)、localtalk、arcnet等,而对新出现的快速以太网及atm不提供支持,这对我们如何在ndis环境下实现诸如atm的lan emulation,ip over atm、快速以太网带来很大问题。

smt是实现fddi网卡驱动程序的关键,然而由于应用ddk开发miniport驱动程序时要遵循其结构框架,所以要想完整地按其结构移植smt,就必须分解smt适应之,即要求对smt有一个很好的理解。但smt是庞大的给开发带来了一定的困难。

参考文献

【1】《device driver kit用户手册》

【2】《device driver kit核心驱动程序设计》

【3】《device driver kit网络驱动程序设计》

【4】《windows nt核心内幕》

第6篇:驱动程序设计范文

摘 要:本文主要介绍在Vxworks操作系统下网络设备驱动程序设计、调试方法以及将其加入系统内核的配置方法。

关键词:Vxworks  嵌入式操作系统 网络设备

引 言

VxWorks操作系统是美国WindRiver公司于1983年设计开发的一种嵌入式实时操作系统(RTOS),是嵌入式开发环境的关键组成部分。良好的持续发展能力、高性能的内核以及友好的用户开发环境,在嵌入式实时操作系统领域占据一席之地。它以其良好的可靠性和卓越的实时性被广泛地应用在通信、军事、航空、航天等高精尖技术及实时性要求极高的领域中,如卫星通讯、军事演习、弹道制导、飞机导航等。

1 嵌入式系统

嵌入式系统是以嵌入式计算机为技术核心,面向用户、面向产品、面向应用,软硬件可裁减的,适用于对功能、可靠性、成本、体积、功耗等综合性严格要求的专用计算机系统。和通用计算机不同,嵌入式系统是针对具体应用的专用系统,目的就是要把一切变得更简单、更方便、更普遍、更适用;它的硬件和软件都必须高效率地设计,量体裁衣、去除冗余,力争在同样的硅片面积上实现更高的性能。

嵌入式系统主要由嵌入式处理器、硬件设备、嵌入式操作系统以及特定的应用程序等四部分组成,是集软硬件于一体的可独立工作的“器件”;用于实现对其它设备的控制、监视或管理等功能。

嵌入式系统应具有的特点是:要求高可靠性;在恶劣的环境或突然断电的情况下,要求系统仍然能够正常工作;许多嵌入式应用要求实时处理能力,这就要求嵌入式操作系统(EOS)具有实时处理能力;嵌入式系统中的软件代码要求高质量、高可靠性,一般都固化在只读存储器中或闪存中,也就是说软件要求固态化存储,而不是存储在磁盘等载体中。

2 设备驱动程序

Vxworks5.4中驱动程序主要分为三种:字符、块以及网络驱动程序。本文所介绍的网卡驱动程序则属于网络设备驱动程序。

2.1 网络设备驱动程序设计

网络的各功能部件图1所示,网络设备驱动程序实际上是处理硬件和上层协议之间的接口程序。网络传输协议层分发数据在应用程序接口和网络接口之间。网络化网络协议(如IP协议)发送数据在网络主机之间。连接/接口层使能主机隶属于硬件到相同物理媒质的通信。

在Vxworks5.4中,网卡驱动程序又分为END(Enhanced Network Driver)和BSD两种。它们分别处于如图2所示结构中。

2.1.1 BSD驱动程序设计

在Vxworks5.4中,网络驱动程序都是基于BSD UNIX版本4.3基础上的,这些驱动程序都定义在一个全局例程中,那就是attach子程序,xxattach( )子程序中包含5个函数指针,它们都被映射到ifnet结构中,这5个函数可见表1,它们在IP协议层任何地方被调用。

表1 网络接口处理

驱动程序指定函数

函数指针

功能

xxInit( )

if_init

初始化接口

xxOutput( )

if_output

对要传输的输出分组进行排队

xxIoctl( )

if_ioctl

处理I/O控制命令

xxReset( )

if_reset

复位接口设备

xxWatchdog( )

if_watchdog (optional)

周期性接口例程

驱动程序入口xxattach( )调用ether_attach( )来把上述5个函数映射到ifnet结构中,ether_attach( )调用如下:

ether_attach(

    (IFNET *) & pDrvCtrl->idr,

    unit,

    "xx",

    (FUNCPTR) NULL,

    (FUNCPTR) xxIoctl,

    (FUNCPTR) ether_output( ), /* generic ether_output */

    (FUNCPTR) xxReset

);

pDrvCtrl->idr.ac_if.if_start = (FUNCPTR)xxTxStartup;

上述参数中,需要一个接口数据记录(Interface Data Record (idr)),unit号和设备名,下面四个参数就是相关驱动程序的函数指针。第一个函数指针指的是init( )例程,这个例程可要可不要,第二个函数指针指的是ioctl( )接口,它允许上层来控制设备状态;第三个函数指针指的是把数据包送到物理层;最后一个函数指针指的是如果TCP/IP堆栈决定需要复位的话,它就复位这个设备。

接着下面那一句代码表示添加数据传输例程到IDR,ether_output( )例程被调用后,传输开始例程就被TCP/IP协议堆栈调用。

在这个入口驱动程序中还包括设备的初始化、发送和接收描述符的初始化等。

2.1.2 END驱动程序设计

END驱动程序是基于MUX模式,网络驱动程序被划分为协议组件和硬件组件。MUX数据链路层和网络层之间的接口,它管理网络协议接口和低层硬件接口之间的交互;将硬件从网络协议的细节中隔离出来;删除使用输入钩例程来过滤接收从协议来的数据包,和删除了使用输出钩例程来过滤协议包的发送;并且链路层上的驱动程序需要访问网络层(IP或其他协议)时,也会调用相关的MUX例程。值得注意的是,网络层协议和数据链路层驱动程序不能直接通讯,它们必须通过MUX。如图3所示: 

 

2.3将驱动程序加载到Vxworks系统中

要对所设计的驱动程序进行测试,首先就必须把驱动程序加载到Vxworks IMAGE中,并且给设备分配一个IP,这样才能有利于网间测试。

首先,修改configNet.h文件,添加如下代码:

#ifdef INCLUDE_DM_9102_END

#define DM_9102_BUFF_LOAN_0      1

#define DM_9102_LOAD_FUNC        sysDm9102EndLoad

#define DM_9102_LOAD_STR_0       ""

IMPORT END_OBJ * DM_9102_LOAD_FUNC (char *, void *);

和END_TBL_ENTRY endDevTbl [] 中添加

#ifdef INCLUDE_DM_9102_END

    {0, DM_9102_LOAD_FUNC, DM_9102_LOAD_STR_0, TRUE, NULL, FALSE},

#endif /* INCLUDE_DM_9102_END */

其次,编辑config.h文件,添加如下代码:

#define INCLUDE_DM_9102_END      /* Davicom 9102 Fast Ethernet Controller */

最后,编辑sysLib.c文件,添加如下代码:

/* include dm9102 End driver support routines */

#ifdef INCLUDE_DM_9102_END

IMPORT STATUS sysDm9102PciInit (void);

#endif /* INCLUDE_DM_9102_END */

 

/* include dm9102End driver support routines */

#ifdef INCLUDE_DM_9102_END

#include "sysDm9102End.c"

#endif /* INCLUDE_DM_9102_END */

#ifdef INCLUDE_DM_9102_END

   sysDm9102PciInit ();

#endif /* INCLUDE_DM_9102_END */

通过上述过程相应的添加程序,然后重新编译Vxworks,这样就将所设计的网卡驱动程序添加到Vxworks内核中了。

2.4 PCI设备检测

如果所设计的网卡是基于PCI总线的,那么在程序开始就需要对PCI设备进行检测,在Vxworks5.4中有专门的PCI函数来检测设备的总线号、设备号和功能号。首先利用pciFindDevice( )函数对给定VendorID和DeviceID的设备进行检测,检测完后同时给出了设备的总线号、设备号和功能号;接下来就是获得该设备的中断号、基地址(包括IO和内存)。Vxworks中pciConfigLib.h文件中定义PCI总线的常量。如中断号:PCI_CFG_BRG_INT_LINE,IO基地址:PCI_CFG_BASE_ADDRESS_0,内存基地址:PCI_CFG_BASE_ADDRESS_1等等。所以利用函数pciConfigInByte和pciConfigInLong就可以很容易地获得设备的中断号和基地址。

2.5 调试方法

为了方便调试网卡驱动程序,推荐利用串口对程序进行下载并将Vxworks image拷贝到软盘中以从软盘来加载它。调试的时候首先应该给网卡分配一个IP(利用usrNetIfConfig函数),然后利用ping来对网卡进行测试。

第7篇:驱动程序设计范文

关键词:Java程序设计;项目驱动教学模式

中图分类号:TP311.52 文献标识码:A 文章编号:1007-9599 (2012) 10-0000-02

在目前的java程序设计教学中,普遍存在着课本不及时更新,无法摆脱应试模式框架,以及教育与实际脱轨等一系列的问题。而java程序设计是一个对学生的操作和实践很有依赖性的学科,所以,只有选择项目驱动教学的方式,才能使得学生的实践和操作能力得到一定的发展,更好地学习java的程序设计。

一、什么是项目驱动教学

项目驱动教学法是指通过进行一个完整的项目工作,来达到教学的目的,让知识和学生的动手能力都可以得到很好的进步。项目驱动教学模式主要应用于计算机软件这种比较复杂,学生可以借助项目的发展,来接受一些诸如程序设计之类的知识系统。

二、项目驱动教学模式的意义

项目驱动教学模式可以具体针对每一个学生来进行程序设计的教学。通过分组讨论等方式,可以使得学生的思路更清晰,更好地掌握java程序设计的知识理论。可以大大提高学生的学习兴趣和实践能力,使得高职院校更好的和社会接轨。所以,项目驱动教学模式是一种具有划时代意义的教学史上的重大改革。

三、就java程序设计对项目驱动教学模式的研究

(一)如何选择授课项目

项目的选择应该与当下社会的发展趋势相匹配,这样的授课项目才可以与时代的发展接轨。项目的选择要根据授课时间、授课地点以及学生的学习能力来判断。如果项目过难,学生不易接受,反而达不到预期的效果。反之,项目过易,学生的积极性不容易被调动起来,也容易达到事倍功半的效果。如果项目的基体过于庞大,教师很难完全的对项目进行细致的分析,会影响教学的完整性。而项目的技术含量如果太高,就会使得学生失去学习的兴趣,打击学生对项目研究的勇气和信心。所以,教师应该根据学生的接受能力,授课的周期来具体分析,为学生选择合适的项目来进行授课作业。

(二)如何合理安排学生分组和授课进度

授课项目的选择是为了完成整个学期的学业。所以项目的安排要合理地分散于学生学习的一个周期之内。根据授课的进度,适当增加项目的难度以及技术含量。这样比较利于学生的学习积极性和学习兴趣一直处于一个合理的状态,避免了填鸭式教学的传统弊病。

学生的分组可以按照学生的接受能力和领导组织能力。领导组织能力强的同学可以作为每个小组的组长,接受能力高的同学可以作为副组长。这样就能更有利地组织学生来一步步完成项目的每个阶段。并且能更好地激发学生的团体协作精神和部分同学的领导力,并且可以大幅度减少教师的教学负担。还能使得学生更好地适应今后的工作。

(三)如何进行项目驱动教学

1.教师讲解软件开发的环境

在授课的开始,教师一定要本着当下软件开发的环境为学生作深入细致的讲解。当下,软件开发企业为了降低成本,提高速度,使用的是一体化的集成设备,即把数据库,服务器等集成在一起,这就增加了学生学习的难度,使得原本简单的东西复杂化。

Java的后台程序都是英文版的,这就要求教师更合理地引导学生来正视软件开发的难度,同时借助语言,肢体,以及软件的实际操作来打消学生的负面心理,提高学习的积极性。

2.确定授课的软件

在教学过程中,一定要选择合适的授课软件及其辅助工具。因为java的程序设计不但要求学生知道程序设计的目标,更要让学生知道该过程及其原理,以及软件开发的条件和必备工具。在授课初期,教学过程一定要采用可视化的软件,这样可以使得学生更直观地看到程序的管理,编程等的产生和形成。在授课达到一定程度之后,再采用非可视化的开发工具,锻炼学生的能力,使得学生更好地掌握软件开发的知识,更好地锻炼学生的动手能力和操作能力。

3.授课的考核

在当下,传统的考核方式已经不再适应项目驱动授课的教学模式。在项目驱动的模式下,我们不应该只用笔试,口试的方法对学生的能力和知识量来进行评定。在此,我们应该在教学到了某一进度时,让学生亲自动手制作某软件或者某程序。例如:让学生自己动手来编程,而不是让学生在纸上填写编程代码。当学生的考核完成以后,由学校的权威专家来逐个评判考核的结果,并评分,计入考核档案。这样才能防止某些学生作弊,更好地体现考核的权威性和公平性。

4.教学实践

当学生的考核完成并且合格以后,就应该让学生来参加实践。实践可以是教师根据企业的发展来设计出的项目,也可以是学生自己寻找的项目,无论如何,都要和日后学生即将步入的社会相适应,不可以搞形式主义,让学生空有一身知识而无处倾泄。实践可以更好地锻炼学生的动手能力,以及对之前的知识更为系统地掌握和消化。并且能让学生更为自信的走向社会。

5.引导学生就业

当学生的知识掌控的比较随心所欲,并且动手操作能力也能得心应手时,教师应该主动引导学生走向社会,即让学生就业。根据学校的优惠政策和人脉关系,为学生选择一个适合的行业来发挥他们的最大才能。初入社会的学生并不懂得社会上的一些潜规则和人际交往,教师应该用委婉的语言向学生合理解释,如果话说的太直接,容易导致学生对社会产生恐惧的心态,打消学生走向社会的积极性。学生应该努力自己走向社会,用自己的知识和能力,选择合适的就业岗位,并且在教师的帮助下,把自己的一切做到最好,发挥自己最大的优势适合自己的空间。

四、小结

项目驱动的教学模式现在的我们已经不陌生,它的作用是把教学和实践完美的结合在了一起。杜绝了以往学生只知理论,不懂社会实践的尴尬局面。学生步入社会以后可以更快,更好地接受社会所给于的压力,及时把自己的知识应用在工作中。所以,项目驱动的教学模式是今后教育改革的必由之路。

参考文献:

[1]马玉青.计算机绘图教学中应用“任务驱动”教学法初探[J].职业教育研究,2005,(10)

[2]姜大源.职业教育专业教学论初探[J].教育研究,2004,(05)

[3]张哲,陈桂生.在Java语言教学中实施“项目驱动”教学法的实践探索[J].教育与职业,2007,(18)

[4]张党省.论职校教师在项目教学法中的角色[J]. 科教文汇(下半月),2006,(09)

[5]岳云峰,顾晖,李跃华.计算机硬件课程教学中的项目驱动教学法[J]. 南通大学学报(教育科学版),2007,(03)

[6]吴言.项目教学法[J]. 职业技术教育,2003,(07)

[7]兰景英,范勇.基于项目驱动的软件测试人才培养模式[J].计算机教育,2011,(6):10-13

[8]陆芸婷.基于工作过程的《数据库基础》课程设计[J]. 中国科技信息,2009,(15):269-271

[9]朱雄军,杨旭东,陈晴.高职计算机网络专业基于工作过程的课程体系设计[J].职业技术教育,2008,(5):32-33

第8篇:驱动程序设计范文

关键字 Windows系统 驱动程序 通知应用程序 设计 方法

中图分类号: TP316 文献标识码:A

1 前言

操作系统的稳定性及可移植性是务必要优先确保的,为此Windows操作系统不支持应用程序直接访问系统的硬件资源,而是必须借助于相应的设备驱动程序。设备驱动程序可以直接操作硬件,假如应用程序和设备驱动程序之间实现了双向通信,也就达到了应用程序控制底层硬件设备的目的。

2 通知应用程序设计四种方法

鉴于设备驱动程序通知应用程序的重要性,本人结合一些经验,对它进行了总结,归纳出5种方法摘要:异步过程调用(APC)、事件方式(VxD)、消息方式、异步I/O方式和事件方式(WDM)。下面分别说明这几种方式的原理。

2.1 异步过程调用(APC)

Win32应用程序使用CreateFile()函数动态加载设备驱动程序,然后定义一个回调函数backFunc(),并且将回调函数的地址%26amp;backFunc()作为参数,通过DeviceIoControl()传送给设备驱动程序。回调函数的输入参数是由设备驱动程序填入的,回调函数在这里主要是对消息进行处理。

2.2 事件方式(VxD)

首先,Win32应用程序创建一个事件的句柄,称其为Ring3句柄。由于虚拟设备驱动程序使用事件的Ring0句柄,因此,需要创建Ring0句柄。用LoadLibrary()函数加载未公开的动态链接库Kernel32.dll,获得动态链接库的句柄。然后,调用GetProcAddress(), 找到函数OpenVxDHandle()在动态链接库中的位置。接着,用OpenVxDHandle()函数将Ring3事件句柄转化为Ring0事件句柄。Win32应用程序用CreateFile()函数加载设备驱动程序。

2.3 消息方式

Win32应用程序调用CreateFile()函数动态加载虚拟设备驱动程序。加载成功后,通过调用DeviceIoControl()函数将窗体句柄传送给VxD,VxD利用这个句柄向窗体发消息。当条件满足时,VxD调用SHELL_PostMessage()函数向Win32应用程序发送消息。SHELL_PostMessage()函数的第一个参数为Win32窗体句柄,第二个参数为消息ID号,第三、四个参数为发送给消息处理函数的参数,第五、六个参数为回调函数和传给它的参数。Win32应用程序收到消息后,对消息进行处理。

2.4 事件方式(WDM)

Win32应用程序首先创建一个事件,然后将该事件句柄传给设备驱动程序,接着创建一个辅助线程,等待事件的有信号状态,自己则接着干其他事情。设备驱动程序获得该事件的句柄后,将它转换成能够使用的事件指针,并且把它寄存起来,以便后面使用。

3 结语

在目前流行的Windows操作系统中,设备驱动程序是操纵硬件的最底层软件接口。它向上提供和硬件无关的用户接口,向下直接进行I/O、硬件中断、DMA和内存访问等操作。它将应用程序和硬件细节屏蔽开来,使软件不依靠于硬件并且可在多个不同的平台之间移植。这4种方法都经过实际测试。测试结果表明,它们都能够达到设备驱动程序通知应用程序的目的。

参考文献

[1] 李和平. 基于DSP的ICT图像重建系统探究. 北京摘要: 北京航空航天大学机械工程及自动化学院, 2002

第9篇:驱动程序设计范文

关键词 C语言程序设计 任务驱动 协作学习

大学生计算机公共教学中的C语言程序设计被学生认为是一门难以掌握的课程,师生在教学实践中往往付出很大努力,但还是不能达到预期的效果。寻求合适的教学与学习方法是取得良好教学效果的必由途径,其中任务驱动下的协作学习尤其具有重要的实践价值。

1 任务驱动下的协作学习与C语言程序设计

协作学习是一种通过小组的形式组织学生进行学习的方法,注重培养学生的创造能力、求异思维、批判思维、探索精神与合作能力。任务驱动是指教师把教学内容设计成一个或多个任务,让学生通过完成这些任务来掌握教学内容的教学与学习方法。任务驱动下的协作学习是指将协作学习与任务驱动二者有机结合起来,即由教师设计任务,学生在完成共同任务的动机驱动下结成小组,在教师的指导下完成指定任务,是教师教学方法与学生学习方法的统一。它的特点是目标性、协作性,重点是任务的设置与小组的划分。

C语言作为结构化程序设计的中级语言,它的特点是语法严谨、功能强大、程序效率高、可移植性好等,但其丰富的功能所带来的众多的数据类型和复杂的语法结构对非计算机专业的学生来讲,非常难以掌握,从而造成学生在学习过程中水平参差不齐。C语言支持模块化的程序设计,这样可以将一个程序分割成几个独立的模块并行开发。基于这些特点,笔者认为,任务驱动下的协作学习对于C语言程序设计的课程教学与学习具有特别的价值,不但可以照顾不同层次学生的学习需求,而且有利于学生的自主探究学习,同时可以培养学生的团队精神。

2 任务驱动下的协作学习构想

笔者认为,教师要在教学实践中为学生创造协作学习的环境,指导学生完成协作学习任务,需要做好以下几项工作。

2.1 分组

分组是进行任务驱动下的协作学习的前提。可以根据学生的兴趣爱好、专业、特长等规则进行分组。要求学生上课时必须以组为单位就坐,问题的讨论和回答也都以组为单位来进行,学生可以在小组内和小组间展开讨论。每个学生作为某个组的组成成员,他们在完成小组共同任务时是协作关系,但每个成员在组内又担任特定的任务,在完成自己的任务时又具有独立性。为了协调组内关系,需要确定一个组长,主要负责小组内任务分配、协调组内成员等工作,以保证小组内和谐共处。

2.2 任务的设计与分配

教师所指定的任务是任务驱动下的协作学习的基础。教师指定任务为协作学习的展开创造了一个环境,除了平时课堂上有意识地提出一些供小组讨论解决的问题外,可以在期中、期末各设计一个任务,要求小组协作完成。任务的设计尽可能具有综合性、可分割性,保证学生既是对已学知识的综合应用,同时又可以把任务分割成几个独立的模块分配给不同的小组成员完成。

2.3 教师的指导

教师的指导是协作学习得以展开的保证。教师的角色主要是信息资源的提供者,协作学习的协调者、监督者、帮助者、管理者。

2.4 协作学习的评价

结果的评价是激发学生进行协作学习的动力。对学生的评价,要充分考虑协作与独立的关系,所以对每个学生的评价是将小组整体得分与组内个人得分进行综合,这样既考虑小组协作的效果,也考虑学生作为小组成员的个人成效。

3 任务驱动下的协作学习实践探索

笔者对自己所教的北京师范大学生命科学学院生物技术和生物科学两个专业的2002、2003级学生采用了任务驱动下的协作学习方法,效果良好。现将其中的一次具体实践过程描述如下。

3.1 分组

以宿舍为单位进行分组,组长就是他们的舍长,负责任务分配和协调组内关系。

3.2 任务的指定与分配

任务为编写一个DNA信息统计程序。笔者从NCBI网站上以Genbank的格式下载了一些物种的DN段,并把它们组成一个文本文件,要求学生从中提取指定的信息并完成相应的统计。要求:(1)提取每个DN段及其所对应的物种名和序列号;(2)把提取的信息存放到另外一个文本文件中;(3)统计物种数;(4)对每个DN段统计A、T、C、G的百分含量。任务完成后要求以Word文档上交。这个文档包括设计思路、设计分工、设计特点等,而且要求对各模块的功能及使用方法加以说明,必须附程序源代码。最后做一个演示文稿进行任务报告、评比。在任务的设置中预含了模块的划分,这样就可以把每一个分解的任务分给小组内不同的同学完成,同时还有一个同学完成数据结构的确立与主程序的编写,最后,组长再根据每个人的特长进行其他任务的分配。

3.3 指导

给学生提供一些学习资源,包括一些C程序设计论坛以及NCBI网站等。在学生每周的统一上机时间里,教师主动去机房及时与学生沟通,平时遇到问题则以E-mail的形式或面对面的形式进行讨论。同时,对协作学习中遇到的其他问题随时加以协调。

3.4 评价

作业提交后,对学生的协作结果进行评估,我采用的评分规则是:个体所得分值;小组得分。(个体在组内得分/小组内所有个体得分的平均值)。小组得分是任务评比所得的结果,是小组间竞争和小组内合作的结果。任务评比时,每个小组对自己的任务进行汇报时,其他小组和教师对其打分,最后所有打分的算术平均数就是该小组最后的得分;成员的组内得分则是在组长的组织下,由所有的成员对其打分取算术平均数。

4 任务驱动下的协作学习反思

笔者在教学实践中使用了任务驱动下的协作学习,虽然取得了一定的效果,但也遇到很多问题,其中既涉及到如何完善这种教学方法本身,又涉及到其与教学内容、教学大环境等的关系,这里提出自己的几点体会。

4.1 分组的规则有待细化

协作学习不同于简单的小组讨论,它是一种系统的、有计划的学习方式。根据任务设置的不同以及学生来源的不同,可以采取不同的规则来进行分组。组长的人选尤其需要谨慎对待,作为组长,必须熟悉小组内每个成员的情况,必须具有组织、协调能力。组内要处理好竞争和协作、协作与独立的关系,只要这样才能既保证小组共同完成任务,又保证个体的自主学习与竞争关系。

4.2 任务的设计需要技巧

任务设计既要具有综合性,能够对前面知识有系统的总结、回顾,同时又应该具有可分割性,有利于分组状态下的协作分工。组内任务的分配要有科学性,最大限度达到各尽其能。

4.3 教师必须注意角色的转变及评价结果的分析

教师不是传统的单纯传授知识,而是引导学生去协作研究、完成任务。结果评价的公正性直接影响学生学习的热情,所以对学生学习的评价结果必须加以验证,教师必须监督小组间评分以及小组内成员评分的合理性,必须制定适当的约束机制。