高通Secure Boot调试流程记录

本文提供了一个详细的步骤指导,介绍如何为设备启用Secure Boot,并详细解释了创建证书链、配置哈希值、签名固件镜像及烧录sec.dat文件的过程。
参考文档KBA-161109181347-how_to_enable_secure_boot_step_by_step.pdf。
1.新建临时目录tmp:
   mkdir tmp

   cd tmp

2.复制opensslroot.cfg和v3.ext到tmp目录,这两个文件在后面的命令中要用到:
   cp ~/work/M1503-6.0.1-01610/LINUX/android/vendor/qcom/proprietary/common/scripts/SecImage/resources/openssl/opensslroot.cfg .
   cp ~/work/M1503-6.0.1-01610/LINUX/android/vendor/qcom/proprietary/common/scripts/SecImage/resources/openssl/v3.ext .

3.按照文档产生证书链:
   openssl genrsa -out oem_rootca.key -3 2048
  
openssl req -new -key oem_rootca.key -x509 -out oem_rootca.crt -subj /C="US"/ST="CA"/L="SANDIEGO"/O="OEM"/OU="General OEM rootca"/CN="OEM ROOT CA" -days 7300 -set_serial 1 -config opensslroot.cfg
   openssl genrsa -out oem_attestca.key -3 2048
   openssl req -new -key oem_attestca.key -out oem_attestca.csr -subj /C="US"/ST="CA"/L="
SANDIEGO"/O="OEM"/OU="General OEM attestation CA"/CN="OEM attestation CA" -days 7300 -config opensslroot.cfg
   openssl x509 -req -in oem_attestca.csr -CA oem_rootca.crt -CAkey oem_rootca.key -outoem_attestca.crt -set_serial 5 -days 7300 -extfile v3.ext
   openssl x509 -in oem_rootca.crt -inform PEM -out oem_rootca.cer -outform DER
   openssl x509 -in oem_attestca.crt -inform PEM -out oem_attestca.cer -outform DER
   mv oem_rootca.key qpsa_rootca.key
   mv oem_attestca.key qpsa_attestca.key
   mv oem_rootca.cer qpsa_rootca.cer
   mv oem_attestca.cer qpsa_attestca.cer
   openssl dgst -sha256 qpsa_rootca.cer
   这个命令产生的哈希值在
后面会用到:
   SHA256(qpsa_rootca.cer)=8ecf3eaa03f772e28479fa2f0bbae2141ccad6f106b384d1c46263edb5b02838
4.将产生的qpsa_rootca.keyqpsa_attestca.keyqpsa_rootca.cerqpsa_attestca.cer复制到common/tools/sectools/resources/data_prov_assets/Signing/Local/qc_presigned_certs-key2048_exp3目录:
cp qpsa_rootca.keyqpsa_attestca.key qpsa_rootca.cerqpsa_attestca.cer ~/work/M1503-6.0.1-01610/common/tools/sectools/resources/data_prov_assets/Signing/Local/qc_presigned_certs-key2048_exp3/
5.进入sectools目录,配置哈希值,使能secure boot:
   cd ~/work/M1503-6.0.1-01610/common/tools/sectools
   修改文件config/8909/8909_fuseblower_USER.xml,红色的为修改内容,一共有4处:
   1) <entry ignore="false">
               <description>contains the OEM public key hash as set by OEM</description>
               <name>root_cert_hash</name>
               <value>8ecf3eaa03f772e28479fa2f0bbae2141ccad6f106b384d1c46263edb5b02838</value>
        </entry>
   这个哈希值就是步骤3最终生成的64位哈希值。
   2) <entry ignore="false">
             <description>PK Hash is in Fuse for SEC_BOOT1 : Apps</description>
             <name>SEC_BOOT1_PK_Hash_in_Fuse</name>
             <value>true</value>
        </entry>
   3) <entry ignore="false">
            <description>PK Hash is in Fuse for SEC_BOOT2 : MBA</description>
            <name>SEC_BOOT2_PK_Hash_in_Fuse</name>
            <value>true</value>
        </entry>
   4) <entry ignore="false">
            <description>PK Hash is in Fuse for SEC_BOOT3 : MPSS</description>
            <name>SEC_BOOT3_PK_Hash_in_Fuse</name>
            <value>true</value>
        </entry>
