TF-A中入口函数的第一个宏`el3_entrypoint_common`详细分析之一(TF-A入口分析一)


前言

TF-A (Trusted Firmware-A) 是用于支持 ARMv8-A 架构处理器的可信启动固件,用于实现安全启动和运行时安全服务。它按照不同的阶段(BL1、BL2、BL3)对固件启动过程进行了分层。在 TF-A源码中,bl1_entrypoint 函数是 BL1 (Boot Loader Stage 1) 阶段的入口点。

当系统上电或重置时,处理器会从一特定地址开始执行代码(与硬件相关)。在这个阶段,处理器处于安全模式,TF-A 的 BL1 阶段代码被加载到这个地址并开始执行。bl1_entrypoint 函数作为 BL1 阶段的入口点,负责初始化处理器、内存等硬件资源,以及加载 BL2 (Boot Loader Stage 2)阶段的代码。

可以简单理解为:当系统运行到 “bl1_entrypoint” 函数时,已经完成了对硬件平台的初始化,并且系统与硬件平台相关的差异已经抚平,准备好加载并执行 TF-A代码。

el3_entrypoint_common宏是bl1_entrypoint函数调用的第一个宏。这个宏对于整个系统的启动,起着承上启下的作用,非常重要。由于这个宏很复杂也很庞大。所以专门用两篇博文来介绍,这里是其中的第一篇。

我们调试的tf-a源码的版本基于v2.8,为了使用qemu调试TF-A,选择fvp模拟器作为硬件平台。编译指令如下:
make CROSS_COMPILE=aarch64-linux-gnu- PLAT=fvp CPU=cortex-a57 TARGET=all DEBUG=1

1、el3_entrypoint_common

.macro el3_entrypoint_common					\
	_init_sctlr, _warm_boot_mailbox, _secondary_cold_boot,	\
	_init_memory, _init_c_runtime, _exception_vectors,	\
	_pie_fixup_size

el3_entrypoint_common 宏定义了在 EL3(最高安全级别-安全监视器级别)执行代码的通用入口点,并且系统在到达 EL3 时会立即跳到这里。该宏定义了一个集合,其中包含在 EL3 中冷启动或热启动期间需要执行的所有操作。其目的是统一管理系统的启动,并且允许在不同的平台上使用相同的代码,从而简化开发过程。

EL3 是 ARMv8 架构的最高特权级别,通常用于处理安全相关的任务,如引导程序和可信固件。

这个宏有三个必需的操作:执行复位处理、架构初始化和堆栈设置。其余操作则是可选的,可以由参数设置允许"启用"/"禁用"某些操作。
里面的参数说明:

  • _init_sctlr:指定是否初始化寄存器SCTLR(System Control Register)。
  • _warm_boot_mailbox: 冷启动和热启动分支处理,PROGRAMMABLE_RESET_ADDRESS 宏表示系统的复位地址,为0可能是冷启动(运行程序中会进一步判断),不为0则是热启动。
  • _secondary_cold_boot:指定是否为单个 CPU 进行冷启动,如果是 COLD_BOOT_SINGLE_CPU 则表示是单个 CPU 进行冷启动。
  • _warm_boot_mailbox_init_memory:指定是否初始化内存。
  • _init_c_runtime:指定是否初始化 C 运行时。
  • _exception_vectors:指定异常向量的入口点,在本例中是 bl1_vector_table
  • _pie_fixup_size:指定 PIE 修复大小,在本例中是 0。

_pie_fixup_size=0,说明程序中没有使用额外的指令来确保代码可以正确地定位,那么程序的加载和执行将遵循传统方式,每个代码段都有一个确定的地址。

源码中宏的执行:

func bl1_entrypoint
	el3_entrypoint_common					\
		_init_sctlr=1					\
		_warm_boot_mailbox=!PROGRAMMABLE_RESET_ADDRESS	\
		_secondary_cold_boot
<think>嗯,用户想了解关于el3_entrypoint_common的技术信息和代码实现,特别是在ARM架构下的实现。首先,我需要回忆下之前提供的引用内容。引用[1]提到el3_entrypoint_common是,位于el3_common_macros.S文件中,主要负责EL3级别的初始化工作,比如设置C运行环境、异常向量表和CPU安全环境。引用[2]和[3]讨论了BL2在EL3运行的情况以及OP-TEE的启动流程,这可能与入口函数有关联。 用户可能需要详细的实现步骤或者代码结构。根据引用[1],这个包含几个关键部分,比如_init_sctlr、_init_global_data等。我应该分步骤解释每个部分的作用,比如设置系统控制寄存器、初始化全局数据、设置异常向量表等。同时,需要结合ARM架构EL3特性,比如安全状态和异常处理。 另外,用户可能对代码示例感兴趣,但根据引用中的代码片段,可能没有直接的el3_entrypoint_common代码,但可以描述其结构。比如使用汇编定义,展开各个初始化函数。还需要注意是否需要提到不同启动流程,如BL1跳转到BL2的情况,如引用[2]所述。 可能还需要解释EL3的重要性,比如在ARM TrustZone中的作用,负责安全世界的初始化。引用[3]中的OP-TEE启动流程可能展示了EL3如何切换到Secure EL1,这可以作为EL3入口函数执行后的下步操作。 用户的问题可能还涉及相关技术点,比如如何设置系统寄存器、异常向量表的具体内容,或者如何初始化堆栈。因此,在回答中需要覆盖这些方面,并确保使用正确的LaTeX格式,如$EL3$、$SCTLR_EL3$等。 最后,根据用户要求生成相关问题,可能需要包括性能优化、异常处理、调试方法等。确保问题与EL3入口实现相关,帮助用户深入理解。</think>根据技术文档和ARM Trusted Firmware(ARM-TF)的实现分析,$EL3\_entrypoint\_common$是ARMv8架构EL3安全启动阶段的核心初始化例程,主要功能包括: 1. **系统寄存器初始化** - 设置$SCTLR_EL3$系统控制寄存器,禁用MMU和缓存 $$ SCTLR_EL3.M = 0 \quad (MMU关闭) $$ $$ SCTLR_EL3.C = 0 \quad (数据缓存关闭) $$ $$ SCTLR_EL3.I = 0 \quad (指令缓存关闭) $$ 2. **运行时环境构建** - 初始化C语言运行所需的栈指针$SP\_EL3$ - 建立.bss段的零初始化 - 配置全局数据结构,如`bl_params`链表[^1] 3. **安全扩展配置** ```assembly // 示例代码结构 .macro el3_entrypoint_common _init_sctlr _init_global_data _setup_stack _init_exceptions _bl1_copy_bl2_image _set_cpu_secure_context .endm ``` 4. **异常处理基础** - 安装EL3异常向量表 - 配置IRQ/FIQ路由策略 - 设置安全监视器调用(SMC)处理框架 该实现位于ARM-TF代码库的`el3_common_macros.S`文件中,其执行路径为: 冷启动 → Boot ROM → BL1 → EL3_entrypoint_common → BL2镜像加载[^2]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值