AI智能摘要
本篇文章主要介绍了UEFI阶段代码移植以及开机故障问题,并深入分析了开机启动流程。文章首先阐述了芯片的冷启动流程,包括APPS PBL、XBL SEC、XBL Loader、XBL CORE APPSBL和HLOS等阶段的运行过程。接着,文章详细介绍了arm架构的知识点,如异常级别和secure state,以及相关模块的功能。然后,文章分析了代码目录架构,包括编译指令和代码位置。此外,文章还详细介绍了PBL到SBL的启动过程,包括sbl1_main_ctl函数和boot_config_process_bl函数的工作原理。最后,文章深入分析了UEFI的背景介绍、流程分析和ABL的相关内容,包括XBL Loader Architecture、xbl代码运行流程、如何创建UEFI DXE_DRIVER驱动及UEFI_APPLICATION应用程序以及UEFI XBL QcomChargerApp充电流程代码分析等。
此摘要由AI分析文章内容生成,仅供参考。

一、前言

在面对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)
  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-secure EL0/EL1/EL2, 只能访问Non-secure 物理地址空间
Secure EL0/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后才开始初始化启用的。

三、代码目录架构

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