6.生成sec.dat文件:
   python sectools.py fuseblower -e config/8909/8909_fuseblower_OEM.xml -q config/8909/8909_fuseblower_QC.xml -u config/8909/8909_fuseblower_USER.xml -g verbose -vvv
   用下面的命令查看生成的sec.dat是否和xml文件匹配:
   python sectools.py fuseblower --oem_config_path=config/8909/8909_fuseblower_OEM.xml --qc_config_path=config/8909/8909_fuseblower_QC.xml --user_config_path=config/8909/8909_fuseblower_USER.xml --secdat=fuseblower_output/v1/sec.dat --validate
7.给镜像签名,8909_secimage.xml文件中提到的文件均需要签名,在AP侧只需要签lk即可。在msm8909平台上,需要签名的文件如下:
   boot_images/build/ms/bin/8909/emmc/sbl1.mbn
   boot_images/build/ms/bin/8909/emmc/unsigned/prog_emmc_firehose_8909_ddr.mbn
   LINUX/android/out/target/product/msm8909/emmc_appsboot.mbn
   modem_proc/build/ms/bin/8909.gen.prod/mba.mbn
   modem_proc/build/ms/bin/8909.gen.prod/qdsp6sw.mbn
   rpm_proc/build/ms/bin/8909/pm8909/rpm.mbn
   trustzone_images/build/ms/bin/MAZAANAA/tz.mbn
   wcnss_proc/build/ms/bin/SCAQMAZ/reloc/wcnss.mbn
   有两种方式签名:
   方法一:使用python sectools.py secimage -i ~/work/M1503-6.0.1-01610/modem_proc/build/ms/bin/8909.gen.prod/mba.mbn -c config/8909/8909_secimage.xml -sa命令逐一给所有镜像签名。
   方法二:使用python sectools.py secimage -m ~/work/M1503-6.0.1-01610 -c ./config/8909/8909_secimage.xml -o ~/sec_output -sa命令给所有镜像签名,-m ~/work/M1503-6.0.1-01610指定源码根目录,-o  ~/sec_output指定签名后的镜像存放位置。
8.签名后,需要将wcnss.mbn,mba.mbn,qdsp6sw.mbnc重新放回源目录下,到common/build下面执行python update_common_info.py,更新modem分区。
9.用QFIL工具将签名后的镜像下载到单板,开机后用fastboot工具将步骤6生成的sec.dat刷到sec分区。

烧写sec.dat后,下次再用QFIL工具就没法下载了,想再次用QFIL刷机,需要修改bootloader:
For 8994:boot_images/core/storage/tools/deviceprogrammer/src/firehose/deviceprogrammer_initialize.c
static void deviceprogrammer_init_hw()
{
<snip>
     fh.validation_enabled = FALSE;

#ifndef SKIP_SECBOOT_CHECK_NOT_RECOMMENDED_BY_QUALCOMM
    // This check below is to ensure that only VIP programmer is run on secure boot devices
    // In otherwords, signing the non VIP programmer is highly not recommended
    if( isSecureBootEnabled()==TRUE )
    {
        // To be here means Secure Boot Fuses are blown, therefore must use VIP
        fh.validation_enabled = TRUE;
    }
#endif

+     fh.validation_enabled = FALSE;
 
     // These PMIC calls were added to have long key power off to be
<snip>
}

