Windows CE和桌面Windows 2000-XP设备驱动开发的区别

  • 格式:doc
  • 大小:11.80 KB
  • 文档页数:3

下载文档原格式

  / 3
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Windows CE和桌面Windows 2000/XP设备驱动开发的区别

摘要:讨论了嵌入式操作系统Windows CE与桌面Windows系统设备驱动开发的区别,主要包括驱动结构模型、驱动组成部分和开发环境。关键词: WDM; 设备驱动; Windows CE Windows CE是一个32位、多任务、多线程的嵌入式操作系统,是微软专门为信息设备、移动应用、消费类电子产品、嵌入式应用等非PC领域专门设计的操作系统产品,在外观和使用的感觉上十分接近桌面Windows系统。它使用平面内存模式寻址,可以同时运行多个程序并支持1个程序中的多个线程,并且非常精炼,只有很小的内存要求。与基于PC的操作系统不同,Windows CE不需要标准硬件,支持各种各样的CPU,如X86、PowerPC、ARM、MIPS等,通过OEM 适配层(OEM Adaptation Layer)可以把Windows CE适配到任何硬件平台[1-2]。虽然Windows CE是微软Windows操作系统家族的一个成员,支持用于Windows 2000/XP和Windows 98等桌面Windows操作系统的Win32 API的一个子集。但由于它不是桌面Windows 操作系统的一部分或缩减版本,使得开发Windows CE的驱动程序与开发桌面Windows的驱动程序有所不同。本文将着重讨论这些区别,以使广大熟悉桌面Windows驱动程序开发的程序员能快速掌握嵌入式操作系统Windows CE驱动程序开发方法。1 驱动结构模型比较在桌面Windows系统中,以支持Windows 2000/XP的WDM驱动模型为例。WDM体系结构实行分层处理,即设备驱动被分成最高层驱动程序、中间层驱动程序、最低层驱动程序,。

在Windows CE驱动中,按驱动的结构可以分为二种类型:分层式设备驱动程序和整体式驱动程序,。分层式设备驱动程序由上层和下层两部分代码组成[1,3]。上层的程序称为模型设备驱动程序(MDD),下层的程序则称为平台相关的驱动程序(PDD)。整体式驱动程序的源代码由中断服务线程代码和针对平台的代码组成。

同桌面Windows设备驱动结构模型相比,Windows CE设备驱动相对简单一些(见图1、图2)。两种操作系统的设备驱动虽然存在许多相似的地方,都采用了模块、分层的设计方法,但是还存在许多不同的地方。在Windows CE操作系统中,分层的驱动程序并不适用于所有的驱动,尤其是将驱动程序分为两层将会导致在驱动程序操作时附加的功能调用,这无疑会降低驱动程序的效率,对于时间或性能关键的实时操作,整体式驱动程序将会更适合。在桌面Windows系统中,驱动各层通信之间使用一种称为I/O请求包(IRP)的数据结构进行通信,影响到设备的每个操作都使用I/O请求包,若采用层次结构使I/O请求过程更加明了。I/O管理器发送IRP来请求驱动程序的处理,通常,IRP由分层的驱动程序栈来处理,而高层的驱动程序则把请求划分成更简单的请求并传递给下层驱动程序。IRP首先被送到设备堆栈的最上层驱动程序,然后逐渐过滤到下层的驱动程序,每一层驱动程序都可以决定如何处理IRP。但Windows CE驱动各层之间的通信没有采用IRP通信机制,而是通过接口函数调用实现[4-5],设备驱动程序接口DDI(Device Driver Interface)是在MDD层中实现的函数集,系统中的GWES 模块通过这个接口调用设备驱动程序;设备驱动程序服务器接口DDSI(Device Driver Service Provider Interface)是在PDD层中实现的函数集并由MDD调用。2 设备驱动组成部分比较驱动程序是一些例程的集合,它们被动地存在,等待主机系统软件的调用或激活。在Windows系统中,具体的驱动程序有所不同,其包含的例程也不同,但其主要例程是相同的。图3 描述1个Windows驱动基本流程。下面阐述Windows CE和桌面Windows设备驱动组成的差别。

2.1驱动程序的入口点在桌面Windows和Windows CE两个系统中的驱动程序都含有初始化模块,该模块主要功能是完成驱动程序的初始化及卸载。在桌面Windows系统的初始化模

