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

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

3天内不再提示

OP-TEE的内核初始化过程

麦辣鸡腿堡 来源:TrustZone 作者:TrustZone 2023-11-02 17:57 次阅读

1 OP-TEE OS的入口函数

  • • OP-TEE镜像的入口函数是在编译OP-TEE OS时通过链接文件来确定的,
  • • OP-TEE在编译时是按照optee_os/core/arch/arm/kernel/kern.ld.S文件链接生成OP-TEE OS的镜像文件,
  • • 在kern.ld.S文件中通过ENTRY宏来指定OP-TEE OS的入口函数,在OP-TEE中指定的入口函数是_start,
    • • 对于ARM32位系统,该函数定义在optee_os/core/arch/arm/generic_entry_a32.S文件中,
    • • 对于ARM64位系统而言,该函数定义在optee_os/core/arch/arm generic_entry_a64.S文件中。

2 OP-TEE的内核初始化过程

** _start会调用reset函数进入OP-TEE OS的启动过程**。

由于对称多处理(Symmetr ical Multi-Processing, SMP)架构的原因,在reset函数中会对主核和从核进行不同的启动操作,分别调用reset_primary函数和reset_secondary函数来完成。

1. reset入口函数执行内容

reset函数是主核和从核启动的第一个函数,该函数的执行流程如图所示。

图片
reset函数执行流程

进入到reset函数后, 系统会将_start的地址写入VBAR寄存器作为中断向量表的起始地址使用

在启动从核时, 从核知道会到该地址去获取应该执行代码来完成从核的启动 。整个reset函数的内容和注释如下:

LOCAL_FUNC reset , :
        UNWIND( .fnstart)
        UNWIND( .cantunwind)
            bootargs_entry              //获取启动带入的参数,主要是启动地址、device tree地址等
            /* 使能对齐检查并禁用数据和指令缓存 */
            read_sctlr r0                //读取sctlr中的数据,获取当前CPU控制寄存器中的值
        #if defined(CFG_SCTLR_ALIGNMENT_CHECK)
            orr r0, r0, #SCTLR_A       //设定对齐校验
        #else
            bic r0, r0, #SCTLR_A
        #endif
            bic r0, r0, #SCTLR_C       //关闭数据cache
            bic r0, r0, #SCTLR_I       //关闭指令cache
        #if defined(CFG_HWSUPP_MEM_PERM_WXN) && defined(CFG_CORE_RWDATA_NOEXEC)
            orr r0, r0, #(SCTLR_WXN | SCTLR_UWXN)
        #endif
            write_sctlr r0              //将r0写入到sctlr中,用于关闭cache
            isb
            /* 早期ARM核安全监控模式态的特殊配置 */
            bl  plat_cpu_reset_early   //执行CPU早期初始化
            ldr r0, =_start             //设定r0寄存器的值为_start函数的地址
            write_vbar r0                //将_start函数的地址写入VBAR寄存器中,用于启动时使用
        #if defined(CFG_WITH_ARM_TRUSTED_FW)
            b   reset_primary           //支持ATF时跳转到reset_primary中执行
        #else
              bl  get_core_pos            //判定当前CPU CORE的编号
              cmp r0, #0                   //将获得的CPU编号与0对比
              beq reset_primary           //如果当前core是主核,则使用reset_primary进行初始化
              b   reset_secondary         //如果当前core是从核,则使用reset_secondary进行初始化
          #endif
          UNWIND( .fnend)
          END_FUNC reset

plat_cpu_reset_early函数将会设定SCR寄存器中的安全标志位 ,用于标记当前CPU是处于安全世界状态中,并且将_start地址写入VBAR寄存器,用于在需要启动从核时系统能找到启动代码的入口地址,

reset_primary函数是主核启动代码的入口函数,该函数将会启动主核的基本初始化、配置运行环境,然后再开始执行唤醒从核的操作。

  • 对于从核的唤醒操作,如果系统支持PSCI,从核的唤醒是在REE OS启动时 ,发送PSCI给EL3或Monitor模式的代码来启动从核;
  • • 如果不使用PSCI,而是选择在OP-TEE中使能CFG_SYNC_BOOT_CPU,则OP-TEE会在主核启动结束后唤醒从核。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    31

    文章

    5342

    浏览量

    120301
  • 函数
    +关注

    关注

    3

    文章

    4329

    浏览量

    62590
  • 架构
    +关注

    关注

    1

    文章

    513

    浏览量

    25468
  • TEE
    TEE
    +关注

    关注

    0

    文章

    29

    浏览量

    10260
