一、前言

在面对UEFI阶段代码移植以及开机故障问题,需要对开机启动流程有一定的了解

二、芯片的冷启动

Cold boot flow: 冷启动

可以看出,在设备上电后,先跑的是 APPS PBL,接着运行XBL SEC、XBL Loader,通过Loader引出XBL CORE APPSBL,最后进入HLOS

备注:

下面补充点arm架构的知识点,以便可以看懂上图

2.1 异常级别

异常级别运行的软件
EL0Application
EL1Linux kernel- os
EL2Hypervisor(可理解为上面跑多个虚拟OS)
EL3Secure Monitor(ARM Trusted Firmware)
  1. ELx(x<4),x越大等级越高,执行特权越高
  2. 执行在EL0,称为非特权执行
  3. EL2没有Secure state,只有Non-secure state
  4. EL3 只有Secure state,支持EL0/EL1的Secure 和Non-secure之间的切换
  5. EL0 & EL1 必须要实现,EL2/EL3则是可选实现
  6. 当接收到一个异常时,异常级别只能调高或保持;
  7. 当从异常返回时,异常级别只能调低或保持
  8. 在接收到异常将要切换或保持的异常级别称为目标异常级别
  9. 每个异常级别本身有一个默认固定的目标异常级别,还可以通过寄存器设置目标异常级别,目标异常级别不能为EL0
  10. 当PE运行在一个异常级别时,可以访问如下两种资源:1)当前异常级别和安全状态组合下的资源;2)低异常级别可访问的资源(要符合安全状态)

2.2 secure state

状态特点
Non-secureEL0/EL1/EL2, 只能访问Non-secure 物理地址空间
SecureEL0/EL1/EL3, 可以访问Non-secure 物理地址空间 & Secure 物理地址空间,可起到物理屏障安全隔离作用

这几个涉及的模块大概功能

  1. Application primary boot loader (APPS PBL)

PBL 启动时,CPU只开启了第一个核心 CPU Core 0,运行固件在ROM中,这部分是高通写死在芯片中的固件,外部开发人员是无法修改这部份的。

主要功能为:

(1)系统安全环境的初始化,以确保后续的XBL中的APPS 能够正常运行。

(2)根据boot gpio的配置选择从什么设备启动操作系统(如 Nand,USB等)。

(3)通过检测GPIO判断是否进入Emergency Download mode,用户可以通过QFIL来下载完整的系统镜像。

(4)通过L2 TCM来加载XBL1 ELF,OCIMEM 和 RPM CodeRAM 代码。

  1. Extensible boot loader (XBL)

从XBL开始,跑的就是我们编译下载进eMMC/UFS的系统镜像了,在XBL中主要是初始化相关的硬件环境,及代码安全环境。

(1)初始化 Buses、DDR、Clocks、CDT,启动QSEE,QHEE,RPM_FW, XBL core images。

(2)使能memory dump through USB and Sahara(系统死机时memory dump),看门狗,RAM dump to SD support等功能。

(3)初始化 USB驱动,USB充电功能,温升检测,PMIC驱动初始化,和 DDR training模块。

  1. XBL core (UEFI or LK,ABL)

XBL core,就是之前的bootloader,主要功能就是初始化display驱动,提供fastboot功能,引导进入HLOS kernel操作系统。 注意,在ABL中,同样也只有CPU Core0在工作,其他的CPU核以是在进入HLOS Kernel后才开始初始化启用的。

三、代码目录架构

此处内容已隐藏,「评论可见」