高通Secure Boot调试流程记录

本文提供了一个详细的步骤指导,介绍如何为设备启用Secure Boot,并详细解释了创建证书链、配置哈希值、签名固件镜像及烧录sec.dat文件的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考文档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:

<think>好的,用户想了解高通和MTK启动流程的区别。首先,我需要查阅提供的三个引用,看看里面有没有相关的信息。 引用[1]主要讲指纹移植调试流程,可能和启动流程关系不大,但提到了高通的tee环境和MTK的三方tee OS,这点可能在安全启动阶段有区别。引用[2]详细描述了MTK平台的启动流程,从zygote到启动Java虚拟机,再到system_server和其他服务,最后到Launcher。引用[3]提到高通和MTK的驱动开发流程,以及MTK处理器的应用市场,但未直接涉及启动流程。 接下来,需要比较两者的启动流程。根据引用[2],MTK的启动流程包括zygote启动Java虚拟机,然后fork出system_server,再启动其他服务,最后启动Launcher。而高通的启动流程可能有所不同,特别是在底层初始化和安全环境部分,比如高通的XBL阶段和ABL阶段,这些可能在引用中没有提到,但根据行业知识,高通通常有更分阶段的启动加载过程。此外,安全环境方面,引用[1]提到高通使用自家tee,MTK用第三方tee OS,这可能影响启动时的安全初始化步骤。 另外,用户可能需要知道启动阶段各部分的顺序,比如高通的XBL加载ABL,然后启动Linux内核,而MTK可能直接从preloader到lk再到内核。服务初始化方面,MTK的zygote较早启动Java虚拟机,而高通可能在ABL阶段处理更多底层驱动。 最后,要确保回答结构清晰,分点比较,引用相关文献,并生成相关问题。需要检查是否有遗漏的信息,并确保术语正确,比如XBL、ABL、lk等是否正确使用。</think>### 高通与MTK启动流程的区别比较 #### 1. **底层初始化阶段** - **高通平台**: 启动流程通常分为多个阶段,包括 **XBL(eXtensible Boot Loader)** 和 **ABL(Android Boot Loader)**。XBL负责初始化硬件和安全环境(如TEE),加载ABL后进一步启动Linux内核。高通的安全环境(如QSEE)在XBL阶段即被初始化[^1][^3]。 - **MTK平台**: 启动流程从 **preloader** 开始,接着是 **Little Kernel(LK)**,负责加载设备树和初始化基础硬件。MTK的安全环境依赖于第三方TEE OS(如Trustonic),其初始化通常在LK阶段完成[^1][^3]。 #### 2. **内核与用户空间交互** - **高通**: 内核启动后,通过 **ABL** 直接加载Android系统镜像(如`boot.img`),并初始化核心服务(如`init`进程)。高通在驱动加载时更依赖芯片组专属的二进制模块(如`.mbn`文件)[^3]。 - **MTK**: 内核启动后,**LK** 会传递控制权到Android的`init`进程。MTK平台在用户空间初始化时,较早启动 **zygote** 进程以创建Java虚拟机,从而快速衔接底层C++代码与上层Java服务[^2]。 #### 3. **服务与框架启动** - **高通**: 服务初始化更注重硬件抽象层(HAL)的兼容性,例如指纹驱动需通过QSEE的TA(Trusted Application)与HAL交互[^1]。 - **MTK**: 服务启动流程中,**system_server** 的优先级较高,会快速启动电源管理、电话注册等服务。Launcher的启动被归类为“其他服务”,依赖MTK定制的中低端芯片组资源调度策略[^2][^3]。 #### 4. **安全与TEE集成** - **高通**: 使用自家 **QSEE(Qualcomm Secure Execution Environment)**,与硬件深度绑定,安全启动流程贯穿XBL到ABL阶段[^1]。 - **MTK**: 依赖第三方TEE(如Trustonic或豆荚科技),安全环境初始化需与LK协同,调试时需额外集成SPI TA(安全应用)[^1]。 --- ###
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值