`
isiqi
  • 浏览: 16358816 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

WinCE中OEM适配层点滴之系统初始化

阅读更多

OAL(OEM Adaptation Layer)既OEM 适配层,从逻辑上讲位于Windows CE内核和硬件之间,从物理上讲OAL各个模块代码被编译后(.lib)和其它内核库链接到一起形成Windows CE的内核可执行文件nk.exe。Windows CE内核在OAL层暴露了大量的函数和全局变量,利用这些函数和全局变量OEM可以编写中断处理、RTC、电源管理、调试端口、通用I/O控制代码等。图1更直观地描述了OAL的结构。CE安装目录的子目录中包含了OAL的部分源码,大多数情况下开发者对OAL只要修改即可,甚至无需修改。通过阅读本篇文章,开发者能够了解OAL的结构、暴露的接口的功能,可以在此基础上实现甚至增强OAL的功能.


图1 OAL结构图

  因为OAL层代码大多数和CE启动时系统初始化工作有关,所以本篇文章以CE的启动顺序为线索。其它OAL知识在下一篇文章中讲解。

  一、在Boot Loader解压CE内核镜像文件(nk.bin)后开始跳转到StartUp(),StartUp函数属于OAL层,此时CE操作系统内核还没有运行。StartUp函数的功能主要有两个,一是初始化CPU为已知状态(known state),二是调用内核初始化函数(x86平台为KernelInitialize,其它平台为KernelStart)。初始化CPU工作因CPU的不同而不同,如果是ARM系列,包括设置CPU为管理员模式、禁止IRQ和FIQ、禁止MMU、清空指令和数据缓冲、检测启动原因、配置GPIO和内存控制器、初始化RTC、保存OEMAddressTable地址等。执行完毕后调用KernetStart。如果是x86系列,包括设置CPU为保护模式、初始化内存控制器、保存OEMAddressTable地址等。执行完毕后调用KernetInitialize。
 
  二、内核初始化函数的功能也因CPU的不同而不同,不过有一些功能是相同的,如初始化串口(为了输出调试信息)、调用OEMInit函数等。对于x86系列,初始化工作除了上述的功能外还包括读取OEMAddressTable内容、确定分页大小、内核重定位、初始化中断分配表、初始化分页表、内存初始化和其它初始化。对于其它系列CPU请参考CE帮助文档。

  1. 串口调试:

  串口调试函数包括OEMInitDebugSerial、OEMReadDebugByte、OEMWriteDebugByte等。从OEMInitDebugSerial的源码可以看出,系统从BOOT_ARG_PTR_LOCATION为首地址的结构中判断当前连接的串口是哪个,然后配置这个串口。如果你的设备的串口I/O地址设置和CE默认的一致的话,就能在CE内核得到CPU控制权到启动完毕这段时间里通过串口得到调试信息。

  2. OEMInit

  一般在OEMInit中初始化所有外围的硬件、初始化系统时钟(system tick)和RTC(real time clock)、初始化KITL(Kernel Independent Transport Layer)。例如I486平台的OEMinit函数,它先关联所有的IRQ和中断ID,然后初始化PCI总线、网络适配器、电源管理、PIC(可编程中断控制器)、系统时钟,最后检测是否有扩展内存。另外如果OEM要通过OAL暴露的函数指针或者全局变量来增强功能的话,就要在此函数中实现(在下面详细讲解)。

  3. 检测扩展内存

  我们都知道在config.bib配置文件中设置CE系统使用RAM总量(如果不知道请参考我的文章Platform Builder之旅系列),注意这个RAM总量不是总的物理内存的大小。PB编译的内核包含一个变量ulRAMEnd,将在config.bib中定义的RAM的起始地址 + RAM大小的和赋值给ulRAMEnd。在CE内核的启动过程中,ulRAMEnd的值赋值给全局变量MainMemoryEndAddress,CE内核通过访问MainMemoryEndAddress得到RAM的总量信息。假如基于CE的设备附加了RAM,而MainMemoryEndAddress的值没有包括这段附加的RAM,结果CE内核无法知道已经附加了RAM。为了让CE内核了解附加RAM的信息,OEM应该编写一个函数检测RAM的总量,并把总量值赋给MainMemoryEndAddress。OAL暴露了一个函数指针pNKEnumExtensionDRAM,OEM应该把编写好的函数地址赋给这个函数指针。如果OEM不准备自己编写内存检测函数的话也可以调用OEMGetExtensionDRAM。从帮助文档中看出OEMGetExtensionDRAM这个函数能够检测内存的总量,但是CE的针对X86 平台的源码中没有具体编写这个函数的实现代码(见%_WINCEROOT%\PUBLIC\COMMON\OAK\CSP\I486\OAL\cfwpc.c)。也就是说在X86平台上调用OEMGetExtensionDRAM是检测不到RAM的。如果OEM有兴趣编写检测RAM总量的函数,可以调用现成的函数IsDRAM。这个函数也保存在cfwpc.c中。

  三、内核初始化函数执行完毕后开始按如下步骤执行:

  1. 内核创建用于与filesys.exe同步的事件对象SYSTEM/FSReady,之后启动filesys.exe。启动filesys.exe的意义是让filesys.exe读取注册表数据。

  2. 内核等待事件SYSTEM/FSReady被触发,这个事件是由filesys.exe在做完一系列工作后触发。这一系列的工作内容如下:

  2.1 先检测这是一次冷启动还是热启动,如果是冷启动,那么初始化对象存储内存区域。

  2.2 调用OEMIoControl函数,I/O控制代码为IOCTL_HAL_INIT_RTC,也就是初始化RTC。

  2.3 初始化数据库子系统和API、文件系统API、消息队列API。

  2.4 如果操作系统镜像(nk.bin)包括RAM文件系统,那么读取Initobj.dat文件内容后创建一个RAM文件系统。

  2.5 初始化注册表(在内存中形成注册表)。

  2.6 如果此时device.exe没有启动,那么读取HKEY_LOCAL_MACHINE\System\StorageManager下“Dll”的值(这个值为存储管理器所在的.dll的文件名)并加载到内存。加载之后创建一个线程专用于初始化存储管理器,初始化之后此线程结束。

  2.7 初始化NLS(national language support)。关于NLS请参见我的文章《CE下中文输入法编辑器》。

  2.8 为数据库引擎设置本地ID。

  2.9 读取Initdb.ini文件,安装在对象存储中的数据库。

  2.10 触发SYSTEM/FSReady事件,之后filesys.exe处于等待状态,等待内核发通知给它。

  3. 此时注册表已经存在于内存当中,内核开始读取如下位置数据:

HKEY_LOCAL_MACHINE\Loader\SystemPath

HKEY_LOCAL_MACHINE\SYSTEM\OOM\cbLow and cpLow

HKEY_LOCAL_MACHINE\SYSTEM\KERNEL\InjectDLL

HKEY_LOCAL_MACHINE\MUI\Enable and SysLang

HKEY_CURRENT_USER\MUI\CurLang

  4. 内核设置低内存处理(out of memory)。低内存处理是指当前可用的内存非常少时,内核所做的解决方案(CE帮助文档中有详细说明)。

  5. 内核在做好了上述工作后通知filesys.exe,由filesys.exe做其余工作。filesys.exe所做的工作内容如下:

  5.1 读取HKEY_LOCAL_MACHINE\System\Events 下包含的所有事件对象名称并一一创建。

  5.2 读取HKEY_LOCAL_MACHINE\Init 下包括的所有应用程序名称并一一启动。如果device.exe在列表中并且此时它已经启动了,那么触发SYSTEM/BOOTPHASE2事件,这会使device.exe重新读取注册表数据来完成最后的驱动程序初始化。

  5.3 初始化时间区域(time zone)。
分享到:
评论

相关推荐

    wince6—创建初始化函数

    在Windows CE 6.0(简称WinCE6)开发中,使用Visual Studio 2005作为集成开发环境(IDE)时,经常会遇到创建自定义对话框控件并需要进行初始化的情况。`OnInitDialog()` 函数是MFC(Microsoft Foundation Classes)...

    wince内核初始化分析

    Windows CE 6.0 内核初始化是一个复杂的过程,它涉及了从Bootloader开始到操作系统完全启动的一系列步骤。在嵌入式系统中,Windows CE(通常简称为WinCE)因其用户友好的图形界面和可定制性而广受欢迎。本文将深入...

    WINCE 系统移植点滴

    注册表是WinCE系统配置的核心组件,通过修改注册表,可以动态调整系统行为,如设备的初始化参数、优先级等。在本例中,通过对COM端口的重新配置,不仅解决了资源冲突问题,还优化了串口的使用效率,体现了注册表在...

    WinCE 之BSP开发

    2. **OEM适配层(OAL)**:OAL位于内核与硬件之间,用于连接内核镜像并支持硬件初始化及相关的管理工作。OAL负责WinCE系统的运行硬件平台初始化、中断服务例程、计时器、实时时钟、内核调试等功能。 3. **设备驱动...

    Win7 64位操作系统无法连接Wince设备驱动程序,提示ActiveSync 引导程序初始化失败

    vs开发工具错误提示:ActiveSync 引导程序初始化失败。请连接/配备一个实际的设备,或者从 http://go.microsoft.com/fwlink?linkid=67763 下载用户级 Windows Mobile Device Center 应用程序 Device Connectivity ...

    嵌入式系统/ARM技术中的基于WinCE 环境的CAN 适配卡驱动程序的设计与实现

    Open模块用于初始化CAN适配卡,设置必要的参数并打开设备;CAN_Close模块负责关闭设备,释放资源;CAN_Read模块处理从CAN总线读取数据的请求;CAN_Write模块则用于向CAN总线发送数据;CAN_IoControl模块处理特定的...

    WinCE6.0 制作中文系统

    ### WinCE6.0制作中文系统的详尽指南 在嵌入式系统开发领域,Windows CE(简称WinCE)因其灵活性和强大的功能而受到广泛青睐。然而,为特定区域定制WinCE系统,尤其是实现中文支持,可能是一项复杂且耗时的任务。...

    WinCE6 X86引导 Loadcepc6.0 和 WinCE操作系统镜像NK.BIN

    `NK.BIN`文件是WinCE的核心组成部分,包含了操作系统内核、设备驱动程序和其他必要的初始化代码。在开发过程中,通过平台构建工具链(如Platform Builder)生成NK.BIN,它是根据设备特定的配置和选择自动生成的。 ...

    液晶屏幕lcd spi 初始化 代码

    液晶屏幕LCD SPI初始化是嵌入式系统中常见的一项任务,特别是在Windows CE(WinCE)操作系统中,用于驱动显示设备。SPI(Serial Peripheral Interface)是一种串行通信协议,它允许单主机与一个或多个设备进行全双工...

    wince开发入门之我所见

    在WinCE中,Bootloader可能包括类似于BIOS的功能,如初始化硬件和设置参数。 - OEM(原始设备制造商):制造并销售带有自己品牌硬件的厂商。 - OAL(OEM Abstraction Layer):OEM抽象层,为BSP提供硬件访问接口,...

    wince系统编程实验(有目录)

    从BIOS或固件引导,到加载内核,再到初始化设备和服务,每个步骤都至关重要。读者将学习到如何调试启动过程,理解启动日志,以及如何处理启动时可能出现的问题。 接着,驱动加载机制是wince系统中的核心部分。书中...

    车机wince进入windows系统

    车机上的Windows CE(Wince)系统是一种精简版的微软操作系统,专为嵌入式设备设计,如车载信息娱乐系统。Wince是"Windows Embedded Compact"的早期版本,主要针对资源有限但需要强大计算能力的设备。在这个场景中,...

    wince显示中文.rar

    wince显示中文 1、将simsun.ttc复制到wince的windows目录。 2、如果系统是wince5.0,则执行font(wince5.0).reg。如是wince6.0,则执行font(wince6.0).reg。 3、重新启动PDA。。。

    进入WINCE操作系统.rar_mcgs wince系统_mcgswince_mcgs安装wince_mcgs系统_mcgs进w

    MCGS TPC嵌入式平台进入Wince底层操作系统,能够进行二次开发。

    进入到WINCE的界面

    启动过程中,硬件初始化,然后加载WinCE的引导加载程序。 2. **加载内核**:引导加载程序负责加载WinCE的内核到内存中。这一步会解析配置文件,选择合适的内核版本,并加载必要的驱动程序。 3. **系统初始化**:...

    WinCE6.0的EBOOT概要

    2. **OEM适配层(OAL)**: 用于初始化和管理硬件资源,它是操作系统内核与硬件之间的接口。 3. **必要的驱动**: 为支持硬件上的外设而必需的软件组件。 #### 三、BOOTLOADER的作用与实现 **BOOTLOADER** 的主要作用...

    wince6系统备份

    备份wince6操作系统,wince5升级及wince6的模拟器加载此系统

    单片机与DSP中的基于WinCE的CAN适配卡驱动程序的设计与实现

     WinCE操作系统支持两种类型的驱动程序:本地驱动程序(Build-In),是把设备驱动程序作为独立任务实现,直接在顶层任务中实现硬件操作,完成特有专用的驱动程序;流接口驱动程序,WinCE的I/O系统将设备程序作为内核...

Global site tag (gtag.js) - Google Analytics