Bootloader

在嵌入式操作系统中,BootLoader是在操作系统内核运行之前运行。可以初始化硬件设备、建立内存空间映射图,从而将系统的软硬件环境带到一个合适状态,以便为最终调用操作系统内核准备好正确的环境。在嵌入式系统中,通常并没有像BIOS那样的固件程序(注,有的嵌入式CPU也会内嵌一段短小的启动程序),因此整个系统的加载启动任务就完全由BootLoader来完成。在一个基于ARM7TDMI core的嵌入式系统中,系统在上电或复位时通常都从地址0x00000000处开始执行,而在这个地址处安排的通常就是系统的BootLoader程序。

 

在专用的嵌入式板子运行GNU/Linux系统已经变得越来越流行。一个嵌入式Linux系统从软件的角度看通常可以分为四个层次:
1、 引导加载程序。包括固化在固件(firmware)中的boot代码(可选),和BootLoader两大部分。
2、 Linux内核。特定于嵌入式板子的定制内核以及内核的启动参数。
3、 文件系统。包括根文件系统和建立于Flash内存设备之上文件系统。通常用ramdisk来作为rootfs。
4、 用户应用程序。特定于用户的应用程序。有时在用户应用程序内核层之间可能还会包括一个嵌入式图形用户界面。常用的嵌入式GUI有:MicroWindows和MiniGUI等。
引导加载程序是系统加电后运行的第一段软件代码。PC机中的引导加载程序由BIOS(其本质就是一段固件程序)和位于硬盘MBR中的OS BootLoader(比如,LILOGRUB等)一起组成。BIOS在完成硬件检测和资源分配后,将硬盘MBR中的BootLoader读到系统的RAM中,然后将控制权交给OS BootLoader。BootLoader的主要运行任务就是将内核映象从硬盘上读到 RAM 中,然后跳转到内核的入口点去运行,也即开始启动操作系统
通常,BootLoader是严重地依赖于硬件而实现的,特别是在嵌入式世界。因此,在嵌入式世界里建立一个通用的BootLoader几乎是不可能的。尽管如此,我们仍然可以对BootLoader归纳出一些通用的概念来,以指导用户特定的BootLoader设计与实现。
 

一.bootloader的作用

       其实bootloader主要的必须的作用只有一个:就是把操作系统映像文件拷贝到RAM中去,然后跳转到它的入口处去执行。而操作系统文件的来源,可以是flash,sd card,PC(可以通过网络,USB,甚至串口传输)等等,所谓的EBOOT,UBOOT,其实就是表明了系统文件是通过Ethernet或者USB从PC传输过去的。当然,为了实现这个功能(以及其它附加功能),我们必须对硬件做一些必要的初始化,这个也是必须的(废话!)。除了这个必须的,现在的bootloader还常常会加入以下功能:

      1.将操作系统映像文件写入FLASH/硬盘等:读取过来的操作系统文件,除了可以拷贝到RAM中直接运行,还可以烧录到FLASH,或者写入硬盘永久保存,这样下次就可以直接从本机来读取操作系统映像。

     2.硬件诊断:如同PC的BIOS一样,检测硬件是否正常功能。

     3.显示一个LOGO,因为拷贝操作系统文件和启动操作系统需要时间,所以产品化的设备,一般需要在这段时间显示一个LOGO。

 

    二.bootloader是不是必须的

      bootloader并不是必须的,如果我们的硬件有足够大的norflash,并且实现了XIP技术,那么WinCE 操作系统可以直接在norflash里面运行起来,不需要将它复制到RAM中去,所以bootloader就失去了作用。

       但是考虑到成本因素,现在的硬件一般都不会配置这么大的norflash,image文件都存储在nand flash里面,所以都会用到bootloader。

 

    三.关于nboot和eboot

    国内很多人做WinCE都是使用Samsung的2410或者2440入门的,所以对nboot和eboot是最熟悉的。eboot是微软在WinCE里面提供的开放源代码的一个bootloader的框架,因为它默认的是使用ethernet从PC下载image而得名,使用该框架,根据自己的硬件做一些修改就可以直接拿来用了,那么nboot又是怎么回事呢?

    之所以需要nboot(注:三星的后续产品中,nboot已经改名为stepldr,ldr是looder的缩写,step是stepstone的意思,这是三星系列CPU为解决nand启动而内置的一小块RAM),是和硬件紧密相关的。我们在设计硬件的时候,ROM部分可以只使用norflash,也可以使用1片小容量的norflash+大容量的nandflash,还可以只使用nandflash。第一种方案,可以不用bootloader,也可以只使用eboot;第二种方案,把eboot放到norflash中,image放在nandflash中,并将硬件设置为norflash启动模式,也不用nboot。只有第3种方案,才需要使用nboot,这是为什么呢?

     我们知道nandflash本身不能运行程序,它里面的内容必须拷贝到RAM中才能运行,但是CPU上电后,RAM中是空的,谁来执行这个拷贝的工作呢?三星的解决方案,就是内置了一小块RAM(stepstone),然后从硬件上实现CPU上电后先读取nand flash最开始的一段代码到stepstone中去(当然,要设置硬件为nandflash启动方式),然后从stepstone起始处(被设置为RAM的0地址)去执行。这个stepstone一般很小(2410,2440是4K),所以它没办法放下一个功能复杂的bootloader(比如eboot),只能放一个功能很简单的,这就是需要nboot的原因了。nboot的功能十分单一,就是从nandflash复制image到RAM中去,然后跳转执行。这里的image可以是eboot的(一般开发阶段这样做),也可以是OS的。

     优龙的开发板提供了一种叫做BIOS的bootloader,它远远超出了4K的限制,但是还可以在nandflash启动方式下正常运行,这是为什么呢?原来,它实现了2次加载,也就是说CPU上电后自动加载了4K代码,这4K代码又将整个bootloader重新拷贝到RAM中再执行,要实现这样的功能要对链接器做一些设置,使“拷贝”功能的代码必须放到前4K里面去。

 

   总之,bootloader是需要直接和硬件打交道,不同的硬件设计,就会影响到它的实现,所以了解硬件的设计是理解bootloaer的第一步。

posted @ 2013-02-18 16:22  邓维  阅读(646)  评论(0编辑  收藏  举报