Windows CE 6.0 启动过程分析

在理顺了上述文件的相互之间的关系之后,再来分析Windows CE 6.0的启动过程可能就比较容易啦。
      1、Startup函数:
      从Windows CE 6.0的帮助文档可以看出,WinCE6.0的启动只与oal.exe和kernel.dll有关,至于kitl.dll,只有将操作系统编译成具有 KITL功能时才用到。分析Windows CE 6.0的启动过程实际上找到编译oal.exe和kernel.dll的源码位置。
oal.exe的通过Startup函数完成硬件的初始化。Startup.s代码与该硬件平台的Bootloader启动代码共用,其中PreInit 函数主要完成将ARM处理器工作模式切换到管理员模式、同时关闭MMU,并检测系统启动原因,如果是热启动、即在该函数调用之前已经启动了 Bootloader程序,相当基本硬件初始化已经完成,则直接跳转到OALStartUp函数中;否则需要进行硬件中断屏蔽、内存、系统时钟频率、电源管理等硬件的基本初始化过程。
     2、OALStartUp函数:
     在系统硬件初始化完毕之后,Startup调用OALStartUp函数,OALStartUp函数主要完成将OEMAddressTable表传递给内核;然后调用KernelStart函数跳转到内核  OEMAddressTable表的主要作用表的每一个入口都定义了一个内存中的物理位置、内存的大小以及映射这物理地址的静态虚拟地址;
    ◆静态虚拟内存地址被定义在缓冲存储器的范围之内;
    ◆内核可以创建非缓冲的内存地址指向到相同的物理地址;
    ◆对于同一物理地址,既有一个缓冲的虚拟内存地址,也有一个非缓冲的虚拟内存地址;
    ◆OEMAddressTable最后必须以0结尾;
    ◆对于MIPS和SHx类型的CPU,物理地址与虚拟地址的映射由CPU完成,无需创建OEMAddressTable;
    3、KernelStart函数主要作用:
    ◆完成OEMAddressTable表中的物理地址到虚拟地址和虚拟地址到物理地址之间的映射;
    ◆对存储器页表和内核参数区存储空间(RAM或DRAM)进行清零处理。
    ◆读出CPU的ID号,内核需要根据该ID决定ARM的MMU处理,因为ARMV6和ARMV6之前的ARM处理器的MMU处理过程有所区别;
    ◆设置并开启MMU和Cache,因为在Startup函数关闭MMU和Cache;
    ◆设置ARM处理器工作模式的SP指针,ARM处理器共用7种不同的工作模式(USER、FIQ、IRQ、Supervisor、Abort、 Undefined、System),除用户模式(USER)和系统模式(System)之外,其他5种工作模式都有具有特定的SP指针寄存器(ARM处理器称其为影子寄存器);
    ◆读取内核启动所需要的KDataStruct结构体;
    ◆调用ARMInit函数重新定位Windows CE内核参数pTOC和初始化OEMInitGlobals全局变量;
    ◆利用mov pc, r12指令跳转到kernel.dll的入口位置,即NKStartup函数中。
    5、NKStartup函数:
    硬件平台初始化完成后,oal.exe的启动任务基本完成,余下的启动工作由内核相关且独立于内核的OAL层实现体kernel.dll接管。kernel.dll主要作用:
   ◆从结构体参数KDataStruct * pKData提取内核启动时所必须的全局变量,同时初始化内核全局变量;
   ◆定位对Windows CE 6.0特有的OEMGLOBAL结构体的初始化函数OEMInitGlobals地址,该结构体构建了内核和OAL层之间进行通信的桥梁。在 OEMGLOBAL结构体定义了OAL层所必须的函数,该结构体在oemglobal.c文件中被初始化,并被编译在OEMMain.lib和 OEMMain_StaticKITL.lib两个库中,如果OAL链接这两个库,则必须要有该结构体中函数实现体;
   ◆通过调用ARMSetup设置物理地址和非缓冲的虚拟内存地址的映射、ARM中断向量以及内核模式所需要的堆栈。
   ◆调用OEMInitDebugSerial函数初始化调试串口;
   ◆调用OEMInit进行平台初始化;
