wince的层次体系结构

应用程序层

操作系统层

OEM层

硬件层

应用层:

包括Internet客户端服务,第三方应用程序,winCE应用程序,用户界面

操作系统层:

包括应用和服务、CoreDLL、对象存储、对媒体技术、GWES、设备管理器、网络、内核

OEM层:

包括OEM抽象层、驱动程序、BootLoader、配置文件。

具体如下图:

ES嵌入式系统 嵌入式oem_wince

下面详细介绍更个层:

1)硬件层:


嵌入式硬件通常具有如下特点:


1、处理器体系结构不统一


处理器从8到128位不等,处理能力也从几KHZ到几MHZ甚至几GHZ各异,更重要的时指令集以及结构不一样。我们的手机大多是ARM体系结构的,网络设备上用的比较多的时Power PC;MIPS和SH等多种不同的CPU也在嵌入式领域占有一席之地。


2、硬件资源通常受限


在嵌入式系统中,不仅cpu计算能力有限,内存RAM也非常小,很多没有输出设备,或者是简单的LED,还有一些使用干电池。值得一说的是,因为嵌入式硬件是以“够用”为前提的,所以不是所有的嵌入式设备资源稀缺。有些娱乐设备(索尼公司PS3)为了增强图形处理能力,使用了128位CPU,一些航天设备也远远超过了PC机。


3、外部设备种类繁多


除了鼠标键盘打印机外,无法满足嵌入式的要求,有些车载嵌入式系统,要传感器来获得参数。


4、实时性和可靠性的要求


在有些嵌入式系统中实时性和可靠性要求很高,否则会造成重大的灾难性损失。



2)OEM层:


OEM层是逻辑上位于硬件和操作系统之间的一层硬件相关代码。他的主要作用是对具体的硬件进行抽象,抽象出统一的接口,然后winCE内核可以使用这些接口与硬件进行通信。OEM层包括OEM抽象层、引导程序、配置文件和驱动程序4各模块。


OEM抽象层(OEM Abstraction Layer,OAL)是整个OEM层的主体。它包含了高度硬件相关的代码。OAL主要负责winCE内核与硬件通信。当引导程序引导操作系统结束后,由OAL初始化硬件平台,包括中断服务例程、实时时钟、计时器、内和调试等。OAL的代码在物理上是内核的一部分,最终经过编译连接会成为内核的一部分。


引导程序:


BootLoader是在硬件开发板上执行的一段代码,主要功能是初始化硬件,加载操作系统映像到内存,然后跳转到操作系统代码去执行。BootLoader可以通过串口、USB、以太网获得操作系统映像。如常见的以太网(eboot)。


配置文件:


这些配置文件一般是与操作系统映像和源代码有关。如如何编译,如何配置最终的操作系统映像等。


设备驱动程序:


设备驱动的种类很多,如电池、显卡、声卡和USB等驱动。


BSP:


和OEM层相对应的一个概念就是bsp。bsp是介于主板硬件和操作系统之间的一层,也可以说是操作系统的一部分。实际上只有讨论体系结构时候我们才说OEM层,OEM和bsp是对等的。不同的操作系统对bsp有不同的定义。在pc机上几乎没有谈到bsp,因为pc机都是采用统一的x86体系架构,这样一定操作系统的bsp就是单一确定的,所以就没什么意义了。有人将bsp和pc机主板上的BIOS相提并论,其实差别很大。BIOS主要是负责在电脑开启时自检、出事画系统设备及装载操作系统代码等,它是固化的,没法改变的。bsp是和操作系统绑定在一起的,开始部分BIOS工作类似,但是大部分不同。bsp可以添加和系统无关的驱动,甚至可以吧上层开发统统放进去,而BIOS不行。



3)操作系统层


操作系统层实现了winCE作为一个操作系统的主要功能。wince的进程管理、线程管理、调度、物理内存、虚拟内存、文件系统以及设备管理等功能的实现在这一层。操作系统的基本功能放在几个独立的进程(exe)里面实现,大致有如下几个:


1、内核NK.exe


2、图形系统GWES.exe


3、对象存储FILESYS.exe


4、设备管理系统DEICE.exe


5、服务SERVICE.exe


其中1和3是必不可少的。



系统调用与CoreDII.dll:


