WinCE开发中Boot Loader点点滴滴

我很庆幸在公司的产品开发过程中并没有受到Boot Loader带来的阻力,因为我们采用MSDOS+Loadcepc来启动CE操作系统。显然这样的幸运不是永远的,所以对Boot Loader应该有足够的研究和了解,做到未雨绸缪。

Boot Loader是定制Windows CE操作系统过程中一个重要的开发环节。Boot Loader的作用正如名字中的两个单词:Boot,既引导系统,如果基于CE的产品采用BIOS实现硬件初始化和配置,那么Boot Loader只需引导软件系统。如果没有采用BIOS,那么Boot Loader的作用还包括实现BIOS的基本功能;Loader,既加载操作系统,在整个系统正常启动后Boot Loader通过不同的方式加载CE的内核文件nk.bin。当Boot Loader把nk.bin解压到RAM后就把CPU控制权交给CE内核。x86平台的Boot Loader种类最多,下面就对x86平台的Boot Loader做一说明:

x86 ROM Boot Loader

又叫Rom Boot,记得以前写过的文章中提到了Rom Boot。Rom Boot 被设计存放在Flash/EEPROM中,也就是原来BIOS的位置,这样当上电后CPU到固定地址执行代码,也就是执行了Rom Boot包含的代码,它对整个硬件系统进行初始化和检测,并且支持通过网卡从远程机器上下载nk.bin或者从本地IDE/ATA 硬盘的活动分区中寻找nk.bin文件加载。Rom Boot的优点就是引导并且加载速度快,而且它自身完成了所有的操作,这样就不用BIOS、MSDOS,更不用Loadcepc了。缺点就是需要CE开发者读懂它的源码并修改。CE提供了Rom Boot的所有源码,读者可以查找标题为"x86 Source Organization"的帮助文档,在这个文档中列举了所有相关的目录及内容,另外还列举了四种网卡的驱动程序源码所在目录。

x86 BIOS Boot Loader

BIOS Boot Loader和MSDOS+Loadcepc两种方式差不多,BIOS Boot Loader只是不需要MSDOS操作系统,它仍然需要BIOS和FAT文件系统。下面讲一下采用BIOS Boot Loader的系统的引导顺序:系统上电后BIOS执行完硬件初始化和配置后,BIOS检查引导设备的启动顺序,如果引导设备是硬盘、CF卡、DOC(Disk-On-Chip)一类的存储设备,那么就加载这些存储器上的主引导扇区(Master Boot Sector)中的实模式代码到内存,然后执行这些代码。这里提到的代码被称为主引导记录(MBR)。MBR首先在分区表(同样位于主引导扇区)中寻找活动分区,如果存在活动分区,那么加载位于这个活动分区的第一个扇区上的代码到内存,然后执行这些代码。这里提到的活动分区的第一个扇区被称为引导扇区(Boot Sector)。引导扇区上的代码的功能是找到并且加载BIOS Boot Loader,BIOS Boot Loader再加载nk.bin。引导扇区的源码位于%_WINCEROOT%\Public\Common\Oak\Csp\i486\Biosloader\Bootsector目录下。有一个现成的引导扇区镜像文件,它的路径为%_WINCEROOT%\Public\Common\Oak\Csp\i486\Biosloader\Diskimages\Setupdisk\Bsect.img 。而对于BIOS Boot Loader,CE提供了Setupdisk.144和Bootdisk.144两个文件,以“.144”为扩展名的文件的解压我在前面的文章中讲过了。这两个文件解开后都包含了引导扇区和Boot Loader的镜像文件。执行“mkdisk C:”批处理命令将这两个镜像文件写到磁盘上。mkdisk会设置Boot Loader的隐藏属性,这样在列出根目录下所有文件时不会显示Boot Loader的文件。

MSDOS+Loadcepc

这种方式非常简单,在MSDOS启动后再执行loadcepc.exe,让loadcepc加载nk.bin到内存后再把CPU控制权交给CE内核程序。loadcepc在前面的文章中已经讲过了。

下面根据一般的Boot Loader源码来分析一下Boot Loader的组成:

Boot Loader由两部分组成:OEM启动代码(OEM startup code)和主代码(main code)。OEM启动代码是最先执行的部分,它的功能是初始化内存寄存器、设置CPU频率、初始化高速缓存等。之后它跳转到主代码中执行。一般OEM启动代码都是用汇编编写。主代码一般用C语言编写,它负责其它所有任务,在执行的同时还能够将执行的相关信息显示在屏幕上。一般添加公司LOGO或者其它启动LOGO都在此修改。

时间: 2024-09-13 19:49:22

WinCE开发中Boot Loader点点滴滴的相关文章

WinCE开发中Boot Loader的点点滴滴

