ATF中bl2的启动

描述

bl2镜像将为后续镜像的加载执行相关的初始化操作,主要是内存、MMU、串口以及EL3软件运行环境的设置,并且加载bl3x的镜像到内存中。

通过查看bl2.ld.S文件可发现,bl2镜像的入口函数是bl2_entrypoint。该函数定义在bl2/aarch64/bl2_entrypoint.S文件中。该阶段的执行流程如图所示。

内存
bl2执行流程

bl2_entrypoint函数

bl2_entrypoint函数最终会触发安全监控模式调用(smc) ,通知bl1将CPU的控制权限转交给bl31,然后执行bl31。

该函数会执行

  • • 平台相关的初始化、
  • • 获取存放bl3x镜像文件的结构体变量、
  • • 解析出bl31的入口地址等。

该函数的主要内容和注释如下:

func bl2_entrypoint

            mov x20, x1                      //获取可用安全内存的起始地址

            adr x0, early_exceptions       //设定异常向量

            msr vbar_el1, x0                //将异常向量表地址写入到VBAR寄存器中

            isb

            msr daifclr, #DAIF_ABT_BIT    //使能SErrot中断

            /* 使能指令cache、栈顶地址以及数据访问权限对齐检查 */

            mov x1, #(SCTLR_I_BIT | SCTLR_A_BIT | SCTLR_SA_BIT)

            mrs x0, sctlr_el1

            orr x0, x0, x1

            msr sctlr_el1, x0

            isb

            /* 获取有效的RW内存以备bl2使用 */

              adr x0, __RW_START__                   //获取RW内存的起始地址

              adr x1, __RW_END__                     //获取RW内存的末端地址

              sub x1, x1, x0                          //计算出RW内存的大小

              bl  inv_dcache_range                   //禁止数据cache

              ldr x0, =__BSS_START__                 //获取bl2中BSS段的起始地址

              ldr x1, =__BSS_SIZE__                  //获取bl2中BSS段的大小

              bl  zeromem                              //清空BSS段中的内容

          #if USE_COHERENT_MEM

              ldr x0, =__COHERENT_RAM_START__

              ldr x1, =__COHERENT_RAM_UNALIGNED_SIZE__

              bl  zeromem

          #endif

              bl  plat_set_my_stack                  //初始化bl2运行的栈

          #if STACK_PROTECTOR_ENABLED

              bl  update_stack_protector_canary    //更新栈保护区域数据

          #endif

              mov x0, x20

              bl  bl2_early_platform_setup          //设置平台相关

              bl  bl2_plat_arch_setup                //设置架构相关

              bl  bl2_main      //跳转到BL2的主要函数执行,从该函数中跳转到bl31以及bl32或者bl33

              no_ret plat_panic_handler

          endfunc bl2_entrypoint

在bl2_entrypoint函数中, 完成bl2运行栈的初始化,配置完运行环境后 ,会调用 bl2_main函数来完成bl2对bl3x镜像的加载 ,而CPU控制权限的转移则是通过触发安全监控模式调用(smc)来实现。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分