CoreDLL.DLL不是一个单独的进程,它是一个会被所有用户进程都加载的动态链接库。所有的应用程序不能直接与操作系统或硬件打交道,如果应用程序希望访问winCE提供的服务,那么只能通过CoreDLL.DLL进行。下面说一下系统调用的详细过程。


a.当进行系统调用时,它直接调用的时CoreDLL.DLL中的一个包装函数,此包装函数为真正系统调用准备所需要的参数。CoreDLL.DLL会被winCE的所有进程加载,因此这一步其实只是进程内部的函数调用。


b.CoreDLL.DLL会发起一个异常,也叫软件中断。总之,异常把执行权重重新有应用程序还给操作系统。


c.操作系统内核捕捉所有异常,当操作系统获得此异常时,也就重新获得CPU。在WINCE上,NK.exe会处理这个软件中断,这样系统调用的应用程序进程就挂起来了,执行转入了NK.exe。


d.接下来NK.exe根据系统调用的不同,找到具体实现该系统调用的进程,此进程可能是NK.exe也可能不是,如果不是在跳转。


e.实现系统调用的进程会得到执行的机会,然后返回。


f.当系统调用的进程执行结束返回的时候,整个系统调用也就结束了,应用程序可以从对CoreDLL.DLL的调用返回,然后继续执行。


值得一提的时CoreDLL.DLL有些函数不是系统调用的包装函数,如字符串处理,如果不是,就不用发生自陷和进程执行跳转。



如:charlowerbuff()函数就是在CoreDLL.DLL中实现,不用中断;createProcess()调用CoreDLL.DLL,然后自陷进入NK.exe,而NK.exe中可以实现createProcess(),所以无需切换到其他进程;CreateWindow(),调用CoreDLL.DLL,然后自陷进入NK.exe,而NK.exe中没有相关函数,所以要切换到GWES.exe图形界面线程中进行执行,执行后返回。


图:

ES嵌入式系统 嵌入式oem_嵌入式_02






1、NK.exe


实现了进程创建加载、线程调度、中断处理和内存管理等核心功能。


2、GWES.exe


负责图形界面的相关部分,用户的输入(键盘、鼠标、触摸屏)和现实都是由它来管理的。


3、FILESYS.exe


负责对象存储进程,包括文件系统、数据库系统、系统注册表三部分。


4、DEVICE.exe


负责加载卸载和管理所有不被GWES.exe管理的驱动程序。同时也向系统提供所有有关驱动的API的实现。


5、SERVICE.exe


系统服务进程。如FTP、HTTP等



4)应用程序层


目前一个比较普遍的误解就是应用含金量低,底层比较有技术含量,其实衡量一个系统的价值,很重要的标准就是看运行在其上的应用程序如何。没有应用程序的支持,功能在强大、设计在精良的操作系统也只能是玩具而已。



A.进程


进程是程序的一次动态执行实例。进程和程序有很多区别:


1、进程是动态的概念,而程序是静态的概念


2、进程有创建、执行以及结束完整的生命周期,而程序只是一个文件


3、一个程序可以对应多个进程,而一个进程只能对应一个程序。如:打开多个IE浏览器网页,内存中会有多个浏览器的进程,但是每个进程对应的只有iexplore.exe


在WINCE中,进程本身不参加系统调度,也没有优先级和上下文,真正参加系统调度的时线程,进程只是线程的容器,每个进程都会有一个主线程。



由于winCE只支持32个进程同时运行,每个进程有32MB的虚拟地址空间,也被称为一个slot。在系统启动时,filesys.exe gwex.exe device.exe 已经占据了多个slot,用户可以用的只有不到30个。所以能多线程就不要多进程。


此外,wince不支持环境变量和当前目录。如下面的代码是不正确的。

_wfopen(L"%windows\\myfie.txt",L"w"); 

 

  _wfopen(L"myfie.txt",L"w");



一种解决办法就是使用GetModule()函数得到当前执行文件所在的目录,然后再吧要打开的文件拼接到路径中得到完整的路径,参考代码如下:


DWORDdwLen;

    TCHARszPath[MAX_PATH];
 
    dwLen= GetModuleFileName(NULL, szPath, MAX_PATH);//获取当前模块目录
    if (!dwLen)
    {
       return 0;
    }
 
    while (szPath[--dwLen] != _T('\\'))
    {
       szPath[dwLen] = _T('\0');
    }        
    wcscat(szPath, _T("myfie.txt"));//


B. 线程

(留到下一次讲操作系统讲吧。)