【原创】Windows® Embedded CE 6.0 Fundamentals 读书笔记_Chapter 6

 

Chapter6
今天我们乘热打铁,继续把第六章驱动结构来一起读一下。首先还是一些单词。在这一章中也有一些比较关键的词值得大家注意的。
//-----------------
regardless
perspective
formalize
Hybrid
Monolithic
Graphics, Windowing, and Events Subsystem (GWES)
Device Driver Interface (DDI)
Device Driver Service Interface (DDSI)
efficiency
obtain
system-on-chip (SOC)
predetermined
restrictions
legacy
preceded
slash
opposed
stability
robust
compromised
consider
infrastructure
restricted
discussed
Proxy
compatible
privileges
reflector
reroutes
utilizing
validates
non-contiguous fragments
auxiliary
algorithm
attempt
separate
corresponding
enumerates
poll
asynchronous
alias
marshaling
//----------简单翻译--具体请见文中注释------
不管
观点
正规化
混合
单片
图形,窗口和事件子系统(GWES)
设备驱动程序接口(DDI)
设备驱动服务接口(DDSI)
效率
获得
系统级芯片(SOC)
预定
限制
遗产
前面
斜线
反对
稳定
强劲(鲁棒性)
妥协
考虑
基础设施
限制
讨论
代理
兼容
特权
反射
重排
利用
验证
非连续的碎片
辅助
算法
尝试
独立
相应的
枚举
民意调查
异步
别名
编组

 

第六章 驱动结构

首先我们先来了解下驱动这个概念,我们明确的是,驱动是一个基于操作系统的软件,他配合硬件和一些虚拟设备进行工作。这些都是写客套话,其实大家完全可以想象成PC的显卡驱动,声卡驱动,鼠标键盘驱动等等。同一个道理。接下我们来规范一下我们对 wince驱动的认识。

wince驱动可以分为以下几个形式。首先我们以驱动的层次来分可以分为混合的驱动,分层的驱动,不分层驱动和混合的驱动,就是也可以适用于分层中也可以使用与非分层中,在其中有流式驱动的接口,从某种角度上增加了驱动的灵活度。接着我们再按驱动的加载方式来分,可以有流失设备驱动,一般放在device.dll这个动态库中,用户通过函数接口来调用他,其次是内建的驱动,一般存在于GWES.dll中,最后是一个文件系统驱动,这个驱动主要是存在与filesys.dll中。这里还有一个关于加载到内存的区分方法,也就是内核加载和用户加载两种驱动,这个概念其实也就是内建驱动和流式驱动,这里又只是多一个叫法。最后一种分发是系统加

载时间来分,有系统启动时加载的驱动以及用时才加载的驱动。

这一章分为以下几个小节来描述,第一节作者为我们介绍运行驱动的结构,介绍了驱动在整个系统构成中的位置以及所涉及的一些重要程序路径,第二节描述了文件驱动,线程驱动以及内建驱动的概念,这一节列出了驱动设计中非常重要的接口函数,第三节介绍用户模式驱动和内核模式驱动的概念,介绍了两中模式下驱动的工作方式,第四节介绍了驱动的加载,介绍如何设计将驱动加载到系统当中,最后一节介绍如何开发设计驱动,并列举出了一些调试中常用的方法,接下来我们一节一节的来看。

第一节驱动实施的结构
这里分成了三个部分来描述驱动的结构,首先描述的是分层结构,分层结构中我们可以将驱动堪称操作系统与设备之间的相互链接 的桥梁,顾名思义,分层也就是将驱动分割成多个层次。每一个层次有自身的接口来连接,通过连接将操作系统与设备连接在一起 ,起到系统对设备的控制功能,分层驱动主要有两个层次和对应的两个接口,他们分别是MDD,PDD两种驱动,DDI和DDSI两个接口, 这四个概念的定义大家可以查看文中的介绍,这里不多讲,需要注意的是图6-1,描述了分层驱动的结构,大家可以注意看一下。靠近设备的是PDD,靠近系统的是MDD,PDD与MDD接口是DDSI,MDD与操作系统的接口是DDI。接下来是混合式的驱动结构,这个结构大体类似于分层的,大家可以仔细看一下图6-2,与分层类型不同的是,混合层的MDD和PDD是可以扩展的,可以通过DDI或者DDSI这样的接口来连接,同时也可以通过添加一些函数来连接。最后是非分层结构,在《Windows CE实用开发技术》一书中有这样的描述,驱动程序的分层与非分层并不是一定的,任何分层驱动都可以用非分层的驱动程序来代替。对于什么时候使用非分层的驱动,例如,当设备不是分层驱动模式的时候,当硬件设备执行需要在MDD层一些函数的时候,当前设备与当前MDD层结构不匹配的时候,当使用MDD/PDD层使得效率降低的时候。最后给出了一个驱动参考路径,这里再做一个说明,建议开发驱动的时候参考MS原有驱动来修改, 做二次开发,不论是什么类型的驱动。