收藏 人收藏

    评论

    相关推荐

    请问Beal环境下编译OP-TEE后生成FIP需要哪些文件?

    stm32mp157d-***-bl32.dtb fip.bin但是当我使用 OP-TEE 时,我使用以下命令:fiptool 创建 --tos-fw tee
    发表于 12-05 07:06

    请问HSE op-tee是什么关系?

    我有个问题。S32G同时支持HSE和op-tee。S32G的安全加解密和证书管理是通过HSE完成的吗?op-tee 和 HSE 只是其中之一吗?有没有相关的设计文档?谢谢
    发表于 04-06 06:26

    OP-TEE无法在锁定的i.MX6UL上初始化JR怎么解决?

    imx 存储库,而 U-boot 来自主线存储库 (2023.1)在我们锁定设备之前,这似乎工作正常。锁定设备后,我们在 OP-TEE 初始化时得到以下输出(启用了一些额外的跟踪消息):E/TC:0 0
    发表于 04-17 07:31

    LINUX系统引导和初始化-LINUX内核解读

    Linux 的系统引导和初始化 ----------Linux2.4.22内核解读之一 一、 系统引导和初始化概述 相关代码(引导扇区的程序及其辅助程序,以 x86体系为例): \linux-2.4.22\arch\i386\b
    发表于 11-03 22:31 53次下载

    解析内核初始化时根内存盘的加载过程

    到内存盘中作为根盘。 当同时配置了初始化内存盘(Initail RAM Disk)时, 内核初始化时可以在安装主盘之前, 通过引导程序所加载的initrd文件建立一个内存初始化盘,
    发表于 11-08 10:40 0次下载

    uboot和内核里phy的初始化_内核里的双网络配置及phy的初始化

    uboot 和内核里 phy 的初始化,以及内核里的双网络配置及 phy 的初始化。 本文以盈鹏飞嵌入式的CoM-335x(基于AM335x)核心板及网络芯片LAN8720 为例,说明
    的头像 发表于 05-17 08:19 1.2w次阅读

    Linux内核初始化过程中的调用顺序

    所有的__init函数在区段.initcall.init中还保存了一份函数指针,在初始化内核会通过这些函数指针调用这些__init函数指针,并在整个初始化完成后,释放整个init区段(包括.init.text,.initcal
    发表于 05-12 08:40 1614次阅读

    Armlinux内核移植及系统初始化过程分析

    Armlinux内核移植及系统初始化过程分析说明。
    发表于 04-06 15:53 11次下载

    OP-TEE中安全驱动的框架

    OP-TEE中的安全驱动是OP-TEE操作安全设备的载体。 TA通过调用某个安全驱动的接口就可实现对特定安全设备的操作。安全驱动在OP-TEE中的软件框架如图22-2所示。 (其实这里,你要搞清楚
    的头像 发表于 10-30 16:04 824次阅读
    <b class='flag-5'>OP-TEE</b>中安全驱动的框架

    OP-TEE内核初始化函数调用

    generic_boot_init_primary函数内容 generic_boot_init_primary函数是OP-TEE建立系统运行环境的入口函数,该函数会进行建立线程运行空间、初始化
    的头像 发表于 11-02 18:18 754次阅读
    <b class='flag-5'>OP-TEE</b>的<b class='flag-5'>内核</b><b class='flag-5'>初始化</b>函数调用

    OP-TEE服务项的启动

    OP-TEE服务项的启动分为: service_init以及service_init_late ,需要被启动的服务项通过使用这两个宏,在编译时,相关服务的内容将会被保存到initcall1
    的头像 发表于 11-07 15:04 730次阅读

    ARM64位与ARM32位OP-TEE启动过程的差异

    进入reset中去执行OP-TEE启动,而是直接在_start函数中就完成整个启动过程, 在进行初始化操作之前会注册一个异常向量表,该异常向量表会在唤醒从核阶段被使用,当主核通知唤醒从核时,从核会查找
    的头像 发表于 11-07 15:12 776次阅读

    ATF中bl32的启动方法

    ATF中bl32的启动 bl31中的runtime_svc_init函数会初始化OP-TEE对应的服务,通过调用该服务项的初始化函数来完成OP-TEE的启动。对于
    的头像 发表于 11-07 16:32 630次阅读
    ATF中bl32的启动方法

    OP-TEE的安全存储的简介

    OP-TEE的安全存储的简介 OP-TEE的安全存储功能是OP-TEE为用户提供的安全存储机制。用户可使用安全存储功能来保存敏感数据、密钥等信息。 使用OP-TEE安全存储功能保存数据
    的头像 发表于 11-21 11:33 1066次阅读
    <b class='flag-5'>OP-TEE</b>的安全存储的简介

    OP-TEE安全存储安全文件的格式

    安全文件、dirf.db文件的数据格式和操作过程 OP-TEE的安全存储功能可满足用户保存敏感数据的需求,需要被保存的数据会被加 密保存到文件系统或RPMB分区中 。 当选择将数据保存到文件系统中
    的头像 发表于 11-21 11:49 812次阅读
    <b class='flag-5'>OP-TEE</b>安全存储安全文件的格式