为一个新的硬件设备定制WinCE6.0操作系统,一般需要完成以下几个主要步骤:

1.       针对特定的硬件设备创建板级支持包(Board Support Package缩写为BSP),BSP必须包括BOOTLOADER、OEM适配层(OEM Adaptation Layer缩写为OAL)和一些必要的驱动。

2.       利用创建的BSP,定制一个系统设计(OS Design)。即通过VS2005创建一个Platform Builder的工程。该工程可编译产生最终的运行时映像文件(Rum-time Image)。

3.       针对板上的外围设备创建相关驱动,并添加到BSP中。

4.       通过创建子工程和Catalog Items的方式,修改OS Design。

5.       编译OS Design,下载编译得到的运行时映像文件到目标设备。此时,可通过远程调试工具进行调试。

6.       在完成所有的调试工作之后,导出该运行时映像对应的SDK(Software Development Kit),应用程序的开发人员可基于此SDK编写该设备的应用程序。

可以看出,在整个WinCE操作系统的移植过程中,BSP的移植是最基础也是最关键的一步。而创建BSP的过程主要包括以下几个内容:

1.       创建BOOTLOADER。BOOTLOADER在开发的过程中用于下载操作系统映像文件。

2.       创建OAL。OAL最终被链接到内核映像文件,它主要完成硬件的初始化和管理。

3.       创建设备驱动。设备驱动是板上外围设备的软件支持。

4.       修改运行时映像的配置文件。配置文件主要包括BIB、REG等文件。

BOOTLOADER的主要作用是将操作系统运行时映像加载到内存,并跳转到OS的启动程序处。它的这一作用跟前一篇介绍的NBOOT的作用完全一致。BOOTLOADER获取运行时映像(一般对应的文件名为NK)一般有两种方法。它可以通过有线连接的方式象网络(Ethernet)、USB或串口从外部下载NK。它也可以从本地的存储器(Flash、Hard Disk)中加载NK。通常,BOOTLOADER通过Ethernet下载操作系统映像故将其称为EBOOT。在开发的过程中使用EBOOT,可以提高开发效率。通过使用EBOOT,你可以很快速的下载NK到目标设备中。而利用Flash编程工具或者是通过JTAG下载则很慢。在一些产品最终发布时,EBOOT是可以去掉的,但也有一些则必须包括BOOTLOADER,像X86的平台就是如此。

至此,我们已经了解了EBOOT的主要功能,为了实现这些功能,EBOOT必须完成以下工作:

1.       初始化MCU。包括初始化MCU的相关寄存器、中断、看门狗、系统时钟、内存和MMU。前面几项跟NBOOT基本一致,但这里增加了对MMU的初始化。

2.       在完成所有的初始化工作之后,调用BootloaderMain()。这个函数的定义在WinCE6.0中对应的文件是C:"WINCE600"PLATFORM"COMMON"SRC"COMMON"BOOT"BLCOMMON"blcommon.c

3.       BootloaderMain()主要依次调用以下几个函数,OEMDebugInit()、OEMPlatformInit()、OEMPreDownload()、OEMLaunch(),而这些函数必须由EBOOT的代码来实现。

4.       最终跳转到OAL.exe的StartUp处,进而启动WinCE操作系统。

整个流程如下图所示:

EBOOT的代码可参考C:"WINCE600"PLATFORM"DEVICEEMULATOR"SRC"BOOTLOADER"EBOOT目录。这里针对S3C2410的EBOOT做几点说明。前一篇介绍NBOOT加载EBOOT的方法时提到,NBOOT必须将EBOOT放在内存中指定的位置,这个位置是由EBOOT的来决定的。具体的,在EBOOT中的体现是boot.bib里的内存配置,如下图所示。

NBOOT加载EBOOT到内存的地址必须与此地址对应。由于在NBOOT中没有使用MMU,所以NBOOT使用的实际地址应该为0x30021000,否则系统将不能正常启动。第二点,如果没有采用NBOOT加载EBOOT的方法,而是将EBOOT直接存储在NOR Flash中,此时必须在EBOOT的代码中实现自加载的过程,即将NOR Flash中的EBOOT全部加载到RAM中,并执行,实现代码如下:


;------------------------------------------------------------------------------
;   Copy boot loader to memory

ands    r9, pc, #0xFF000000     ; see if we are in flash or in ram
        bne     %f20                    ; go ahead if we are already in ram

; This is the loop that perform copying.
        ldr     r0, = 0x21000           ; offset into the RAM 
        add     r0, r0, #PHYBASE        ; add physical base
        mov     r1, r0                  ; (r1) copy destination
        ldr     r2, =0x0                ; (r2) flash started at physical address 0
        ldr     r3, =0x10000            ; counter (0x40000/4)
10      ldr     r4, [r2], #4
        str     r4, [r1], #4
        subs    r3, r3, #1
        bne     %b10

; Restart from the RAM position after copying.
        mov pc, r0
        nop
        nop
        nop

