我很庆幸在公司的产品开发过程中并没有受到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%PublicCommonOakCspi486BiosloaderBootsector目录下。有一个现成的引导扇区镜像文件,它的路径为%_WINCEROOT%PublicCommonOakCspi486BiosloaderDiskimagesSetupdiskBsect.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都在此修改。
  主代码主要由几个部分组成:镜像下载代码,通过并口或者网卡来实现从远程计算机下载nk.bin;串口调试代码,包含对串口的读写函数,用户调用这些函数就可以通过串口在远程计算机和本地计算机之间通信;写flash代码,包含写镜像到flash的函数;硬件监控代码。
一般的Boot Loader的执行流程见下图:

上图中每个函数的功能如下:

  • StartUp() :CPU最先执行的函数。也就是启动代码。
  • BootLoaderMain() :先后调用KernelRelocate、OEMDebugInit、OEMPlatformInit、OEMPreDownload等函数。此函数源码文件路径为%_WINCEROOT%publiccommonoakdriversethdbglcommon 。
  • OEMDebugInit() :初始化串口。
  • OEMPlatformInit() :执行特定平台的初始化工作,如时钟、一些驱动程序。
  • OEMPreDownload() :做下载前的准备工作。一般用于反馈给用户一些信息。
  • DownloadImage() :下载操作系统镜像到RAM或者Flash。
  • OEMLaunch() :负责启动镜像。
  • OEMReadData() :从远程计算机读取数据。
  • OEMMapMemAddr() :专用于写Flash时使用。因为写flash的速度非常慢,所以此函数将Flash镜像临时缓冲到RAM中。
  • OEMShowProgress() :从函数名就能看出。
  • OEMIsFLashAddr() :判断一个地址是否是Flash的地址。
  • OEMFinishEraseFlash() :判断是否完成了擦除Flash内容工作。
  • OEMWriteFlash() :写镜像到Flash。
  • OEMStartEraseFlash() :开始擦除Flash。
  • OEMContinueEraseFlash() :继续擦除Flash工作。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10294527/viewspace-126716/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10294527/viewspace-126716/

Boot Loader点点滴滴(转)相关推荐

  1. boot loader:Grub

    boot loader是载入内核的重要工具,没有boot loader的话,kernel根本没办法被内核加载的 MBR是整个硬盘的第一个sector内的一个块,大小只有446bytes.但loader ...

  2. 嵌入式系统 Boot Loader 技术内幕-目前看到介绍Boot loader最通俗明了的文章

    1. 引言 在专用的嵌入式板子运行 GNU/Linux 系统已经变得越来越流行.一个嵌入式 Linux 系统从软件的角度看通常可以分为四个层次: 1. 引导加载程序.包括固化在固件(firmware) ...

  3. 什么是Boot Loader

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://yunli.blog.51cto.com/831344/181630 在嵌入式系统 ...

  4. 嵌入式系统 Boot Loader 技术内幕

    转载:http://www.ibm.com/developerworks/cn/linux/l-btloader/index.html 1. 引言 在专用的嵌入式板子运行 GNU/Linux 系统已经 ...

  5. MIT JOS学习笔记01:环境配置、Boot Loader(2016.10.22)

    未经许可谢绝以任何形式对本文内容进行转载! 一.环境配置 关于MIT课程中使用的JOS的配置教程网上已经有很多了,在这里就不做介绍,个人使用的是Ubuntu 16.04 + qemu.另注,本文章中贴 ...

  6. boot loader能全部用C程序编写吗

    在<什么是boot loader>一文中我抛出了一个问题,这个问题如下: 我们说boot loader通常采用汇编和C语言相结合来编写的,那能不能全部用C语言来进行编写呢?为什么? 对于这 ...

  7. Boot loader: Grub入门(转)

    Boot Loader: Grub 在看完了前面的整个启动流程,以及核心模块的整理之后,你应该会发现到一件事情, 那就是『 boot loader 是加载核心的重要工具』啊!没有 boot loade ...

  8. 0.Boot Loader的概念和功能

    转载:http://blog.chinaunix.net/uid-20543672-id-94371.html 1.嵌入式Linux软件结构与分布 在一般情况下嵌入式Linux系统中的软件主要分为以下 ...

  9. Boot Loader的启动流程和开发经验总结

    Windows CE最大程度继承了桌面版Windows的丰富功能,但是Windows CE并不是一个通用的安装版操作系统.在形形色色的嵌入式设备世界里,一款CE系统通常只会针对某一种硬件平台生成.  ...

最新文章

  1. JAVA ee6 result结果集_java对数据库的表插入操作时,显示已生成用于更新的结果集...
  2. 我国法定报告的传染病分为几类?包括哪些传染病?
  3. QT中在label中插入图片自适应label大小等比缩放
  4. 检验是否服从同一分布
  5. 计算机linux入门教程,Turbolinux入门教程1
  6. windows和linux共同分区格式,Linux和Windows共存的模式下分区要小心
  7. ddr读时序波形_测试新体验|如何解决DDR内存系统测试难题?
  8. 知道这些用于数据科学和机器学习的GitHub存储库和Reddit主题吗?
  9. 在虚拟机中安装红旗桌面7.0 Linux操作系统的详细图文教程
  10. AWS和阿里云对比研究二—阿里云
  11. 基于django的视频点播网站开发-step15-项目部署
  12. 数据分析三大神器之一:Numpy
  13. 使用纯JavaScript实现全网页动态樱花飘落特效
  14. lattice planner
  15. Elasticsearch:Standard Text Analyzer - 标准文本分析器
  16. 大一新生HTML期末作业,网页制作作业——明星介绍易烊千玺网站HTML+CSS
  17. Latex 中如何使插图的位置不跑到开头而紧跟插入的文字后
  18. 淘宝店铺如何做好高质量高转化的详情页,制作高详情页的方法
  19. C# 海量数据导出到 Excel
  20. CHIL-SQL-快速参考

热门文章

  1. larval 策略模式
  2. 内涵外延发生巨变的嵌入式技术,未来如何发展?
  3. 文件上传插件 bootstrap-fileinput ,后台使用的C#语言
  4. 2、yum和epel是什么
  5. java中使用Calendar日期类获得下一个月有多少天
  6. 离散时滞系统matlab仿真,离散混沌系统的Matlab仿真
  7. w10更新后怎么找计算机全民,Win10系统下全民WiFi不能用了怎么办
  8. gif原理+gifsicle压缩gif
  9. python 转换数字为中文的大写
  10. 元宇宙之经济(01)理解区块链