此帖出自嵌入式系统论坛
最新回复
找一个文章你看一下:Bootloader的概念就是一个用于引导的loader,在系统上电的时候最先被运行,然后对硬件平台做最基本的初始化,最后把操作系统加载起来。不同的嵌入式操作系统都有自己的Bootloader,但是本质功能都是一样的。 在WinCE中用的最多的就是EBOOT,是一个基于网络的Bootloader,而且可以根据需要带有命令行菜单功能,网络调试功能以及文件系统的相关功能。在这里我只谈ARM平台的引导。一般基于不同的硬件设计,会有不同的引导方式: NORFlash Boot: 一般ARM处理器的片选0都会接有NORFlash,这样在ARM上电以后,会从0地址开始执行程序,也就是从NORFlash的0地址开始执行。所以把EBOOT烧到NORFlash的0地址开始的地方,这样在上电以后,EBOOT开始执行,可以在NORFlash里面执行,也可以自拷贝到SDRAM中执行。最后加载WinCE image并运行。 NANDFlash Boot with EBOOT: 由于NORFlash容量小,价格贵,现在很多ARM处理器支持NandFlash引导。不同厂家的处理器对Nandflash的引导略有区别,具体要看datasheet。但是本质就是先从Nandflash中读出一个小的Loader来运行,这个Loader再从Nandflash中加载EBOOT到SDRAM中运行,最后EBOOT加载WinCE image,就是NK.bin。 NANDFlash Boot without EBOOT: 如果在NandFlash引导的时候不需要EBOOT,也可以不用EBOOT。这样就是系统启动后从Nandflash中加载一个小的Loader,小的Loader对硬件系统作基本的初始化,然后直接加载WinCE image,一般应该是NK.nb0,然后运行。 这里来说一下NK.bin与NK.nb0,两个不同的WinCE image。 NK.nb0:就是一个可以直接运行的WinCE映像文件,直接拷贝到SDRAM中就可以运行。 NK.bin:被称为Windows CE binary image data format文件格式,是一种包含了多个独立纪录(Section)的二进制文件。在加载的时候,需要分别加载,不同的Section加载到不同的地方。所以NK.bin需要Bootloader进行解释性加载。但是他的Size会比NK.nb0小。可以使用viewbin命令查询NK.bin中的纪录信息。 viewbin –rec nk.bin 前面已经讲过了一般系统会使用到的引导方式,下面介绍一下EBOOT。在WinCE中EBOOT一个作用可以加载WinCE image,还可以通过网络配合Platform Builder下载WinCE image进行调试。在开发一个新的BSP的时候,首先会基于一个相似的平台的BSP进行克隆,然后要做的就是要开发和调试EBOOT了,EBOOT的架构如图: BLCOMMON:相当于EBOOT的一个基本框架,主要完成bootloader相关内存的分配,解析NK.bin文件并进行效验,初始化平台,通过网络下载image等功能。 OEM Code:主要是基于硬件平台,为BLCOMMON提供相应的接口函数,帮助完成相应的功能。 Eboot:一个小的网络协议栈,为网络下载image提供DHCP,TFTP,UDP等网络服务功能。 Network Driver:硬件平台的网络驱动部分,支持上层的网络功能。 Bootpart:为Flash设备提供分区功能,bootloader可以创建一个BinFS分区和一个文件系统分区。还可以用它来创建一个引导分区用来存放引导参数。 Flash Memory:硬件平台的Flash驱动。下面根据一般的Boot Loader源码来分析一下Boot Loader的组成: Boot Loader由两部分组成:OEM启动代码(OEM startup code)和主代码(main code)。OEM启动代码是最先执行的部分,它的功能是初始化内存寄存器、设置CPU频率、初始化高速缓存等。之后它跳转到主代码中执行。一般OEM启动代码都是用汇编编写。主代码一般用C语言编写,它负责其它所有任务,在执行的同时还能够将执行的相关信息显示在屏幕上。一般添加公司LOGO或者其它启动LOGO都在此修改。 主代码主要由几个部分组成:镜像下载代码,通过并口或者网卡来实现从远程计算机下载nk.bin;串口调试代码,包含对串口的读写函数,用户调用这些函数就可以通过串口在远程计算机和本地计算机之间通信;写flash代码,包含写镜像到flash的函数;硬件监控代码。 一般的Boot Loader的执行流程见下图: [attach]67886[/attach] 上图中每个函数的功能如下: StartUp() :CPU最先执行的函数。也就是启动代码。 BootLoaderMain() :先后调用KernelRelocate、OEMDebugInit、OEMPlatformInit、OEMPreDownload等函数。此函数源码文件路径为%_WINCEROOT%publiccommonoakdriversethdbgblcommon 。 OEMDebugInit() :初始化串口。 OEMPlatformInit() :执行特定平台的初始化工作,如时钟、一些驱动程序。 OEMPreDownload() :做下载前的准备工作。一般用于反馈给用户一些信息。 DownloadImage() :下载操作系统镜像到RAM或者Flash。 OEMLaunch() :负责启动镜像。 OEMReadData() :从远程计算机读取数据。 OEMMapMemAddr() :专用于写Flash时使用。因为写flash的速度非常慢,所以此函数将Flash镜像临时缓冲到RAM中。 OEMShowProgress() :从函数名就能看出。 OEMIsFLashAddr() :判断一个地址是否是Flash的地址。 OEMFinishEraseFlash() :判断是否完成了擦除Flash内容工作。 OEMWriteFlash() :写镜像到Flash。 OEMStartEraseFlash() :开始擦除Flash。 OEMContinueEraseFlash() :继续擦除Flash工作。
详情
回复
发表于 2011-7-26 12:14
| ||
|
||
| |
个人签名处处留心皆学问!
|
|
| |
|
|
此帖出自嵌入式系统论坛
| ||
个人签名处处留心皆学问!
|
||
曾经的版主且威望大于2000,或对EEWORLD论坛有突出贡献的坛友
EEWorld Datasheet 技术支持