在bl2中触发安全监控模式调用后会跳转到bl31中执行,bl31最主要的作用是 建立el3运行态的软件配置 , 在该阶段会完成各种类型的安全监控模式调用id的注册和对应的arm核状态的切换 ,bl31运行在el3。bl31的执行流程如图所示。
在这里插入图片描述
bl31_entrypoint函数通过bl31.ld.s文件可知,bl31的入口函数是bl31_entrypoint。该函数的内容如下:
func bl31_entrypoint /* el3初始化操作,该el3_entrypoint_common函数在上面已经介绍过,其中runtime_exceptions为 el3 runtime software的异常向量表,内容定义在bl31/aarch64/runtime_exceptions.s文件中 */ #if ! reset_to_bl31 mov x20, x0 mov x21, x1 el3_entrypoint_common _set_endian=0 _warm_boot_mailbox=0 _secondary_cold_boot=0 _init_memory=0 _init_c_runtime=1 _exception_vectors=runtime_exceptions mov x0, x20 mov x1, x21 #else 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=runtime_exceptions mov x0, 0 mov x1, 0 #endif /* reset_to_bl31 */ bl bl31_early_platform_setup //平台架构相关的初始化设置 bl bl31_plat_arch_setup //执行aarch初始化 bl bl31_main //跳转到bl31_main函数,执行该阶段需要的主要操作 adr x0, __data_start__ //获取ree镜像的data段的起始地址 adr x1, __data_end__ //获取ree镜像的data段的末端地址 sub x1, x1, x0 //计算镜像文件的大小 bl clean_dcache_range //清空数据cache adr x0, __bss_start__ //获取bss段的起始地址 adr x1, __bss_end__ //获取bss端的末端地址 sub x1, x1, x0 //计算bss段的长度 bl clean_dcache_range //清空数据cache //执行完成将跳转到bl33中执行,即执行bootloader b el3_exit endfunc bl31_entrypointbl31_main函数该函数主要完成必要的初始化操作, 注册el3中各种安全监控模式调用的处理函数 ,以便在启动完成后响应在ree侧和tee侧产生的安全监控模式调用。该函数的内容如下:
void bl31_main(void) { bl31_platform_setup(); //初始化相关驱动、时钟等 bl31_lib_init(); //用于执行bl31软件中相关全局变量的初始化 /*初始化el3中的service,通过在编译时指定特定的section来确定哪些service会被作为el3 service*/ runtime_svc_init(); /* 如果注册了tee os支持,在调用完成run_service_init之后会使用tee os的入口函数初 始化bl32_init变量,然后执行对应的init函数,以op-tee为例,bl32_init将会被初始化成 opteed_init,到此将会执行opteed_init函数来进入op-tee os的启动,当op-tee os启动完 后,将会产生一个teesmc_opteed_return_entry_done的smc异常,通知bl31已经完成了op- tee的启动*/ if (bl32_init) { info(bl31: initializing bl32n); (*bl32_init)(); } //准备跳转到bl33,在执行runtime_service时会运行一个spd service,该service的初始化 函数将会去执行bl32的镜像来完成tee os初始化 bl31_prepare_next_image_entry(); console_flush(); bl31_plat_runtime_setup(); }runtime_svc_init函数会将各种安全监控模式调用的处理函数的指针注册到el3中,
并通过service->init函数来进行初始化,将tee os镜像的入口函数赋值给bl32_init,通过执行bl32_init指向的函数进入到tee os的启动过程。
待tee os启动完成之后就会去查找bl33的镜像文件,即ree侧的镜像文件,开始进入ree侧镜像的启动。
两款高低温双限控制器电路图详解
运放中容性负载该怎么处理?
OPPO Find9最新渲染图曝光,仅屏占比就虐哭三星S8!
在新基建的背景下,人工智能产业将迎来怎样的市场机遇?
医用超声波清洗机的适用范围
ATF中bl31的启动
led灯泡规格
采用高时钟频率的FPGA实现高速运动物体测速系统的设计
产学研交流—哈工大田艳红教授一行到访翠展微
南京智慧路灯机器人上岗,闯红灯会发出告警
如何削减伺服电机的发热
监控系统的各类故障现象、原因及解决方法
工业RFID应用之技术篇(八),RFID读卡器的通信方式
Linux发行版不会效仿Win11
ADI与Linear合并对电源管理IC市场有何影响
新的陶瓷护罩应使所有iPhone 12型号至少比其前任更耐用
【阿里平头哥】无需从0开发 1天上手蓝牙Mesh应用方案
压力传感器
Linux可以提供的功能通常是通过哪些命令来实现的?
新能源汽车电设施后劲不足 需要打造充换电智能网络