Bootrom -> bootloader -> kernel -> init -> Android
 PBL ->xbl/abl ->kernel_init
 PBL(Primary Boot Loader)→ XBL(eXtensible Boot Loader/Secondary bootloader) → ABL(Application bootloader)→ Kernel→ AndroidPBL -> UEFI -> kernel

Android系统是基于Linux kernel内核的。(交叉编译?
当用户长按电源键后,会引导芯片加载BootLoader到内存中,并开始拉起Linux kernel内核。待Linux kernel启动完成后便会启动第一个用户空间的进程——init进程。启动init进程时,会进入system/core/init/main.cpp文件执行main方法。
Android启动流程跟 Linux启动类似,大致分为如下五个阶段。

  • 1.开机上电,加载固化的ROM。
    - 2.加载BootLoader,拉起Android OS。
  • 2.是进入UEFI(以前是BIOS)。
  • 3.加载Uboot,初始外设,引导Kernel启动等。
  • 4.启动Kernel,加载驱动,硬件。
  • 5.启动Android,挂载分区,加载驱动、服务,init进程等。

1. Bootrom

Bootrom(或Boot ROM)是嵌入处理器芯片(SOC)内的一小块掩模ROM或写保护闪存。它包含处理器在上电或复位时执行的第一个代码。根据某些带式引脚或内部保险丝的配置,它可以决定从哪里加载要执行的代码的下一部分以及如何或是否验证其正确性或有效性。有时它可能包含其他功能,可能在引导期间或之后由用户代码使用。

Bootrom 也即是PBL阶段。PBL 启动时,CPU只开启了第一个核心 CPU Core 0,运行固件在ROM中,这部分是高通写死在芯片中的固件,外部开发人员是无法修改这部份的。(网上没怎么找到这部分相关资料)

2 UEFI(为了不误导,这里修改一下,后续补充)

从UEFI(PBL和xbl、abl阶段)就有白米图标了,这里代码可以看到。

如果卡白米,没有adb。代表kernel没起来。

卡白米能进adb那kernel肯定就起来了。基本都是system的问题

卡MIUI的还没有遇到过,

3. bootloader

经常用的fastboot刷机就是在进入了bootloader后执行的,fastboot可以理解为一个微程序,
adb reboot bootloader
bootloader属于xbl/abl阶段,高通的UEFI分成XBL和ABL,XBL是平台相关的(主要是一些驱动程序,提供通用接口);ABL是平台不相关的通用程序(通常是fastboot和bootloader),ABL调用XBL实现的通用接口,这里的bootloader可以是linuxloader,LK(lightkernel)(这个LK一般是MTK的),uboot等;XBL由高通实现,一般不开源,ABL一般是用户关心的,是主要改动部分。

我们所说的各种分区,也是在bootloader启动后才开始加载各个分区。

  • XBL代码在vendor/qcom/non-hlos-xxxx
    BOOT.MXF.x.x
    xbl应该是属于BP的一部分,xbl的编译依赖BP的编译,也就是下载fusion工具编译,

执行non-hlos-xxxx目录下的$(your_product)_build_boot.sh
脚本与文件夹名对应,boot对应BOOT.MXF.xxx
xbl是boot.sh,其它还有adsp、cdsp、aop、modem等sh脚本。
(高通的自家还有SBL,但是一般不会操作这部分,也不开源

分区表是nonhlos.sh

  • ABL代码在edk2中(根目录下bootable/bootloader/edk2
    XBL core (UEFI or LK,ABL)
    XBL core,就是之前的bootloader,主要功能就是初始化display驱动,提供fastboot功能,引导进入HLOS kernel操作系统。
    在ABL中,同样也只有CPU Core0在工作,其他的CPU核以是在进入HLOS Kernel后才开始初始化启用的。

ABL 的编译非常简单, 依次执行命令:
source build/envsetup.sh
lunch device
make aboot

刷写
fastboot flash abl abl.elf

不同的厂商对 UEFI 有不同的实现,比较常用的开源实现是 EDK2 https://github.com/tianocore/edk2 ;EDK2 是一个遵循 UEFI 标准和 PI 标准的跨平台固件开发环境,EDK2 支持多种操作系统,也支持跨平台编译。
确切来讲,高通所使用的 edk2 即为 uefi在ABL 部分的代码。

4. Kernel

  • 一般刷机橙屏了crash了,就代表kernel坏了,这代表我们已经进入启动kernel阶段了,可以使用fastboot或者edl刷机;
  • 如果是fastboot进不去,说明bootloader没有启动,xbl/abl有问题,只能使用edl线刷机。
  • edl线如果也解决不了,只能换机器了。

总结:
pbl -> xbl/abl -> kernel_init -> first_stage -> zygote
Bootrom -> bootloader -> kernel -> init -> android