一、前言
在面对UEFI阶段代码移植以及开机故障问题,需要对开机启动流程有一定的了解
二、芯片的冷启动
Cold boot flow: 冷启动
可以看出,在设备上电后,先跑的是 APPS PBL,接着运行XBL SEC、XBL Loader,通过Loader引出XBL CORE APPSBL,最后进入HLOS
备注:
下面补充点arm架构的知识点,以便可以看懂上图
2.1 异常级别
异常级别 | 运行的软件 |
---|---|
EL0 | Application |
EL1 | Linux kernel- os |
EL2 | Hypervisor(可理解为上面跑多个虚拟OS) |
EL3 | Secure Monitor(ARM Trusted Firmware) |
- ELx(x<4),x越大等级越高,执行特权越高
- 执行在EL0,称为非特权执行
- EL2没有Secure state,只有Non-secure state
- EL3 只有Secure state,支持EL0/EL1的Secure 和Non-secure之间的切换
- EL0 & EL1 必须要实现,EL2/EL3则是可选实现
- 当接收到一个异常时,异常级别只能调高或保持;
- 当从异常返回时,异常级别只能调低或保持
- 在接收到异常将要切换或保持的异常级别称为目标异常级别
- 每个异常级别本身有一个默认固定的目标异常级别,还可以通过寄存器设置目标异常级别,目标异常级别不能为EL0
- 当PE运行在一个异常级别时,可以访问如下两种资源:1)当前异常级别和安全状态组合下的资源;2)低异常级别可访问的资源(要符合安全状态)
2.2 secure state
状态 | 特点 |
---|---|
Non-secure | EL0/EL1/EL2, 只能访问Non-secure 物理地址空间 |
Secure | EL0/EL1/EL3, 可以访问Non-secure 物理地址空间 & Secure 物理地址空间,可起到物理屏障安全隔离作用 |
这几个涉及的模块大概功能
- 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 代码。
- 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模块。
- XBL core (UEFI or LK,ABL)
XBL core,就是之前的bootloader,主要功能就是初始化display驱动,提供fastboot功能,引导进入HLOS kernel操作系统。 注意,在ABL中,同样也只有CPU Core0在工作,其他的CPU核以是在进入HLOS Kernel后才开始初始化启用的。