对于Android整个启动过程来说,基本可以划分成三个阶段:Bootloader引导、Linux kernel启动、Android启动。下面分别对每个阶段一一展开讨论。
第一部分:Bootloader启动
一、 Bootloader的定义和种类
简单地说,BootLoader是在操作系统运行之前运行的一段程序,它可以将系统的软硬件
环境带到一个合适状态,为运行操作系统做好准备。这样描述是比较抽象的,但是它的任务确实不多,终极目标就是把OS拉起来运行。
在嵌入式系统世界里存在各种各样的Bootloader,种类划分也有多种方式。除了按照处
理器体系结构不同划分以外,还有功能复杂程度的不同。
先区分一下Bootloader和Monitor[l1] : 严格来说,Bootloader只是引导OS运行起来的代
码;而Monitor另外还提供了很多的命令行接口,可以进行调试、读写内存、烧写Flash、配置环境变量等。在开发过程中Monitor提供了很好地调试功能,不过在开发结束之后,可以完全将其设置成一个Bootloader。所以习惯上将其叫做Bootloader。
Bootloader | Monitor? | 描述 | X86 | ARM | PowerPC |
U-boot | 是 | 通用引导程序 | 是 | 是 | 是 |
是 | 基于eCos的引导程序 | 是 | 是 | 是 | |
否 | (StrongARM构架)LART(主板)等硬件平台的引导程序 | 否 | 是 | 否 | |
LILO | 否 | Linux磁盘引导程序 | 是 | 否 | 否 |
GRUB | 否 | GNU的LILO替代程序 | 是 | 否 | 否 |
Loadlin | 否 | 从DOS引导Linux | 是 | 否 | 否 |
Vivi | 是 | 韩国mizi 公司开发的bootloader | 否 | 是 | 否 |
更多bootloader还有:ROLO、Etherboot、ARMboot 、LinuxBIOS等。
对于每种体系结构,都有一系列开放源码Bootloader可以选用:
X86:X86的工作站和服务器上一般使用LILO和GRUB。
ARM:最早有为ARM720处理器开发板所做的固件,又有了armboot,StrongARM平
台的blob,还有S3C2410处理器开发板上的vivi等。现在armboot已经并入了U-Boot,所以U-Boot也支持ARM/XSCALE平台。U-Boot已经成为ARM平台事实上的标准Bootloader。
PowerPC:最早使用于ppcboot,不过现在大多数直接使用U-boot。
MIPS:最早都是MIPS开发商自己写的bootloader,不过现在U-boot也支持MIPS架构。
M68K:Redboot能够支持m68k系列的系统。
二、 Arm特定平台的bootloader
到目前为止,我们公司已经做过多个Arm平台的android方案,包括:marvell(pxa935)、
informax(im9815)、mediatek(mt6516/6517)、broadcom(bcm2157)。由于不同处理器芯片厂商对arm core的封装差异比较大,所以不同的arm处理器,对于上电引导都是由特定处理器芯片厂商自己开发的程序,这个上电引导程序通常比较简单,会初始化硬件,提供下载模式等,然后才会加载通常的bootloader。
下面是几个arm平台的bootloader方案:
marvell(pxa935) : bootROM + OBM [l4] + BLOB
informax(im9815) : bootROM + barbox + U-boot
mediatek(mt6516/6517) : bootROM + pre-loader[l5] + U-boot
broadcom(bcm2157) : bootROM + boot1/boot2 + U-boot