安卓启动流程—bootloder

从上电的那一刻,到正常运行Android系统,这个开机过程,粗略的分为3个阶段

bootloader阶段 –> kernel阶段 –> Android阶段

  1. kernel 可以理解为一个特别的Linux,里面大多流程是通用的,项目结束我们也要完成开源释放
  2. Android 同样是通用的流程,是Google释放,厂商使用,流程上不同平台并无差异

所以我们这里讨论的启动流程,更多的是指bootloader阶段,这个阶段是和平台强相关,强绑定的(平台可以狭义的理解为高通和MTK),可以说是严重依赖硬件实现,

关于bootloader

从冷冰冰的硬件,到运行各种复杂的程序,完成从冷冰冰的硬件到可以抽象为内存,存储,cache,CPU这些计算,存储能力,可以说归功于bootloader,这个过程像极了马克思所说的”一个惊险的跳跃”。大多数基于高通基线不恰当的配置都会导致dump。

作为成熟且商用的平台,肯定不是能用就行。能用就行的主线是资源和能力的获取和加载。而成熟商用这条线,安全就是很好的线索,它对于资源能力的释放和加载并无作用,甚至会让流程看起来复杂而难理解,但正是这条链,贯穿始终。

那么我们就从这两条线索出发去梳理这个过程,更多流程上的介绍,可以从高通createpoint网站获取一手资料

资源的加载,不是一口吃成一个胖子,bootloader的过程,是一个稳扎稳打,由弱变强的励志过程。当然越是靠前的阶段,优先级越高,权限也是越大。最终用户空间,虽说五彩斑斓,但是特权很小。能访问的寄存器也受到了限制

首先我们发现当Power-On的那一刻开始,分成了两条线

  1. TME ROM firmware
  2. Applications PBL (application primary boot loader)

正如我们之前所说,TME正是安全相关,并贯穿始终,这是确保了安全启动,并对后面的镜像作安全校验,这种校验可以形象的看作链,一环扣一环,一旦发现下一个镜像不符合,那么就可以认为作了篡改,并不是应该刷入的镜像,链断掉,也就停止了启动。

UEFI 是紧随其后的一个过程,但是执行等级降为EL1 mode,此时并不能访问所有的寄存器,如果像执行,需要进行一个切换,很多工作都是在UEFI这个阶段完成,可以说是整个boot loader的核心,为HLOS的加载作最后的准备。核心镜像为uefi.elf,xbl_config.elf,abl.elf

HLOS阶段,资源和能力事项充分的释放,大小核加载了起来,各个子系统也加载起来,Modem,VPU,Camera,LPASS,SSC,NPU。

内存,CPU,各个子系统均准备就绪,拥有支持上层操作系统的强大能力,将控制权转交给内核,精巧的内核,现代操作系统的发展,将这些资源抽象,并提供给上层。