6. ATF(ARM Trusted firmware)启动---bl32(OP-TEE)

本文详细介绍了OP-TEE(Optee OS)在BL31中的初始化流程,包括opteed_setup、opteed_init和opteed_enter_sp三个关键步骤。在opteed_setup中,获取并初始化OP-TEE的入口信息;opteed_init则在所有服务初始化后调用,准备进入OP-TEE;最后,opteed_enter_sp负责跳转到OP-TEE镜像执行。整个过程涉及CPU上下文的保存和恢复,确保安全世界与正常世界的交互。

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

在bl31中的runtime_svc_init函数会初始化OP-TEE对应的service,通过调用该service的init函数来完成OP-TEE的启动。

1. opteed_setup

OP-TEE的service通过DECLARE_RT_SVC宏在编译的时候被存放到了rt_svc_des段中。启动该段中的init成员会被初始化成opteed_setup函数,该函数的内容如下:

 

int32_t opteed_setup(void)
{
	entry_point_info_t *optee_ep_info;
	uint32_t linear_id;
 
	linear_id = plat_my_core_pos();
 
	/*
	 * Get information about the Secure Payload (BL32) image. Its
	 * absence is a critical failure.  TODO: Add support to
	 * conditionally include the SPD service
	 */
/* 获取bl32(OP-TEE)镜像的描述信息 */
	optee_ep_info = bl31_plat_get_next_image_ep_info(SECURE);
	if (!optee_ep_info) {
		WARN("No OPTEE provided by BL2 boot loader, Booting device"
			" without OPTEE initialization. SMC`s destined for OPTEE"
			" will return SMC_UNK\n");
		return 1;
	}
 
	/*
	 * If there's no valid entry point for SP, we return a non-zero value
	 * signalling failure initializing the service. We bail out without
	 * registering any handlers
	 */
	if (!optee_ep_info->pc)
		return 1;
 
	/*
	 * We could inspect the SP image and determine it's execution
	 * state i.e whether AArch32 or AArch64. Assuming it's AArch32
	 * for the time being.
	 */
	opteed_rw = OPTEE_AARCH64;
/* 初始化CPU的smc上下文 */
	opteed_init_optee_ep_state(optee_ep_info,
				opteed_rw,
				optee_ep_info->pc,
				&opteed_sp_context[linear_id]);
 
	/*
	 * All OPTEED initialization done. Now register our init function with
	 * BL31 for deferred invocation
	 */
/* 使用Opteed_init初始化bl32_init变量,以备在bl31中调用 */
	bl31_register_bl32_init(&opteed_init);
 
	return 0;
}


2. opteed_init

 

该函数将会在bl31中的所有service执行完init操作之后,通过执行存放在bl32_init变量中的函数指针来实现调用。该函数调用之后会进入到OP-TEE OS的初始化阶段。

 

static int32_t opteed_init(void)
{
	uint32_t linear_id = plat_my_core_pos();
	optee_context_t *optee_ctx = &opteed_sp_context[linear_id];
	entry_point_info_t *optee_entry_point;
	uint64_t rc;
 
	/*
	 * Get information about the OPTEE (BL32) image. Its
	 * absence is a critical failure.
	 */
/* 获取OPTEE image的信息 */
	optee_entry_point = bl31_plat_get_next_image_ep_info(SECURE);
	assert(optee_entry_point);
 
/* 使用optee image的entry point信息初始化cpu的上下文 */
	cm_init_my_context(optee_entry_point);
 
	/*
	 * Arrange for an entry into OPTEE. It will be returned via
	 * OPTEE_ENTRY_DONE case
	 */
/* 开始设置CPU参数,最终会调用opteed_enter_sp函数执行跳转到OPTEE的操作 */
	rc = opteed_synchronous_sp_entry(optee_ctx);
	assert(rc != 0);
 
	return rc;
}


3. opteed_enter_sp

 

opteed_entr_sp函数完成跳转到OP-TEE image进行执行的操作,该函数中将会保存一些列的寄存器值,设定好堆栈信息,然后通过调用el3_eixt函数来实现跳转操作

 

