OEM层OAL层引导程序配置文件驱动硬件层核心NK.exe操作系统层Core DLL多媒体GWES设备管理器对象存储通信网络服务应用与服务开发Internet客户服务国际化用户接口WinCE应用程序客户应用程序应用层
图 2?1 windows CE操作系统模型
2.1 注册表 注册表是一个系统数据库,存储应用程序、驱动程序和操作系统的配置配置信息。树型层次结构,为子树,键以及键值项(含键值名,数据类型,键值)所组成。应尽量使键和键值项占用较少空间。CE支持两种类型的注册表,即RAM-based registry和Hive-based registry,前者以系统数据对象方式(RAM)存储,掉电后会丢失,后者以文件形式存储,分两部分:系统Hive(含系统数据)和用户Hive(含用户特定数据),所谓hive是指一组键,子键和键值项,有一套支持文件,文件中有数据的备份。 HKEY_LOCAL_MACHINE\init\BootVars下的键值项SystemHive 中存储有系统Hive的文件路径信息, HKEY_LOCAL_MACHINE\init\BootVars下的键值项ProfileDir存储所有用户目录的位置,命名为USER.hv的用户Hive存放在这些不同的用户目录中。还有一个Boot Hive,只用于系统启动时的系统设置(存在于rom中,系统hive启动后,会终止)。注:CE中有四个注册表根键:HKEY_LOCAL_MACHINE,HKEY_CURRENT_USER,HKEY_CLASSES_ROOT,HKEY_USERS2.2 内存管理图 2?2 进程虚拟地址空间分布0x400 0000(1G)Slot 0 (32MB)Slot 1 (32MB)Share memory所有应用程序共享0x0000 00000x01ff ffff0x03ff ffff……0x7fff ffff静态映射所有512MB物理内存(cached),仅供内核访问0x9fff ffff0x8000 0000Virtual Address重复定义(uncached)0xBfff ffff0xA000 0000系统保留0xc1ff ffff内核程序nk.exe使用0xc3ff ffff用户静态虚拟地址空间0xdfff ffff0xffff ffff内核使用虚拟地址空间 Code 代码正文Readonly data只读数据Readwrite data读写数据ResourceHeap堆,保留空间Stack栈,保留空间Free virtual spaceRAM-based DLL(非XIP)XIP DLL space其余XIP DLLsCore dll 0x0001 0000 由于嵌入式系统的特定要求,CE必须比桌面系统更有效的使用和节省物理内存,采用有ROM文件系统与RAM文件系统。可以在ROM中存放压缩的与非压缩的文件,前者中的可执行文件(dll,exe)必须解压到RAM才可使用,后者如果在支持线性访问的介质(如NOR flash)中则可以XIP。非XIP的DLL在加载时,会在调用dll的进程的slot0空间中按需申请物理内存。RAM文件系统专用于对象存储,NK(config.bib中定义,用于存放从flash中的内核镜像解压出来的所有文件)以外的RAM分为对象存储区域(采用flash进行对象存储后,可以减少)和应用程序内存区域(默认各一半)。
2.2.1 虚拟地址空间4GB的虚拟地址空间主要分为两部分,0x8000 0000以上部分由内核使用,以下部分为应用程序使用。启动过程中会把所有物理空间映射到0x8000 0000以上供内核以后使用(CE最多支持512MB的物理内存)。当一个应用程序启动时,内核为这个进程选择一个空闲的slot,为分配所有的代码,资源分配足够的地址空间,然后分配堆和栈,加载非XIP DLLs,一旦进程得到使用权,整个地址将会映射到slot0,slot0的最底64kB为保留区域)。如果dll已经被载过,则会在使用该dll的进程所在slot中预留出该dll的空间。 当一个应用程序启动时,内核为进程在进程本身的地址空间中分配一个192KB(虚拟地址空间)的默认堆,如果是需要几MB的堆,内核会在全局地址空间0x4200 0000至0x7fff ffff中分配所需的空间。栈也是一段连续的虚拟地址空间(一般为64KB,并且保留顶部的2kB防溢出),主要为函数使用。 可以用堆函数,内存映射文件,或VirtualAlloc/VirtualFree来申请/释放大的连续的虚拟地址空间。① 堆 多次创建堆,释放堆,可能能造成内存碎块(因而桌面windows系统中,频繁移动分散的,已分配的内存块使它们聚在一起),相关的接口:HeapCreate、HeapAlloc、HeapReAlloc、HeapSize、HeapFree、HeapDestroy等。② 内存映射文件 内存映射文件可以保留一个虚拟地址空间(在全局地址空间0x4200 0000到0x7fff ffff)和保留一个RAM读缓冲区,并提交物理存储器(RAM物理内存或flash), 不必在访问文件前申请大的数据缓冲区(具体的读操作由操作系统来完成),这适合于加载大的exe或dll文件,减少加载时间,也用于进程间通信(也可以用对象存储区)。创建有名或无名的内存映射文件相关的接口:CreateFileForMappingàCreatFileMappingàMapViewOfFileàUnmapViewOfFile,这里的view称为文件视图,可以是全部文件或部分文件.③ VirtualAlloc/VirtualFree这实际上是new操作的底层分配虚拟地址的函数,在调用进程的地址空间或全局地址空间内分配符合条件的地址空间,并用0自动初始化提交的物理内存。(地址空间中的每个分配的块有三种状态:可用,保留,提交。),但提交大量物理内存时,使用内存映射文件的成功概率要大得多。 2.3 文件管理FileSys.exeROM文件系统对象存储RAM系统注册表RAM文件系统属性数据库存储管理器文件系统筛选器文件系统驱动分区驱动程序存储驱动程序存储介质图 2?2 windows CE文件系统结构 文件系统和所有与文件相关的API都是通过文件管理器FileSys.exe进程来管理的。所有的文件系统统一到根“\”下的单一命名空间中。Windows CE的文件系统结构如图:
其中与存储管理器相关的配置配置信息在HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\xxx下(xxx可能是Hard disk等),这里的Profiles键值项中保存了所有设备的默认的配置项。存储管理器(针对外围存储器,如硬盘)中加载驱动程序的过程如下:设备管理器负责为块设备装载存储驱动程序(在设备管理器中创建相关的数据结构以记录与该设备相关的各种信息)à告知存储管理器该设备相关的信息(如设备名,GUID)à存储管理器根据注册表中的配置信息加载分区驱动程序à枚举分区,标识分区上的文件系统,并加载相关文件系统驱动程序à挂接入统一的根。2.4 设备管理 windows CE的设备管理主要分为四个部分:I/O管理,PnP管理器,电源管理,及管理和支撑例程。设备管理器集中为Device.exe文件,这是用户级别的程序,与内核,注册表,流接口驱动程序有密切关联。通过注册信息HKEY_LOCAL_MACHINE\init\”Launch20”=“Device.exe”在启动时加载,并始终运行。设备管理器的任务是: 在系统启动时或外围设备添加时初始化驱动程序的加载;向内核注册特定的文件名;从外围设备获得即插即用标识符,或激活一个检查子程序查找合适的驱动程序;通过读写注册值跟踪驱动程序;不再需要设备时,卸载驱动程序。 2.5 进程管理 进程是正在运行的程序的实例,由两部分组成:进程的内核对象和进程拥有的地址空间,一个进程可以由一个或多个线程组成。内核调度系统中有一个当前所有进程中的线程的优先级表,并按优先级进行调度。Windows CE最多支持32个进程同时运行。当前运行进程的地址空间在slot0和slot1之间,总的进程空间为0x0000 0000到0x4200 0000之间。相关的接口函数是:CreateProcess、OpenProcess、ExitProcess、TerminateProcess等。 线程是进程中真正的执行单元,能访问所在进程的所有资源,并且拥有自已的栈(默认为64KB),线程有5种状态:运行running,挂起suspended,睡眠sleeping,阻塞blocked,终止terminated。相关的接口有:CreateThread,ExitThread,TerminateThread,ResumeThread,SuspendThread等。CE把进程分为256个优先级,0级优先级最高。0-96 为高于驱动程序的程序,97-152驱动程序,153-247低于驱动程序的程序,248-255普通和应用程序,以此垫定实时性,但还需要解决类似优先级反转的死锁(如正在运行的高优先级进程需要等待访问处于临界区状态的低优先级的资源时)。除了线程外,线程内部可以有调度系统调度纤程。2.5.1 同步问题线程之间的通信要加以同步,一般应优行先采用在用户模式下的同步方法,如:互锁函数Interlocked(属原子访问),临界区Critical Section(保证临界区内的资源不被其它线程访问),还存在其它几种内核模式下的同步:事件对象Event(线程睡眠,而内核执行等待),互斥对象Mutex(类似于临界区,但相对较慢),信标对象Semaphore(用于限制资源访问数量),消息队列MsgQueue(利用很小的内存传递消息)等。如下列出一些相关的函数: 【互锁函数】原子访问,执行速度快InterlockedIncrement、InterlockedDecrement InterlockedExchangeAdd、InterlockedExchangeInterlockedExchangePointer、InterlockedCompareExchange、InterlockedCompareExchangePointer【临界区】当前线程执行完临界区代码后才允许其它线程访问临界区资源InitializeCriticalSection、 EnterCriticalSection、LeaveCriticalSection、DeleteCriticalSectionTryEnterCriticalSection 、CcriticalSection(MFC)【事件对象】需要与等待函数配合,含一个计数器,与两BOOL量(一个指示状态,另一个指示自动重置还是手动重置)。CreateEvent、SetEvent、PulseEvent、ResetEvent、OpenEvent 【互斥对象】与临界区相比是其有内核的全局性,可以使不同进程的线程访问共享资源。CreateMutex、ReleaseMutex 【信标对象】用于限制资源访问数量,无信号状态时可用资源数为0CreateSemaphore、ReleaseSemaphore 【消息队列】线程间传递数据,小内存,一般只用于点对点通信。CreateMsgQueue、CloseMsgQueue、GetMsgQueueInfo、OpenMsgQueue、ReadMsgQueue、WriteMsgQueue。 还有四个等待函数,事件对象配合WaitForSingleObject、WaitForMultipleObjectsMsgWaitForMultipleObjects、MsgWaitForMultipleObjectsEx2.6 图形窗口事件子系统GWES GWES是用户,应用程序和操作系统之间的接口,模块为Gwes.exe,支持部分驱动程序(交互界面相关,电源管理等)的加载工作,可以定制为三种推荐的配置方案:最小配置,中等配置,完全配置。界面部分(对应桌面windows的User32)包括用户输入系统,事件管理器,窗口管理器三个组件,GWES还添加有存储空间不足时的提示与解决方案。(由于与桌面windows很相似,略)3. 组件与特性3.1 组件 CE中比较重要的组件集合包括BSP,Core OS Services,对象存储和注册表,多媒体技术,通信服务与网络,国际化支持等。 BSP即主板支持包,包括启动程序,OEM适配层(OAL),标准开发板(SDB)和相关硬件设备的驱动程序。其中OAL层可以初始化并管理硬件,设备驱动和启动程序,及相关配置文件,以此连接到系统核心。 Core OS services包括内核特性,及CE平台操作系统通用特性,NK.exe为内核的代表,操作系统的许多功能通过它来实现,这些功能就包括进程和线程管理、内存管理、调度、实时能力等,进程的系统调用通过在Coredll.dll中定义的陷入函数进入。Coredll应用程序WIN32API转换程序本地进程服务堆Nk.exe虚拟内存进程/线程异常处理调度,启动同步等中断处理硬件抽象内存映射,中断等Hal.libHk.lib中断处理进程切换文件系统GWES.exe 设备驱动Severice.exe硬件中断进程接口动态链接库接口陷入函数调用图 3?1 内核与各层模块 在多媒体方面,支持视频技术(二组API:Direct3D提供基本的3D图形表现,DirectDraw为2D图形提供加速支持,在硬件不支持时可用软件模拟),音频技术(三组API:DirectSound快速访问硬件,DirectMusic从软件上支持MIDI音乐格式,Waveform Audio)。
通信服务和网络方面,services.exe为Device.exe进行补充,提供增强的安全性的支持,网络通信模型采用分层结构设计,支持无线和有线网络(802.11,GPRS,CDMA,Ethernet,bluetooth等)与相关的各种协议(RAS,TCP/IP,OBEX,IrDA等)。3.2 特性定制3.2.1 CEC文件(.cec) 特性目录集合(.cec)文件是文本文件,允许Platform Build显示该特性集,并把它加到操作系统镜像中去。(PBàtools菜单->CEC Editor,用Insert菜单->Feature Group创建特性组,Feature项添加特性,Build Method建立新的构造方法,BIB Information菜单项部署该特性到操作系统镜像,最后用Catalog菜单的Add to Catalog加到PB的IDE环境)。含有如下单元:CECInfo,ComponentType,Implementation,BuildMethod,BibInfo等。3.2.2 BIB文件 BIB(Binary Image Build),二进制格式映像的构造文件,定义模块如何加入os,主要功能是分配内存,定义要放在操作系统中的其他文件。含如下域:MEMORY,CONFIG,MODULES,FILES。3.2.3 REG文件 注册表文件。在系统执行时,Makeimg.exe用它来为操作系统建立注册表项,Filesys.exe用它来建立一个默认的注册表。(Platform.reg定义目标设备硬件注册表,Project.reg定义.exe文件的注册表设置,Common.reg定义BSP的注册表设置)3.2.4 其它文件 DAT文件指定系统冷启动时文件系统应如何初始化RAM文件系统;DB文件为对象存储定义默认的,基于RAM的属性数据库。3.2.5 生成操作系统镜像 基于CE的操作系统镜像的生成过程主要分为4个阶段:CESYSGEN 搜集以后在生成过程中,所要用的所有头文件,用于生成DLL的DEF文件。筛选出的BSP数据将放在BSP的cesysgen(如WINCE400\cesysgen)的平台配置文件夹中.BSP阶段(build.exe)将编译和链接图形,窗口和事件子系统(GWES),内核,OAL及设备驱动程序。BUILDREL阶段,从多个位置取得文件,数据,配置和可执行文件模块,并把它复制到后阶段MAKEIMG时用到的发布目录(%_FLATRELEASEDIR%)MAKEIMG阶段,结合BSP的Files目录中的配置文件和上一阶段复制过来的各种文件,执行链接,把所有的内容组合成一个二进制文件NK.BIN(放在%_WINCEROOT%)。另外,可以在PB的菜单Configure SDK里启动SDK配置向导,建立当前平台的SDK。4. 引导操作系统 一般BootLoader用于启动硬件和下载nk.bin(网络TFTP,串口kermit,xmodem等协议)到目标板上,并有一定的监控作用, 存放于目标平台的非易失存储介质中。如下是DOC(DiskOnChip)中的引导过程:图 4?1 在doc上启动WinCE操作系统另外,BootLoader都会设计成支持命令输入的方式,通过串口来接收用户的命令。这些命令涉及到平台调试的各个方面,像内存检测、Flash操作、文件下载等。借助于这些命令,不仅可以完成硬件平台的部分测试, CE的BootLoader程序最为重要的一个功能是下载CE映像,然后才是跳到CE映像所在的RAM地址去去运行CE内核。5. CE下的驱动程序5.1 驱动模型 驱动程序用以把操作系统与设备连接口驱动程序连接起来,使操作系统能够识别设备并为应用程序提供设备服务。目前CE提供两种模型,即本机设备驱动程序(适于集成到内核的设备)和流接口驱动程序(一般类型的设备)。驱动程序可以是monolithic(单片)或layer(分层)的。流接口驱动程序几乎支持任何类型的可以连接到CE平台的外设,表现为用户一级的动态链接库DLLs。如图所示,分层驱动程序由模型设备驱动MDD和平台依赖的驱动PDD两层组成,PDD向MDD提供设备驱动程序服务提供器接口DDSI,MDD 层向上层提供设备驱动程序接口。流接口驱动程序也会调用到本机设备驱动的DDSI。函数描述XXX_init【设备管理器】ActivateDeviceEx初始化设备时调用XXX_IOControl【上层软件】DeviceIoControl时调用XXX_Open【应用程序】CreateFile时调用XXX_Read【应用程序】ReadFile时调用XXX_Write【应用程序】WriteFile时调用XXX_Seek【应用程序】SetFilePointer时调用XXX_PowerUp系统重启或唤醒时调用XXX_PowerDown系统挂起或省电模式前调用XXX_Close【应用程序】CloseHandle时调用XXX_Deinit【设备管理器】卸载驱动程序时调用GWESDDI函数设备驱动程序单片设备驱动程序MDD层PDD层DDSI函数硬件
图 5?1本机设备驱动程序的monolithic和layer类型
表 5-1流接口驱动程序接口函数集 CE的设备管理器程序是一个用户级别的程序,它与内核,注册表和流接口驱动互动,使用注册表中的键HKEY_LOCAL_MACHINE\Drivers及其子键(Active\,BuiltIn\,PCMCIA\,Resource\等)来管理设备驱动程序。 CE下的设备被表示成一个设备文件,常在\windows下,文件名由前缀(为三个大写的字母,如COM),一位数字序号,和冒号组成(例如COM1)。通过注册键里用Index指定序号。5.2 流接口驱动程序流接口驱动程序都用同一组接口并调同一组标准函数集,以此完成标准的文件IO操作和电源管理,见表5-1。当设备需要驱动程序为其服务时,CE平台使用中断机制通知操作系统(CE支持中断嵌套和抢占),中断处理分成两部分:中断服务程序ISR(常驻OAL层,可直接访问注册表)和中断服务线程IST(PDD层,执行大多数的中断处理)。IST使用一个事件,并用WaitForSingleObject等待事件变为有信号(中断irq号与事件在InterruptInitialize时向内核注册),然后线程醒来并继续中断处理。驱动程序在编写时可选用PB或EVC,结合MFC可编写出相关DLL代码,但要集成到内核,还需编写配置文件.cec,.bib,再把添加的feature加入catalog,并import到相关Platform,最后重新编译内核nk.bin即可进入调试阶段。流接口驱动程序的加载有三种方法:在系统启动时,从注册表HKEY_LOCAL_MACHINE\Drivers\RootKey下找到键值Drivers\BuiltIn,并根据该值读取HKEY_LOCAL_MACHINE\Drivers\BuiltIn键的内容,并加载列出的流接口驱动程序。第二种加载在设备管理程序自动检测外围设备与CE平台连接时进行,需要把找到的即插即用标识符与注册表进行比对,以确定执行注册表列出的驱动程序或自动探测。第三种情况是在不能自动探测或加载驱动时,用ActivateDeviceEx函数来加载驱动。本文地址:http://com.8s8s.com/it/it31473.htm