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

文章详细介绍了TF-A源码中主CPU冷启动、内存初始化、C运行时环境的设置以及堆栈指针SP_EL0的配置过程,特别是如何通过plat_set_my_stack分配堆栈空间,确保多核环境下每个CPU有独立栈空间。

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


前言

在 TF-A源码中,bl1_entrypoint 函数是 BL1 (Boot Loader Stage 1) 阶段的入口点。
可以简单理解为:当系统运行到 “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

7、 主CPU或辅助CPU的冷启动(参数:_secondary_cold_boot=!COLD_BOOT_SINGLE_CPU)

当系统进入冷启动后,需要检查此cpu是主cpu还是辅助cup,

	.if \_secondary_cold_boot
	/* -------------------------------------------------------------
	 * 检查这是主CPU还是辅助CPU的冷启动。
	 * 主CPU将设置平台,而辅助CPU将处于特定于平台的状态,直到主CPU执行
	 * 使它们脱离该状态并允许进入操作系统的必要操作。
	 * -------------------------------------------------------------
	 */
		bl	plat_is_my_cpu_primary
		cbnz	w0, do_primary_cold_boot

		/* This is a cold boot on a secondary CPU */
		bl	plat_secondary_cold_boot_setup
		/* plat_secondary_cold_boot_setup() is not supposed to return */
		bl	el3_panic

	do_primary_cold_boot:
	.endif /* _secondary_cold_boot */

上面的代码首先使用 plat_is_my_cpu_primary 函数来检查处理器是否为主处理器。如果是主处理器,则跳转到 do_primary_cold_boot 标号,程序继续执行。否则,表示它是次要处理器的冷启动,将调用 plat_secondary_cold_boot_setup 函数来初始化辅助cpu,如果这个函数执行不出现错误,会执行辅助cpu后期操作,不再返回(执行辅助cpu代码不在本文讨论范围,留在后期讨论)。如果返回,则说明系统出现错误,调用 el3_panic 函数抛出异常错误。

8、 主CPU初始化内存(参数:_init_memory=1)

	/* ---------------------------------------------------------------------
	 现在初始化内存。辅助CPU初始化不会到达这一点。
	 * ---------------------------------------------------------------------
	 */

	.if \_init_memory
		bl	platform_mem_init
	.endif /* _init_memory */

“platform_mem_init” 函数的实现与具体的硬件平台有关。每个硬件平台的内存构造和资源可能不同,因此 “platform_mem_init” 函数的实现也可能不同。例如,在一个平台上,“platform_mem_init” 函数可能需要配置内存分配池,并将某些内存区域映射到系统存储器中,而在另一个平台上,“platform_mem_init” 函数可能仅需要配置缓存和数据换出。

在数据换出技术中,系统管理器会监视系统内存使用情况,并在必要时将不常使用的数据从内存中换出到磁盘中。这样,系统就可以释放内存空间,以便其他应用程序或进程可以使用。当应用程序或进程再次需要这些数据时,系统管理器会将其从磁盘中换入内存中。

9、 初始化C运行时环境(参数:_init_c_runtime=1)


/* ---------------------------------------------------------------------
 * 初始化C运行时环境:
 *   - 将NOBITS部分初始化为零。它们有两个:
 *       - .bss部分;
 *       - 一致的内存部分(如果有的话)。
 *   - 如果需要,将数据部分从ROM复制到RAM。
 * ---------------------------------------------------------------------
 */
	.if \_init_c_runtime
#if defined(IMAGE_BL31) || (defined
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值