0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

ATF中bl2的启动

麦辣鸡腿堡 来源:TrustZone 作者:TrustZone 2023-11-07 15:59 次阅读

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)来实现。

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

    关注

    134

    文章

    8651

    浏览量

    361816
  • 内存
    +关注

    关注

    8

    文章

    2767

    浏览量

    72765
  • 镜像
    +关注

    关注

    0

    文章

    153

    浏览量

    10589
收藏 人收藏

    评论

    相关推荐

    【NanoPi M2试用体验】+SD卡启动BL1拷贝BL2到DDR2运行

    裸机程序SD卡启动BL1拷贝BL2到DDR2运行;代码的拷贝会用到一些指针函数,第一个参数为SD卡存放
    发表于 06-11 17:03

    关于TF-A(ATF)固件的基本知识详解

    ATF定义的启动模型ATF将镜像进行了划分,BL1 BL2属于启动引导镜像,
    发表于 06-15 16:57

    STM32MP157构建Yocto-Linux卡在TF-A 引导 - BL2怎么解决?

    SDMMCINFO:Instance 1INFO: Boot used partition fsbl1NOTICE:BL2: v2.2-r1.0(debug):v2.2-dirtyNOTICE:BL2: Built
    发表于 01-17 08:29

    如何在BL2配置DDR init?

    :2022 年 10 月 25 日 18:55:21错误:BL2:加载图像失败(-2)身份验证失败我认为我们必须更改 atf\plat\nxp\soc-ls1046\ls1046ardb\ddr_init.c
    发表于 03-24 08:50

    S32g如何在ATF启用安全启动

    /cortexa53-wrs-linux/atf-s32g/2.5-r0/build/batman/release /bl2/bl2_main.o:在函数“bl2_main”
    发表于 04-03 07:12

    Yocto LS1028定制板用BL2,为了使DDR工作是否需要编辑ddr_init.c的任何其他函数/值或ATF的任何其他文件??

    的下一步是创建一个自定义 BL2,用于启动基于 kirkstone 版本的 yocto 编译。 为此,我修补了 atf repo 的 ddr_init.c 文件,这个“ddr_cfg_regs”结构
    发表于 06-01 09:03

    TF-A的不同启动阶段有哪些

    不同的启动阶段,按照链式结构依次启动ATF 代码启动流程如图所示: 当芯片复位以后首先运行 bl1 代码,
    的头像 发表于 09-11 16:54 482次阅读
    TF-A的不同<b class='flag-5'>启动</b>阶段有哪些

    ATF启动流程介绍

    一、BL32(TEE OS)的准备 ATF启动流程 ATF流程 ATF启动实现分为5个步骤:
    的头像 发表于 11-02 17:51 552次阅读
    <b class='flag-5'>ATF</b><b class='flag-5'>启动</b>流程介绍

    启动(Cold boot)流程及阶段划分

    restart--冷启动 reset--热启动 ATF启动实现分为5个步骤: • BL1 - AP Trusted ROM,一般为Boot
    的头像 发表于 11-07 15:17 768次阅读
    冷<b class='flag-5'>启动</b>(Cold boot)流程及阶段划分

    ATF启动过程介绍

    ATF启动过程根据ARMv8的运行模式(AArch32/AArch64)会有所不同,但基本一致。 在AArch32中是不会去加载bl31而是将EL3或者Monitor模式的运行代码保存在bl
    的头像 发表于 11-07 15:48 481次阅读
    <b class='flag-5'>ATF</b>的<b class='flag-5'>启动</b>过程介绍

    code层面 ATFbl1的启动

    系统上电之后首先会运行ChipRom,之后会跳转到ATFbl1中继续执行。bl1主要初始化CPU、设定异常向量、将bl2的镜像加载到安全RAM中,然后跳转到
    的头像 发表于 11-07 15:53 311次阅读
    code层面 <b class='flag-5'>ATF</b>中<b class='flag-5'>bl</b>1的<b class='flag-5'>启动</b>

    ATF中如何用函数完成bl2启动

    bl2_main函数 bl2_main函数完成了bl2阶段的主要操作,包括 • 对下一个阶段镜像文件的解析、 • 获取入口地址和镜像文件大小等信息, • 然后对镜像文件进行验签和加载操作
    的头像 发表于 11-07 16:04 272次阅读

    ATFbl2bl31的跳转介绍

    bl2bl31的跳转 在bl2_main函数中最终会调用smc(BL1_SMC_RUN_IMAGE,(unsigned long)next_bl
    的头像 发表于 11-07 16:09 344次阅读

    ATFbl32的启动方法

    ATFbl32的启动 bl31中的runtime_svc_init函数会初始化OP-TEE对应的服务,通过调用该服务项的初始化函数来完成OP-TEE的
    的头像 发表于 11-07 16:32 233次阅读
    <b class='flag-5'>ATF</b>中<b class='flag-5'>bl</b>32的<b class='flag-5'>启动</b>方法

    uboot的启动BL1和BL2两个阶段介绍

    之前对这个uboot的源码了解有些许遗忘。最近做AVB校验,需要uboot到kernel的这个过程。这里再复习一下。 与大多数BootLoader一样,uboot的启动过程分为BL1和BL2两个阶段
    的头像 发表于 12-04 17:53 861次阅读