4. ATF(ARM Trusted firmware)启动---bl2到bl31的跳转

本文详细解析了BL1_SMC_RUN_IMAGE在bl2_main函数中的应用过程,包括smc操作触发后的处理流程,以及如何通过smc_handler64函数实现从BL1到下一个BL镜像的切换。

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

   

  

在bl2_main函数中的最后一句是:

smc(BL1_SMC_RUN_IMAGE, (unsigned long)next_bl_ep_info, 0, 0, 0, 0, 0, 0);

  该函数将触发smc操作,而smc的handle在bl1阶段的时候被指定,调用该函数的时候带入command ID是BL1_SMC_RUN_IMAGE,故执行该函数之后,系统将跳转到中断处理函数:smc_handler64继续执行。该函数定义在bl1/aarch64/bl1_exception.S文件中,内容如下:

func smc_handler64

	/* ----------------------------------------------
	 * Detect if this is a RUN_IMAGE or other SMC.
	 * ----------------------------------------------
	 */
/* 判定触发smc操作时带入的参数是否是跳转执行image的操作 */
	mov	x30, #BL1_SMC_RUN_IMAGE	//将BL1_SMC_RUN_IMAGE的值保存到x30
	cmp	x30, x0	//比较x30与x0的值
	b.ne	smc_handler	//如果x30与x0不同则认为是普通类型的异常,进入到smc_handler进行处理

	/* ------------------------------------------------
	 * Make sure only Secure world reaches here.
	 * ------------------------------------------------
	 */
	mrs	x30, scr_el3	//获取scr寄存器的值
	tst	x30, #SCR_NS_BIT	//比较scr寄存器中的NS位与SCR_NS_BIT是否相等
	b.ne	unexpected_sync_exception	//如果当前NS位为非安全位,则证明不合法,产生异常

	/* ----------------------------------------------
	 * Handling RUN_IMAGE SMC. First switch back to
	 * SP_EL0 for the C runtime stack.
	 * ----------------------------------------------
	 */
	ldr	x30, [sp, #CTX_EL3STATE_OFFSET + CTX_RUNTIME_SP]	/获取offset和sp的值
	msr	spsel, #0	//清空spsel中的值
	mov	sp, x30	//保存x30的值到sp寄存器,用于返回

	/* ---------------------------------------------------------------------
	 * Pass EL3 control to next BL image.
	 * Here it expects X1 with the address of a entry_point_info_t
	 * structure describing the next BL image entrypoint.
	 * ---------------------------------------------------------------------
	 */
	mov	x20, x1	//将x1中的数据保存到x20中

	mov	x0, x20	//将x20的数据保存到x0中
	bl	bl1_print_next_bl_ep_info	//打印出bl3x镜像文件信息

	ldp	x0, x1, [x20, #ENTRY_POINT_INFO_PC_OFFSET]	//将传入的参数和bl3x入口函数PC指针
	msr	elr_el3, x0	
	msr	spsr_el3, x1
	ubfx	x0, x1, #MODE_EL_SHIFT, #2	//设定cortex模式
	cmp	x0, #MODE_EL3	//比较x0寄存器中的值是否为MODE_EL3
	b.ne	unexpected_sync_exception	//如果x0中不是MODE_EL3则产生异常

	bl	disable_mmu_icache_el3	//禁止MMU的指令cache
	tlbi	alle3

#if SPIN_ON_BL1_EXIT
	bl	print_debug_loop_message
debug_loop:
	b	debug_loop
#endif
	mov	x0, x20
	bl	bl1_plat_prepare_exit/
* 设定返回参数 */
	ldp	x6, x7, [x20, #(ENTRY_POINT_INFO_ARGS_OFFSET + 0x30)]
	ldp	x4, x5, [x20, #(ENTRY_POINT_INFO_ARGS_OFFSET + 0x20)]
	ldp	x2, x3, [x20, #(ENTRY_POINT_INFO_ARGS_OFFSET + 0x10)]
	ldp	x0, x1, [x20, #(ENTRY_POINT_INFO_ARGS_OFFSET + 0x0)]
	eret	//跳转到bl3x执行
endfunc smc_handler64

<think>我们正在讨论TrustedFirmwareBL1启动过程,特别是关于fast_boot、efuse和cpu_cfg相关的细节。根据引用内容,BL1ATFARMTrustedFirmware启动流程中的第一步,通常对应BootROM。用户查询的关键词:TrustedFirmwareBL1bootprocess,fast_boot,efuse,cpu_cfg。根据引用[1]:BL1-APTrustedROM,一般为BootRom。在ARMTrustedFirmware启动流程中,BL1是芯片上电后运行的第一段可信代码,通常由芯片厂商固化在ROM中。它负责初始化最基础的硬件(如CPU、内存控制器等),并加载BL2。关于用户提到的几个关键词:1.fast_boot:可能是指快速启动机制,通常通过跳过某些耗时的初始化步骤或使用预初始化的硬件状态来实现。在BL1阶段,可能会利用efuse中的配置来加速启动2.efuse:电熔丝,是一种非易失性存储器,通常用于存储芯片的安全配置信息,例如安全启动密钥、启动模式配置等。在BL1阶段,会读取efuse中的配置来决定启动流程(例如是否启用安全启动、选择启动设备等)。3.cpu_cfg:可能指CPU的配置信息,包括核心数目、缓存配置、频率等。在BL1阶段,会根据efuse或硬件的固定配置来设置CPU。根据引用[3]:在引导阶段加载启动的镜像,采用展锐特有的签名验签方案。这些镜像有fdl1.bin、fdl2.bin、u-boot-spl16k.bin、sml.bin、tos.bimu-boot.bin。这里提到的fdl1.bin和fdl2.bin可能对应于BL1BL2阶段(具体取决于芯片厂商的命名)。BL1阶段会验证BL2镜像的签名(如果启用了安全启动),然后加载并跳转BL2。关于BL1启动过程的详细步骤(以ARMTrustedFirmware为例):1.上电后,CPU从固定地址(通常是ROM的起始地址)开始执行BL1代码。2.BL1初始化必要的硬件,包括:-设置异常向量表-初始化串口(用于调试输出)-初始化内存控制器(如果BL1需要加载BL2到内存中)-读取efuse中的安全配置信息3.根据efuse配置,决定是否启用安全启动。如果启用,则使用内置公钥或efuse中的公钥验证BL2镜像的数字签名。4.启动设备(如eMMC、SPIFlash等)加载BL2镜像到内存中。5.跳转BL2执行。在fast_boot模式下,可能会跳过某些不必要的硬件初始化步骤,或者使用预先配置好的硬件状态(例如,efuse中配置了固定的时钟源和频率,从而跳过PLL的锁定过程)。关于cpu_cfg,在BL1阶段,CPU的配置可能包括:-设置ARM核的运行模式(通常是安全模式,EL3)-配置MMU或Cache(通常BL1会配置一个简单的内存映射,并启用指令和数据Cache以加速执行)-配置核心的数量(在BL1阶段可能只启动一个核心,其他核心处于等待状态)注意事项:-BL1的代码通常由芯片厂商提供,并且是封闭的。因此,具体的实现细节可能因芯片而异。-如果用户需要修改BL1的行为(例如配置fast_boot或efuse),通常需要芯片厂商提供支持。问题解决方法:-如果在BL1阶段遇到问题(例如启动失败),通常需要:1.检查efuse的配置是否正确(例如安全启动配置、启动设备选择等)。2.检查BL2镜像是否正确签名(如果启用了安全启动)。3.检查硬件初始化是否正确(例如内存初始化是否成功)。由于BL1是固化在ROM中的,因此用户无法直接修改BL1代码。但可以通过配置efuse或修改后续阶段的镜像来调整启动流程。根据引用[2]和[3],安全启动的配置在U-Boot阶段也有涉及,但BL1是安全启动的第一环。总结:BL1启动过程的最初阶段,负责最基础的硬件初始化和加载BL2。fast_boot、efuse和cpu_cfg是影响BL1行为的关键因素。具体实现细节依赖于芯片厂商。生成相关问题:§§相关问题§§1.BL1阶段如何加载和验证BL2镜像?2.如何配置efuse来启用安全启动?3.BL1阶段,CPU的初始化包括哪些步骤?4.什么是ARMTrustedFirmware启动流程(BL1BL33)?5.如何在fast_boot模式下优化启动时间?</think>### Trusted Firmware BL1启动过程详解 Trusted FirmwareBL1(Boot ROM)是启动过程的第一阶段,由芯片厂商固化在ROM中。以下是针对`fast_boot`、`efuse`和`cpu_cfg`相关细节的分析: #### 1. **BL1核心流程** - **硬件初始化**:上电后执行最小硬件初始化(时钟、内存控制器、基础外设)[^1] - **安全环境建立**:在EL3安全监控模式运行,初始化安全环境 - **镜像加载**:从存储介质加载BL2镜像(如`fdl1.bin`) - **验签机制**:使用芯片专用签名方案验证BL2完整性(如展锐平台的哈希签名)[^3] - **执行权移交**:验证通过后跳转BL2入口地址 #### 2. **关键机制解析** - **`fast_boot`加速启动**: - 跳过非必要硬件自检(如内存全量测试) - 预初始化高频时钟源(PLL提前锁定) - 采用并行加载技术(如多核协同加载镜像) - 依赖`efuse`中的预设配置减少运行时决策 - **`efuse`熔断配置**: - **安全启动控制**:`SEC_BOOT_EN`位使能签名验证[^3] - **启动模式选择**:`BOOT_MODE`字段决定加载源(eMMC/SPI Flash等) - **密钥存储**:存储根证书公钥哈希值(用于BL2签名验证) - **调试接口控制**:`DBG_DISABLE`位禁用JTAG提升安全性 - **`cpu_cfg`处理器配置**: ```c // 典型配置流程(伪代码) void bl1_cpu_init() { set_el3_exception_vectors(); // 设置异常向量表 configure_cortex_aXX_registers(); // 架构相关寄存器配置 init_core_freq(efuse_read(FREQ_SETTING)); // 基于efuse设置频率 enable_mmu(bl1_base_table); // 初始化MMU页表 set_security_extensions(efuse_read(SECURE_BOOT_EN)); // 启用TrustZone } ``` #### 3. **典型问题解决方法** - **启动卡在BL1阶段**: 1. 检查`efuse`的`BOOT_MODE`是否匹配存储介质 2. 验证BL2镜像签名与`efuse`存储的密钥是否一致[^3] 3. 确认`cpu_cfg`中内存控制器参数是否正确 - **`fast_boot`失效**: - 检测`efuse`的`FAST_BOOT_EN`位是否熔断使能 - 检查时钟源初始化时序(PLL锁定状态寄存器) - 分析启动日志确认跳过的初始化步骤 - **安全启动异常**: - 确认`efuse`的`SEC_BOOT_EN`位已熔断 - 检查BL2镜像签名工具链版本兼容性 - 验证密钥哈希是否完整烧录至`efuse`[^3] #### 4. **启动流程优化建议** - **安全加固**: - 熔断`efuse`的`DBG_DISABLE`位禁用调试接口 - 启用`efuse`中的`ANTI_ROLLBACK`计数器防版本回退 - **性能提升**: ```mermaid graph TD A[BL1启动] --> B{fast_boot使能?} B -->|是| C[跳过内存测试] B -->|否| D[全内存检测] C --> E[并行加载BL2] D --> F[串行加载BL2] ``` > **关键点**:BL1作为信任链起点,其`efuse`配置需在产线阶段完成,后期不可修改[^3]。调试阶段可通过仿真器读取`cpu_cfg`寄存器验证硬件状态。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值