一、什么是BootLoader
BootLoader代码是芯片复位后,进入操作系统之前执行的一段代码。主要用于完成由硬件启动到操作系统启动的过渡,从而为操作系统提供基本的运行环境。
BootLoder主要的启动流程可以概括为:PBL阶段、SBL阶段、LK阶段。之后会加载并启动kernel。
二、名词解释
5个处理器:
- APPS :Cortex A53 core(MSM8953),运行android。
- RPM(Resource Power Manager):CortexM3 core,主要用于低功耗应用。
- Modem(MSS_QDSP6) :高通自有指令集处理器,处理3G、4G通信协议等。
- Pronto(WCNSS): 处理wifi相关代码。
- LPASS :音频相关。
启动相关:
- PBL(Primary Boot Loader):位于芯片内ROM中,是芯片上电后执行的真正第一行代码,在正常启动流程中会加载SBL1。如果启动异常会虚拟出9008端口可用于 Emergency download(短接板子上的force_boot_from_usb引脚(MSM8953 为gpio37)到1.8v可以强制进入紧急下载模式)。(此段代码封装在芯片内部,并不开源)
- SBL1 (Second BootLoader stage 1) :位于eMMC中,由PBL加载,初始化buses、DDR、clocks等。
- QSEE/TrustZone 安全相关。
- Debug Policy 调试相关。
- APPSBL :即为BootLoader,目前使用LK(little kernel)。
- HLOS (High LevelOperating System) 即为Linux/Android。
三、启动流程
- AP侧CPU上电。
- 在芯片内部ROM的PBL首先运行,PBL会从boot device(eMMC)中加载并验证SBL1到TCM中。这里的TCM可以理解为CPU的二级缓存。既然PBL能够从boot device(eMMC)中加载SBL1,那PBL应该是初始化过boot device的。
- SBL1初始化DDR,并从boot device中加载并且校验如下镜像: QSEE或者TZ镜像、QHEE镜像、RPM_FW、镜像、APPSBL等。
- SBL1加载并验证完上述镜像后,即将执行权转移到QSEE中,QSEE将设置并初始化一个安全的执行环境。
- QSEE通知RPM去执行RPM_FW相关代码。
- QSEE将执行权转移到APPSBL中,APPSBL也就是LK。
- LK加载HLOS的kernel。
四、代码流程简要流程
SBL
PBL部分并不开源,所以从SBL开始。
sbl1入口: sbl1.s
此部分代码路径在:boot_images/c