func opteed_enter_sp
	/* Make space for the registers that we're going to save */
	mov	x3, sp
	str	x3, [x0, #0]
	sub	sp, sp, #OPTEED_C_RT_CTX_SIZE
 
	/* Save callee-saved registers on to the stack */
	stp	x19, x20, [sp, #OPTEED_C_RT_CTX_X19]
	stp	x21, x22, [sp, #OPTEED_C_RT_CTX_X21]
	stp	x23, x24, [sp, #OPTEED_C_RT_CTX_X23]
	stp	x25, x26, [sp, #OPTEED_C_RT_CTX_X25]
	stp	x27, x28, [sp, #OPTEED_C_RT_CTX_X27]
	stp	x29, x30, [sp, #OPTEED_C_RT_CTX_X29]
 
	/* ---------------------------------------------
	 * Everything is setup now. el3_exit() will
	 * use the secure context to restore to the
	 * general purpose and EL3 system registers to
	 * ERET into OPTEE.
	 * ---------------------------------------------
	 */
	b	el3_exit	//使用设定好的安全CPU上下文,退出EL3进入OPTEE
endfunc opteed_enter_sp
<think>好的,我现在需要回答用户关于U-Boot与Arm Trusted Firmware (ATF)集成和使用的问题。首先,用户之前提到了ATF的概述,所以我要确保内容与之前的引用相关,并且正确引用。 首先,我应该解释U-Boot和ATF启动流程中的角色。ATF作为安全世界的固件,负责初始化安全环境,处理异常级别切换,而U-Boot通常运行在非安全世界,负责引导操作系统。需要说明它们如何协同工作,比如ATF在EL3执行,然后将控制权交给U-Boot,这可能是在EL2或EL1。 接下来,集成步骤是关键。用户可能需要知道如何将U-Boot与ATF结合使用。这涉及到编译ATF时指定U-Boot作为BL33,以及编译U-Boot时可能需要禁用某些安全相关的功能,因为ATF已经处理了这些。需要检查编译命令,比如make命令的参数,确保正确指定平台和fip选项。 然后是启动流程的详细步骤,从BL1到BL2,再到BL31和BL33(U-Boot)。需要明确每个阶段的作用,例如BL1进行初始化和加载后续镜像,BL31作为运行时服务,处理安全监控。 调试与日志部分,用户可能需要知道如何获取调试信息,比如ATF的DEBUG选项和U-Boot的早期调试输出。此外,内存布局的配置也很重要,确保ATF和U-Boot的内存区域不冲突。 安全扩展方面,需要提到PSCI和SPD,比如OP-TEE作为安全分区的情况。这些是ATF提供的功能,U-Boot通过SMC调用与之交互。 最后,生成相关问题需要考虑用户可能的后续疑问,比如启动顺序、内存冲突解决、调试方法、安全功能实现等。 需要确保所有技术细节准确,比如编译命令的正确性,启动流程的阶段顺序,以及引用之前的资料正确。同时,使用正确的中文术语,避免翻译错误,并按照格式要求使用LaTeX公式(虽然这里可能不太需要,但如果有数学表达式的话)。还要检查是否有遗漏的步骤或常见问题,帮助用户全面理解集成过程。</think>### U-Boot与Arm可信固件(ATF)集成与使用方法 #### 一、基础架构关系 1. **启动层次划分**: - ATF提供BL1/BL2/BL31阶段实现,负责安全启动链建立 - U-Boot通常作为BL33(非安全世界引导加载程序)运行 - 典型启动顺序: $$BL1 \rightarrow BL2 \rightarrow BL31 \rightarrow BL33(U-Boot) \rightarrow OS$$ 2. **异常级别控制**: - ATF在EL3实现安全监控器 - U-Boot默认运行在EL2(非安全世界) - 模式切换通过SMC指令完成[^1] #### 二、具体集成步骤 1. **ATF编译配置**: ```makefile make PLAT=<平台名> BL33=<u-boot.bin路径> all fip ``` 需指定`BL33`参数指向U-Boot二进制文件 2. **U-Boot特殊配置**: ```bash # 禁用内置安全扩展 make <平台_defconfig> CONFIG_ARMV8_SEC_FIRMWARE_SUPPORT=n ``` 3. **镜像打包示例**: ```bash # 生成组合固件 tools/fiptool/fiptool create --tb-fw bl31.bin --soc-fw bl31.bin --tos-fw tee.bin --nt-fw u-boot.bin fip.bin ``` #### 三、启动流程详解 1. BL1阶段: - 初始化安全硬件环境 - 验证BL2镜像签名 - 加载BL2到安全内存 2. BL31阶段: - 建立非安全世界上下文 - 配置系统寄存器隔离安全域 - 通过`bl31_main`跳转到U-Boot入口点 #### 四、调试与日志 1. ATF调试输出: ```c make DEBUG=1 PLAT=<平台> ... # 启用调试日志 ``` 2. U-Boot早期调试: ```c #define CONFIG_DEBUG_UART # 启用串口输出 ``` #### 五、内存布局配置 ```c // ATF内存映射示例 #define BL31_BASE 0x80000000 #define BL31_LIMIT 0x8001FFFF #define BL33_BASE 0x82000000 // U-Boot加载地址 ``` #### 六、安全服务扩展 1. **PSCI实现**: - U-Boot通过SMC调用ATF的电源管理服务 - 支持CPU热插拔、系统复位等操作 2. **SPD框架**: ```c // OP-TEE集成示例 declare_spd(opteed, OPTEE_SPD); // 在ATF中注册安全分区 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值