需要注意的时,NKStartup函数调用OEMInitDebugSerial和OEMInit函数的过程与Windows CE 6.0之前的版本完全不同,这是因为在Windows CE 6.0以前的版本中,由于内核(kernel)、OAL和KITL编译在一个可执行的文件中,它们之间的共享变量只需简单利用extern关键字申明便可相互之间进行访问,而在Windows CE 6.0中,由于内核(kernel)、OAL和KITL被编译成不同的可执行文件,变量之间的相互访问无法使用extern关键字实现共享,即内核无法使用extern DWORD varX方法访问OAL层的变量varX,当然OAL层的实现体同样无法通过同样的方式访问内核变量。为实现内核和OAL访问共享信息,Windows CE 6.0定义了OEMGLOBAL和GLOBAL两个结构体。
在 Windows CE 6.0的内核启动时,OS找到OAL的入口位置,然后调用入口函数与全局块进行指针交换,这样内核才能使用OAL层中的信息,同样OAL层才能访问内核(kernel)导出的函数。
   所以上述两个函数的调用实际上通过OEMGLOBAL结构体实现的。实际调用位置为$(_PRIVATEROOT)/winceos/coreos/nk /oemstub/oemstub.c中的OEMInitDebugSerial和OEMInit,这两个函数中通过OEMGLOBAL结构体指针访问 OAL层中的OEMInitDebugSerial和OEMInit。
调用KernelFindMemory()函数分割RAM区域,在Windows CE操作系统中,RAM空间主要分为存储内存和程序内存,存储内存主要为文件的存储空间,包括内核文件和复制到系统中所有目标文件,程序内存为运行程序时所需要的存储空间。
   ◆KernelStart ()启动内核。
   6、KernelSstart函数:
这里的KernelStart函数与前面的KernelStart函数的属于两个完全不同的函数,NKStartup函数中调用的KernelStart 函数为$(_PRIVATEROOT)/WINCEOS/COREOS/NK/KERNEL/ARM/armtrap.s文件中的KernelStart 函数,主要完成调用内核初始化函数KernelInit,并跳转到操作系统的第一个启动的任务。
   7、KernelInit函数:
Windows CE 6.0的内核初始化函数同其他版本的内核初始化函数基本相近,主要完成在启动第一个线程前对内核进行初始化,主要包括API函数集初始化、堆的初始化、初始化内存池、进程初始化、线程初始化和文件映射初始化等操作。
   8、FirstSchedule:
FirstSchedule函数为Windows CE操作系统启动过程中最后无条件跳转的一个函数,windows CE进行第一个调度,实际为一个空闲线程,因为windows CE系统还没有完成启动,只有当windows CE完全启动并进入稳定状态,然后启动文件系统filesys.dll,设备管理device.dll,窗体图像子系统gews.dll和shell程序 explore.exe.

时间: 2024-09-12 11:38:39

Windows CE 6.0 启动过程分析的相关文章

基于S3C2410的Windows CE 5.0 BSP移植

基于S3C2410的Windows CE 5.0 BSP移植 摘要  嵌入式开发中一个重要的环节是板级支持包(BSP)的开发,实际开发过程更倾向于移植BSP而不是重新开发BSP.本文先介绍了samsung公司的S3C2410微处理器和嵌入式操作系统Windows CE 5.0 特性,分析BSP结构,在此基础上,通过bootloader, OAL, 触摸屏驱动的移植来具体探讨BSP移植过程.   1 引言 在当今后PC时代,嵌入式系统应用得越来越广泛,嵌入式产品充斥着许多领域,日常生活的手机,MP

0点自动唤醒-windows CE 7.0在0点时会自动唤醒系统的问题