For 8939/8916/8909:boot_images/core/storage/tools/deviceprogrammer_ddr/src/firehose/deviceprogrammer_initialize.c
+/* comment out - start
#ifndef SKIP_SECBOOT_CHECK_NOT_RECOMMENDED_BY_QUALCOMM
// This check below is to ensure that only VIP programmer is run on secure boot devices
// In otherwords, signing the non VIP programmer is highly not recommended
if (FALSE == isValidationMode() && TRUE == isAuthenticationEnabled()) { strlcat(err_log, "Secure boot detected. VIP not enabled:fail ", sizeof(err_log)); }
#endif
+ comment out - end */
修改后重编bootloader,用步骤7的方法一给镜像签名,将签名后的镜像覆盖之前的镜像,就可以再次用QFIL工具下载。

注意:一旦烧写sec.dat,如果开机失败,将导致单板报废,所以在烧写前,需要确保签名没有问题,高通提供了拉高GPIO的方法来验证签名的正确性,具体可以参考文档80-NP408-5B-msm8909_msm8609_msm8209_msm8208_apq8009_Digital_Baseband.pdf:

高通平台 Android 设备的启动流程是 Android 通用启动流程的一个具体实现,其在 Bootloader 阶段具有高通特有的组件结构(如 PBL、XBL、ABL),并且支持多种启动模式和安全机制(如 Secure Boot、Verified Boot)。以下是**高通平台 Android 设备的完整启动流程**,涵盖从硬件上电到用户进入桌面的全过程。 --- ## 📱 高通平台 Android 设备启动流程详解 --- ### 1. **Boot ROM 阶段(固件启动)** - **位置**:固化在芯片内部的 ROM。 - **触发时机**:设备上电或重启。 - **主要功能**: - 初始化 CPU、内存控制器、时钟等基础硬件。 - 检查启动介质(如 eMMC、UFS)是否存在有效的 Bootloader。 - 加载并执行 PBL(Primary Boot Loader)到 RAM 中。 > ⚠️ **特点**:不可修改,安全性高,是整个启动流程的“信任根”。 --- ### 2. **Bootloader 阶段** 高通平台的 Bootloader 通常分为多个阶段,依次加载,确保平台初始化的完整性与安全性。 #### 🧩 2.1 **PBL(Primary Boot Loader)** - 芯片级引导程序。 - 初始化 DDR 内存。 - 校验 XBL 签名(Secure Boot)。 - 加载 XBL 到内存并跳转执行。 #### 🧩 2.2 **XBL(eXtensible Boot Loader)** - 平台级引导程序。 - 初始化更多硬件(如存储控制器、USB、Display)。 - 加载 ABL 或直接加载内核镜像(zImage)和设备树(dtb)。 - 支持 Fastboot、Recovery、OTA 等模式。 - 执行 AVB(Android Verified Boot)校验。 #### 🧩 2.3 **ABL(Android Boot Loader)** - 加载 Linux 内核(zImage)和 ramdisk。 - 设置启动参数(cmdline、设备树地址)。 - 跳转到内核入口(`stext`),进入内核阶段。 > 🛡️ **安全机制**: - **Secure Boot**:验证 Bootloader 和内核签名。 - **AVB(Android Verified Boot)**:验证内核、ramdisk、system 分区完整性。 --- ### 3. **Linux Kernel 阶段** - **入口函数**:`stext()`,位于 `arch/arm64/kernel/head.S`。 - **主要功能**: - 初始化 CPU、内存管理、进程调度、中断、设备驱动等核心组件。 - 挂载根文件系统(通常是 ramdisk)。 - 启动第一个用户空间进程:`/init`。 > 🧩 内核关键子系统: - **进程调度器**:负责进程管理。 - **内存管理**:页表、虚拟内存、MMU 初始化。 - **设备驱动**:加载硬件驱动(如 Display、Touch、USB)。 - **文件系统**:挂载 `/sys`, `/proc`, `/dev`。 - **网络栈**:初始化 TCP/IP 协议栈。 --- ### 4. **Init 进程阶段(用户空间第一个进程)** - **PID**:1 - **作用**:初始化用户空间环境,启动系统关键服务。 - **关键任务**: - 挂载 `/sys`, `/proc`, `/dev`。 - 解析 `init.rc` 及其子脚本(如 `init.qcom.rc`)。 - 设置系统属性(如 `ro.hardware`、`ro.product.model`)。 - 启动关键守护进程:`logd`、`ueventd`、`servicemanager`、`zygote`。 - 执行 `on early-init`、`on init`、`on late-init` 等触发器。 --- ### 5. **Zygote 启动阶段(Java 运行环境初始化)** - **作用**:为 Android 应用提供运行基础。 - **启动方式**:由 `init.rc` 启动 Zygote 可执行文件(`app_process`)。 - **关键流程**: - 创建 Java 虚拟机(ART)。 - 加载核心类库(如 `core-libart.jar`)。 - 预加载资源(`preload()`): - 类(如 `android.R`, `java.lang.String`) - 资源(如图标、布局) - 共享库(如 `libandroid_runtime.so`) - 监听 socket,等待 AMS 请求 fork 新应用进程。 - fork 出 `SystemServer` 进程。 --- ### 6. **SystemServer 启动阶段(系统服务核心)** - **作用**:Android 系统的核心进程,负责管理所有系统服务。 - **主要服务**: - **AMS(Activity Manager Service)**:管理 Activity 生命周期、任务栈。 - **WMS(Window Manager Service)**:管理窗口层级、显示状态。 - **PMS(Package Manager Service)**:管理应用安装、权限、签名。 - **PKMS(PowerManagerService)**:管理电源状态、唤醒锁。 - **InputManagerService**:管理输入设备(如触摸屏、键盘)。 - **BatteryService**:管理电池状态。 - **NetworkManagementService**:管理网络连接。 > 🧠 **SystemServer 启动顺序**:通过 `SystemServiceManager` 依次启动各服务。 --- ### 7. **Launcher 启动阶段(用户界面启动)** - **作用**:启动桌面应用,用户可进行交互。 - **主要流程**: - AMS 启动 Launcher 应用(通常是系统预装的桌面应用)。 - Launcher 进程由 Zygote fork 出来。 - Launcher 加载桌面 UI,显示图标、壁纸、快捷方式。 - 用户可点击图标启动其他应用。 --- ### 8. **应用启动阶段(按需启动)** - **启动方式**: - 用户点击图标。 - 系统广播触发。 - 其他应用调用 `startActivity()`。 - **关键流程**: - AMS 通知 Zygote 创建新进程。 - Zygote fork 出新进程,并加载应用代码。 - 应用进入运行状态,开始执行 `main()` 方法。 - 输出日志到 `logcat`,可查看 `logcat main` 和 `logcat system`。 --- ## 📁 高通平台启动关键日志与调试信息 | 日志类型 | 命令 | 说明 | |----------|------|------| | 内核日志 | `dmesg` 或 `cat /proc/kmsg` | 查看从 Bootloader 到 Kernel 启动过程 | | logcat 内核缓冲区 | `logcat -b kernel` | 查看内核打印信息 | | logcat 应用层日志 | `logcat -b main` | 查看 Android 应用层日志 | | logcat 系统服务日志 | `logcat -b system` | 查看系统服务相关日志 | | 启动耗时统计 | `cat /proc/boottime` | 查看各阶段启动时间 | | 启动性能分析工具 | `systrace.py` / `perfetto` | 图形化分析系统启动性能 | --- ## 🧩 高通平台启动优化方向 | 优化方向 | 说明 | |----------|------| | 快速 Bootloader | 减少不必要的初始化 | | 内核裁剪 | 移除无用驱动、启用压缩 | | Init 阶段优化 | 减少 init.rc 中的等待和同步 | | Zygote 预加载优化 | 控制 preload 内容大小 | | SystemServer 启动顺序调整 | 延迟非关键服务启动 | | 启动动画优化 | 提前显示动画,掩盖启动时间 | | 安全机制优化 | 优化 AVB 和 Secure Boot 检查时间 | --- ## 📌 总结图示(高通平台 Android 启动流程) ``` Boot ROM → PBL → XBL → ABL → Linux Kernel → init → Zygote → SystemServer → Launcher → 应用 ``` --- ###
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值