; Shouldn't get here.
        b       .

EBOOT在实现必备功能的前提下,我们还可以扩展其功能,譬如说初始化LCD,并显示特定的启动画面,显示加载映像的进度等。
本文粗略的介绍了WinCE6.0下EBOOT的内容,但没有涉及具体的代码实现,相关代码可以参考目录C:"WINCE600"PLATFORM"DEVICEEMULATOR"SRC"BOOTLOADER"EBOOT。总的来说,EBOOT的核心功能就是引导操作系统映像。

WinCE6.0的EBOOT概要相关推荐

  1. WinCE6.0 修改开机Logo方法集锦(二)

       中秋假期已过,回来继续该博文主题.今天讲解第二种方法,将Logo图片的数据写入到Nand Flash中,在启动初始化LCD的时候,从固定的地址将数据读出并填充到显示缓存中.<?xml:na ...

  2. 基于WINCE6.0下载multiple XIP镜像文件

    ********************************LoongEmbedded******************************** 作者:LoongEmbedded(kandi ...

  3. WINCE6.0 chain.bin和xipkernel.bin解析

    ********************************LoongEmbedded******************************** 作者:LoongEmbedded(kandi ...

  4. WINCE6.0文件系统及存储管理器

    *******************************LoongEmbedded******************************** 作者:LoongEmbedded 时间:201 ...

  5. WINCE6.0+S3C2443的启动过程---内核启动

    ********************************LoongEmbedded******************************** 作者:LoongEmbedded(kandi ...

  6. WINCE6.0 + S3C2443的启动过程---nboot篇

    WINCE6.0 + S3C2443的启动过程---nboot篇 我们启动WINCE6.0的方式是:nboot+eboot+NK.那么是如何启动WINCE6.0系统映像的呢?首先是nboot把eboo ...

  7. WINCE6.0+S3C2443的启动过程---eboot1

    WINCE6.0+S3C2443的启动过程---eboot 我们知道从nboot把eboot从nandflash中拷贝到内存指定的地址后,就接着在这个地址处开始运行eboot了,之后,nboot的工作 ...

  8. WINCE6.0+S3C2443的RTC初始化及存在的问题

    1.系统启动过程中RTC初始化 在WINCE6.0中,我们知道是通过OALIoCtlHalInitRTC()函数来设置RTC的时间的,但是如何调用到这个函数的呢?我们就从NKStartup()函数开始 ...

  9. WinCE6.0 修改开机Logo方法

    中秋假期已过,回来继续该博文主题.今天讲解第二种方法,将 Logo 图片的数据写入到 Nand Flash 中,在启动初始化 LCD 的时候,从固定的地址将数据读出并填充到显示缓存中.       实 ...

最新文章

  1. Cisco ××× 完全配置指南-连载-PIX和ASA连接的故障诊断与排除
  2. Java中关于==和equal的区别 以及equals()方法重写
  3. 使用Mybatis的Generator可能导致的一个错误
  4. 面试官系统精讲Java源码及大厂真题 - 04 Arrays、Collections、Objects 常用方法源码解析
  5. php的header()函数前有echo输出情况分析
  6. 三、synchronized同步锁
  7. 结对编程之求首尾相连数组中最大子数组的和
  8. angular自带的一些api_在Angular软件中执行API请求的正确方式,了解一下
  9. HTML,CSS,font-family:中文字体的英文名称 (宋体 微软雅黑)
  10. OPPOA83_OPPOA83T_官方线刷包_救砖包_解账户锁
  11. ABBYY FineReader15最新免费下载安装地址激活2020注册机教程
  12. 晶体三极管共射放大电路(共射基本放大电路)的研究与设计
  13. 计算机桌面文字重影,电脑桌面图标有重影是什么问题?
  14. 前有标兵,后有追兵,自热老兵莫小仙胜算还剩几成?
  15. 寒假集训难题(四)QWQ和神奇的传送器nefu1608
  16. 村路安防工程建设展开 未来投入将进一步加大
  17. nagios之nsca被动监控
  18. python十字坐标轴绘制_matplotlib画十字坐标图
  19. arcgis安装后重启提示 flexnet vendor daemon 交互式服务检测
  20. c fread 快读 详解_万事开头难,手把手教你搭建Appium自动化测试环境,实践案例详解...

热门文章

  1. 1025 反转链表 (25分)
  2. x86从实模式到保护模式实验说明
  3. C语言基础之数据结构
  4. (JAVA)Integer类之基本数据类型之间的转换
  5. 潭州课堂25班:Ph201805201 爬虫基础 第九课 图像处理- PIL (课堂笔记)
  6. [NOI2014] 起床困难综合症
  7. PCL—关键点检测(rangeImage)低层次点云处理
  8. 《JavaWeb从入门到改行》注册时向指定邮箱发送邮件激活
  9. 刷题向》一道逆向思维题(BZOJ1046)(NORMAL)
  10. [密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第37篇]The Number Field Sieve