问题描述 windows CE 7.0在0点时会自动唤醒系统的问题 客户使用Zebra的MC32N0(CE7系统)的时候遇到一问题,设备在0点时会自动唤醒,而客户又设置了不会进入待机,所以一晚上下来就没电了,不知道有没有什么解决方法. 解决方案 判断下,如果启动了就关机

Microsoft Windows CE 5.0 Board Support Package, Boot Loader, and Kernel Startup Sequence

Mark PlaggeMicrosoft Corporation May 2004 Applies To:     Microsoft Windows CE 5.0 Summary Learn about the initial, low-level startup sequence and the hardware platform functions that are performed when the boot loader and OEM abstraction layer (OAL)

How to Develop and Test Device Drivers in Windows CE 5.0

Summary: This article provides an introduction to developing and testing a Windows CE 5.0 device driver. It provides step-by-step instructions for creating a stream driver, creating a custom Windows CE Test Kit (CETK) test, and writing an application

Windows CE 3.0 Source Code 免微软passport登陆下载

免微软passport登陆下载地址连接:wince30_src.zip Windows CE 3.0 Source Code (zip: 3.28 MB zip file; sorce: 5.03 MB executable file) 原下载页面:Windows CE 3.0 Source Code <!--Will be generated v-->Posted: July 20, 2001 <!-- --> <!-- Floating SideBar Area STAR

Windows CE S3C2440A开机启动滚动条编码分析

    和Windows XP一样,Windows CE任然可以绘制美妙的进度条,其实这个操作过程主要是对屏幕缓存进行操作.在S3C2440 CPU BSP代码中已经给出了这段缓冲的地址即IMAGE_FRAMEBUFFER_UA_BASE_eboot,这段缓冲支持的视频编码格式是RGB16,默认颜色为白色,在这个过程当中,并不像EVC一样提供了很多GDI绘图的函数,如绘制线条.矩形等,所有的操作都是从点开始的,由点绘制成线,由线绘制成矩形.可以发现,整个缓冲可以定义为一个二唯数据,每一个元素就是

vb.net2005下的pocket pc 2003应用程序与windows ce 5.0应用程序的区别

问题描述 小弟最近在开发PDA程序,发现在建立工程的时候有2中,pocketpc2003应用程序和windowsce5.0应用程序.请文一下这2中应用程序有什么区别,使用哪一种开发更为简便?望高手解答,本人不胜感激 解决方案 解决方案二:WindowsCE是微软公司嵌入式.移动计算平台的基础,它是一个开放的.可升级的32位嵌入式操作系统,是基于掌上型电脑类的电子设备操作系统.WinCE是一个嵌入式操作系统,使用范围更广泛,不过它只是提供最基本的操作系统功能.WindowMobile是一个基于Wi

StringSplitOptions这个枚举为什么会没有,在web里面有,在建智能设备下面的windows ce 5.0建项目就没有

问题描述 我在做PDA项目PDAStringSplitOptions这个枚举为什么会没有,在web里面有,为什么在这个项目里面就没有而且sqlce安装好了是不是跟sql2000同步一起使用的要用到的表都要把数据导入到sqlce里面来吗? 解决方案 解决方案二:up

Windows CE嵌入式导航系统研究(内核相关)

1.1 嵌入式车载导航系统的软件设计流程 嵌入式车载系统软件主要包括系统内核.驱动程序.应用程序三部分.设计的过程当中,我们采用瀑布模型进行设计,首先制定Windows CE5.0系统内核,再次编写相关设备驱动,最后编写或移植应用程序. 制定内核时,我们采用SunSaung2440 BSP(板级支持包)进行制定,同时提交组建保证系统支持网络通讯.文件系统.CAB包安装.汉语支持等功能.不仅如此,为方便系统应用程序开发,内核制定之后,我们发布相应的SDK. 图 5.1 软件设计流程 1.2 Win