第二节文件系统驱动,线程驱动和内建驱动
第二节的开头给出了三个动态库文件,Device.dll,gwes.dll,filesys.dll。这里大家需要注意的是表6-2。这个表描述了流式驱动的接口,这里我们把流式驱动的几个名字再串一下,流式驱动又可以叫做可安装驱动,同时部分的流式驱动程序也是流接口程序,这里再明确一个信息,流式驱动可以是分层的也可以是非分层的,流式驱动作为分层驱动的例子是wavedev MS提供的一个音频驱动程序,大家可以参考。大概的路径是X:\WINCE600\PUBLIC\COMMON\OAK\DRIVERS\WAVEDEV。接下来介绍了驱动名称的定义以及使用方法,这里需要大家注意的是ReadFile/WriteFile/SetFilePointer以及DeviceIoControl,这些函数经常用来对流式设备进行调用。一个流式设备可以看成一个文件来处理,通过CreateFile来调用。在GWES中主要为内建的驱动,也就是一些专门有系统来使用的驱动的总集,文件系统驱动主要存在与filesys.dll中,主要是对IOCTL控制代码进行预设定,并在文件系统驱动注册的时候设定系统文件API接口。

第三节用户模式驱动和内核模式驱动
接着上一节所说的集中驱动,这里再区分一下,用户模式驱动一般是指的能加载到任意内核中或者在任何用户驱动处理过程中,一般存在于Udevice.exe中,另外内核模式驱动一般是指的GWES和文件系统驱动,另外device.dll中既可以有用户模式的驱动也可以有内核模式的驱动,接下来详细分析了内核模式驱动的一些优缺点,例如内核模式驱动比用户模式驱动高级,当设备出现问题时,可能只有重启来重新加载驱动,没有独立与用户的接口,需要使用UI代理来作为接口等。关于用户模式驱动与内核模式驱动的区别文章很明确的给出了关键:通过是否需要重启来区别。文中给出了一些函数,大家可以在自己的程序中找找看使用的地方 CreateStaticMapping(); NKDeleteStaticMapping(); VirtualCopy(); FreeIntChainHandler(); InterruptInitialize(); InterruptDisable(); InterruptDone(); InterruptMask();和 LoadIntChainHandler()。在155至156页文章给出了用户模式驱动的加载顺序,这个大家可以仔细阅读一下,特别是图6-5。另外,在这一节的最后给出一个关于驱动内存加载的一个说明,需要在bib 文件的 MODULES section中对其进行一个定义。

第四节驱动的加载
接上文三种那个驱动模式对应的也有三种加载模式,Device Manager (Device dll), GWES (Gwes dll)和file system (Filesys dll),设备管理器通常是用来加载流式设备,通过一个叫 ActivateDeviceEx() 操作设备,或者设备会通过注册表事先设定自动驱动。这里要注意的是表6-3,这个表比较重要,是注册表设置中几个比较重要的关键字。大家可以对照自己的注册表代码platform.reg来配合文中介绍看看到底这些个关键字起到的是什么作用。文章中给出了一个视频驱动,键盘,触摸板以及文件系统的例子来描述整个驱动自动启动的过程,通过这个例子大家可以很清晰的看出驱动是如何工作的。

第五节开发驱动
了解完了驱动的一些概念以后,我们就可以自己来写驱动了,首先作者提出了两个中断,interrupt service routine (ISR)中断服 务例程和interrupt service thread (IST)中断服务线程。提出了在系统开发中中断的重要性,同时提出了驱动任务的一个流程,确认中断的系统字符,有几个用途,可以确定具体的设备,可以通过DDKReg_GetIsrInfo() 来为系统注册设备,最后可以让OAL层传送IOCTL_HAL_REQUEST_SYSINTR中断命令,接着我们就可以创建一个事件,然后初始化中断InterruptInitialize(),接着就可以等着信号量来了,一旦接受到信号量就打开事件,完成后结束中断, InterruptDone() 调用。这是驱动中中断使用的基本流程,还有其他的一些流程例如IISR的,大家可以自己去看。接下来介绍了关于buffer分配和同步信号量和异步信号量的问题,大家可以仔细看看表6-7的对比。最后介绍调试中需要使用异常处理以及debug区间的一些定义,在最后给出了一些debug的实例和函数,大家可以参考使用。

在最后还是要说一句,驱动开发的时候尽量使用MS的标准结构来作为基础来写,一个可以降低开发难度,第二个降低出错率。

第六章学习完毕。

你可能感兴趣的:(windows)