系统上电之后首先会运行ChipRom,之后会跳转到ATF的bl1中继续执行。bl1主要初始化CPU、设定异常向量、将bl2的镜像加载到安全RAM中,然后跳转到bl2中开始运行。
bl1的主要代码存放在bl1目录中,bl1的链接文件是bl1/bl1.ld.s文件,该文件指定bl1的入口函数是bl1_entrypoint。
AArch32的该函数定义在bl1/aarch32/bl1_entrypoint.S文件中,AArch64的该函数定义在bl1/aarch64/bl1_entrypoint. S文件中。bl1的执行流程如图所示。
bl1执行流程
bl1_entrypoint函数主要完成ARMv8架构中EL3执行环境的基础初始化、设定异常向量表、加载bl2的镜像文件到内存中并进行跳转到bl2继续执行。该函数的内容如下:
func bl1_entrypoint
/* EL3级别运行环境的初始化,该函数定义在include/common/aarch64/el3_common_macros.S文
件中*/
el3_entrypoint_common
_set_endian=1
_warm_boot_mailbox=! PROGRAMMABLE_RESET_ADDRESS
_secondary_cold_boot=! COLD_BOOT_SINGLE_CPU
_init_memory=1
_init_c_runtime=1
_exception_vectors=bl1_exceptions
bl bl1_early_platform_setup //调用bl1_early_platform_setup函数完成底层初始化
bl bl1_plat_arch_setup //调用bl1_plat_arch_setup完成平台初始化
bl bl1_main //调用bl1_main函数,初始化验证模块,加载下一阶段的
image到RAM中
b el3_exit //调用el3_exit函数,跳转到下一个image(bl2)
endfunc bl1_entrypoint
el3_entrypoint_common函数执行时带入的参数包括大小端标识、属于冷启动还是重启操作、是否是从核的启动、是否需要进行内存初始化、是否需要建立C语言运行环境(栈初始化)、异常向量表地址注册等。
全部0条评论
快来发表一下你的评论吧 !