我很庆幸在公司的产品开发过程中并没有受到Boot Loader带来的阻力,因为我们采用MSDOS+Loadcepc来启动CE操作系统.显然这样的幸运不是永远的,所以对Boot Loader应该有足够的研究和了解,做到未雨绸缪. Boot Loader是定制Windows CE操作系统过程中一个重要的开发环节.Boot Loader的作用正如名字中的两个单词:Boot,既引导系统,如果基于CE的产品采用BIOS实现硬件初始化和配置,那么Boot Loader只需引导软件系统.如果没有采用BIOS,

WinCe开发专题

Windows CE下驱动开发基础 模拟器和远程调试工具(二) 模拟器和远程调试工具(一) 配置Windows CE下浏览器 在基于CE的产品上使用手机模块 解析Windows CE下浏览器源码 让自己编写的DLL加载到Slot1 WinCE应用程序开机自动运行的又一种方法 加密Windows CE系统 WinCE开发中Boot Loader点点滴滴 OAL点点滴滴(二) OAL点点滴滴(一) Windows CE下中文输入法编辑器 WinCE Eboot中的网络函数 WinCE Eboot中的

WinCE EBOOT中的Boot Args与Driver Globals

在EBOOT中包含的一个重要的缓冲区叫Driver Globals,它用于在设备驱动和WinCE OS之间共享数据.而在EBOOT中会用到的启动参数结构被称为Boot Args,是指用于EBOOT和WinCE OS之间共享一些参数信息.一般来说Boot Args会在EBOOT运行的时候被赋值或者更新,最常用的就是网络设备的相关信息设置,比如IP地址,MAC地址,中断等信息. Driver Globals包含了Boot Args,也就是说Driver Globals是一块内存缓冲区,其中里面也包含

WinCE Eboot中的BLCOMMON

在EBOOT中,从Startup.s跳转到C程序入口以后,程序就可以用C语言来编写了,这样感觉就好多了.一般C语言的入口就是一个Main函数,也可能叫其他的名字.在这个Main函数中会掉用BootloaderMain函数,该函数在BLCOMMON模块中被定义的.一般Main函数的写法如下: void (void) { // Common boot loader (blcommon) main routine. BootloaderMain(); // Should never get here.

备份恢复升级netscreen SSG140 Boot Loader及ISO

步骤要领: .备份恢复配置文件及ISO .升级新版本的boot loader及ISO 备份恢复配置文件及ISO 由于备份恢复这块,网上转载一篇特别详细给大家备用,此处我就不废话 为防止Juniper防火墙设备故障情况下造成网络中断,保障用户业务不间断运行,现针对Juniper防火墙故障情况下的快速恢复做具体描述. 一.设备重启动: Juniper防火墙在工作期间出现运行异常时,如需进行系统复位,可通过console线缆使用reset命令对防火墙进行重启,重启动期间可以在操作终端上查看防火墙相关启

WinCE Eboot中的OEM控制函数

在EBOOT中有很多以OEM开头的函数,这些函数都会直接或间接的被BLCOMMON模块调用,来完成相应的功能.这些OEM函数就是我们需要根据自己的平台来实现的.可以说,实现了这些OEM函数,EBOOT的功能就完成了. 在EBOOT中有很多OEM函数,有些是必须实现的,有些是不必实现的,而有些是根据你的EBOOT的功能需求来决定是否要实现的.下面会介绍一下直接由BLCOMMON调用的OEM控制函数: 1. void OEMDebugInit(void) 这应该是第一个被调用的OEM函数,用来初始化

Android开发中Eclipse报错及对应处理方法总结_Android

本文较为详细的总结了Android开发中Eclipse报错及对应处理方法.分享给大家供大家参考,具体如下: 报错1: Conversion to Dalvik format failed with error 1 报错原因:原因是我在android工程中不小心多导入Java的mina,结果一跑程序就报这个错误. 解决方法:将Java中用到的mina包移除,就OK了. 小结:以后遇到这种报错时,记得提醒自己可能是由于自己导错包了. 附: 网上其他处理方法:<丢失Android系统库或者Conver

【详解】嵌入式开发中固件的烧录方式

版本:v1.2   Crifan Li 摘要 本文主要介绍了嵌入式开发过程中,将固件从PC端下载到开发板中的各种方式,主要包括NFS挂载,Nand Flash和Nor Flash,USB,RS232,网卡NIC等方式. 本文提供多种格式供: 在线阅读 HTML HTMLs PDF CHM TXT RTF WEBHELP 下载(7zip压缩包) HTML HTMLs PDF CHM TXT RTF WEBHELP HTML版本的在线地址为: http://www.crifan.com/files/

javaweb-web开发中遇到java.lang.ClassFormatError应该怎么解决?谢谢各位大牛:)?

问题描述 web开发中遇到java.lang.ClassFormatError应该怎么解决?谢谢各位大牛:)? 我做的项目,有好多个java文件,根据错误提示,应该怎么解决!谢谢各位大牛! MyEclipse8.5中控制台信息如下: 2015-5-6 8:31:03 org.apache.catalina.core.AprLifecycleListener init 信息: Loaded APR based Apache Tomcat Native library 1.1.32 using AP