块中,包括有每1个设备驱动程序都有的1个初始化入口点:DriverEntry例程。每次设备

驱动程序启动时该例程被系统自动调用,其最重要的功能是设置驱动程序对应于I/O请求的

主功能代码(MajorFunction)的回调例程。DriverEntry例程如下: DriverEntry(IN PDRIVER_OBJECT DriverObject, …) //驱动

程序人口 { DriverObject->DriverExtension->AddDevice=AddDevice; DriverObject->DriverUnload=DriverUnload;

DriverObject->MajorFunction[IRP_MJ_CREATE]=Create;

DriverObject->MajorFunction[IRP_MJ_CLOSE]=Close;

DriverObject->MajorFunction[IRP_MJ_READ]=Read;

DriverObject->MajorFunction[IRP_MJ_WRITE]= Write; DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] =IoControl; DriverObject->MajorFunction[IRP_MJ_PNP]=Pnp;

DriverObject->MajorFunction[IRP_MJ_POWER]=Process- PowerIrp;

…… } 其中,AddDevice例程是在系统添加1个设备时被PnP管理器

调用,其主要工作是创建并初始化设备对象;DriverUnload例程在系统卸载硬件时使用,由

I/O管理器调用,释放所有资源。初始化模块中还包括有Create和Close两个例程,这是Win32

程序获得和释放设备句柄的唯一途径。与桌面Windows设备驱动程序开发相比,Windows CE

设备驱动程序开发主要难点在于不同类型设备的驱动程序架构是不一样的。以流接口驱动程

序为例,Windows CE设备驱动程序是用户模式动态链接库(DLL),其入口点在不同的情况下

有一些细微的差别,主要入口点包括:XXX_Init、XXX_Deinit、XXX_Open、XXX_Close、XXX_IOControl、XXX_Read、XXX_Seek、XXX_PowerUp和XXX_PowerDown。在实际开发中,接

口名称中的XXX 3个字母由所驱动的设备文件名前缀代替。2.2 与应用程序的通信设备驱

动程序构造成功后,将它与设备一同安装进系统,以便用户可以对设备进行适当的控制及访问。在桌面Windows和Windows CE两个系统中使用Win32 API实现硬件的访问。首先调用CreateFile创建1个设备的连接,获得该设备的句柄(Handle),然后根据需要调用ReadFile、WriteFile、DeviceIoControI等函数对设备进行读写或者其他I/O控制操作,最后调用CloseHandle关闭设备。在桌面Windows系统中,当用户需要访问某设备时,必须首先取

出指定设备全局唯一标识符(GUID)的设备信息集,枚举设备实例的接口数据,从中获得设

备的符号链接名,然后调用CreatFile创建设备,并获得设备句柄,且在驱动程序内部通过

处理IRP响应来自Win32应用程序对IRP_MJ_CREATE、IRP_MJ_READ、IRP_ MJ_WRITE和

IRP_MJ_OCTL等请求;IRP由IRP首部结构和一系列的栈单元组成,每个栈单元是一个

IO_STACK_LOCATION结构;驱动程序仅需知道当前I/O栈单元和IRP首部结构中的信息就可以

对IRP进行处理。驱动程序处理完IRP后,使用IoCompleteRequest函数通知I/O管理器,

可以通过其参数设定状态码和返回的字节数。而在Windows CE系统中,应用程序需要了解中

断处理线程中数据的输入输出完成情况,以便及时处理。这就需要建立应用程序和设备驱动程

序的同步通信。2.3 设备名在Windows设备驱动中,为了提供对Win32程序可用的名字,

必须为每个设备创建符号链接。在桌面Windows和Windows CE两个系统中,都可以采用1

个明确的符号链接名。1个具体设备名称是由设备名前缀和设备名索引组成的,即3个大写

字母、1位数字和冒号组成。另外在桌面Windows系统中,还可以采用设备接口为设备创建

符号链接。每个设备接口由1个128位全局唯一标识符(GUID)标志,把设备注册为1个特定

的设备接口就创建了1个符号链接。用户态设备可以取得拥有此GUID的设备。2.4 驱动程序

的运行模式在Windows系统中支持两种基本模式的驱动程序类型,即用户模式(User Mode)

和内核模式(Kernel Mode),不同的模式允许不同层次的内存存取和系统资源的分配。内核模

式驱动程序则由运行于内核模式的系统级代码组成,它们没有系统资源存取的限制,可以执