引 言
Windows CE是微软针对嵌入式领域推出的一款全新的操作系统。之所以说它是一款全新的操作系统,是因为尽管Windows CE的UI非常接近其它的桌面版Windows操作系统,但是它的内核完全是重新写的,并不是任何一款桌面版Windows的精简版本。 Windows CE是一种支持多种CPU架构的操作系统,这其中包括ARM、x86、MIPS和SHx,极大地减轻了0EM开发过程中移植操作系统的工作量。
操作系统移植包含两个层面上的工作:一个层面是CPU级的,另一个层面是板级的。CPU级的移植通常由微软或芯片制造商来完成;板级移植则是由OEM来完成的。0AL正是0EM完成这一系统移植的工作核心!
1 OAL
OAL的全称是OEM Adaption Layer,即原始设备制造商适配层。从逻辑结构上看,它位于操作系统的内核与硬件之间,是连接系统与硬件的枢纽;从功能上看,OAL颇似桌面机上的BIOS,具有初始化设备、引导操作系统以及抽象硬件功能等作用。与B10S不同的是,0AL隶属于操作系统,是操作系统的一部分。从存在方式上,讲OAL是一组函数的集合体,这些函数体现出0AL的功能,如图1所示。
2 最小化的OAL
首先来看一下OS的启动顺序。
①CPU执行引导向量,跳转到硬件初始化代码,即Startup函数;
②在start up函数完成最小硬件环境初始化后跳转到KernelStart函数(当CPU为x86架构时为Kernel Initial-ize函数),来对内核进行初始化;
③Kernelstart函数调用OEMInitDebugSerial完成对调试串口的初始化,调用0EMInit函数来完成硬件初始化工作以及设置时钟、中断,调用OEMGetExtensionDRAM函数来判断是否还有另外一块DRAM。
至此,内核加载完毕。由此可见,OS启动的重中之重是Startup函数的正确加载。
2.1 Startup
Startup阶段的特点是Kernel还没有加载起来,调试工作比较困难。StartuP函数的两大核心任务分别是把CPU初始化到一已知状态和调用内核初始化函数来初始化内核。以下是Startup函数中通常包含的内容:①把处理器置为监控模式;②禁止CPU的IRQ和FIQ输入:③禁止内存管理单元MMU和指令、数据Cache; ④刷新指令和数据Cache、TLB、清空写buffr; ⑤确定启动的原因一hard reset,wake from sleep, GPIO reset,Watchdog reset,eboot handoff; ⑥根据目标板需要配置GPIO,比如连接LED的GPIO; ⑦配置内存管理器,设置刷新频率,使能时钟; ⑧配置中断控制器;⑨初始化实时时钟(RTC)为0,使能实时时钟:⑩设置电源管理寄存器;⑾打开所有板级时钟和片内外部时钟;⑿取得OEMAddressTable的物理基地
①创建中断标识符。下面代码节选自SAMSUNG2410的oalintr.h。中断映射表通常位于
② 创建并注册ISR。ISR的主要任务是返回中断标识符。ISR代码通常位于
在中断处理中,还有三个函数也起着至关重要的作用。它是OEMInterruptEnable()、OEMInterruptDisable()和OEMInterruptDone()。
◇OEMInterruptEnable()用于执行允许设备产生中断的硬件操作;
◇OEMInterruptDisable()禁止设备发出中断申请;
◇OEMInterruptDone()中断处理结束。
3.2 以太网口调试函数
以太网口调试函数与串口调试函数相比,具有更快的速度。
◇OEMEthInit 初始化以太网调试口;
◇OEMEthEnableInts开以太网适配器中断;
◇OEMEthDisableInts关以太网适配器中断;
◇OEMEthISR 以太网适配器中断服务例程;
◇OEMEthGetFrame从以太网调试口收数据;
◇OEMEthSendFrame从以太网调试口发数据;
◇OEMEthQueryClientlnfo获取平台相关信息;
◇OEMEthGetSecs 返回从某一特定时间开始的计时值。本函数用于处理超时。
3.3 KITL
KITL全称为Kernel Independent TransportLayer。它的主要用途是提供更方便的调试手段,如图4所示。KITL出现在Windows CE.net之后,把软件传输协议与硬件传输层隔离开。KITL使得开发者不必了解硬件传输层如何与软件协议层接口。
以下是应该在OEMInit函数中加入的KITL初始化代码。
①初始化所有PCI桥和设备,枚举它们并且给它们分配资源,然后使能,使他们能正常工作。注:此条适于有KITL网络接口卡(NIC)和NIC桥的情况。
② 对相关总线进行初始化,使得CPU能够正确识别NIC。
③通过调用KitlInit函数来初始化KITL。这部分代码可参照其它平台,代码文件为Halkitl.c。
④执行0EMKitlInit函数,进行相关的硬件初始化工作。搜索是否存在KITL 网口、串口或并口连接。
⑤执行完OEMKitlInit后,把Kitl.1ib和Kitleth.1ib包含入平台资源文件\
3.4 OEMIOControl
OEMIOContr01在OAL层是一个非常重要的函数,应用程序是通过调用KernelIoContrOI来调用OEMl0Control的。内核对许多硬件平台信息的获得都要通过对它的调用来实现。此外,0EMl0Contr0I还是用户模式应用代码到内核模式OAL代码之间的转换入口。这就是说,用在用户模式下通过调用0EMl0Control可以获得内核模式的权力。0EMIOControl函数原型如下:
硬件资源利用和调试手段的加强大大丰富了OAL的功能,但是嵌入式系统通常会面临的功耗问题和由于网络功能的日益普及而带来的安全性问题并没有涉及到。
4 完整OAL
完整OAL是指在加强OAL的基础上扩充了功耗和安全性验证的OAL。所以这一阶段的主要工作集中在电源管理与模块认证两部分。
4.1 电源管理
OAL层的电源管理与驱动程序的电源管理颇为不同。一种设备驱动程序仅负责某种特定的设备,如果可能,则把这种设备置为省电模式,当形势需要时再把设备置为满载荷模式。OAL层的电源管理则是负责整个系