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

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

3天内不再提示

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

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

generic_boot_init_primary函数内容

generic_boot_init_primary函数是OP-TEE建立系统运行环境的入口函数,该函数会进行建立线程运行空间、初始化OP-TEE内核组件等操作。该函数的执行流程如图所示。

图片
generic_boot_init_primary函数执行流程

generic_boot_init_primary函数会调用init_primary_helper函数来完成系统运行环境的建立 ,如果系统支持ATF,则该函数会返回OP-TEE的处理句柄,该处理句柄主要包含

  • • 各种安全监控模式调用的处理函数、
  • • 安全世界状态(SWS)的中断
  • • 以及其他事件的处理函数,

ATF中的bl31解析完安全监控模式调用或中断请求后会在安全世界状态调用该处理句柄来处理对应的事件。

init_primary_helper函数的主要内容如下:

static void init_primary_helper(unsigned long pageable_part,
                        unsigned long nsec_entry, unsigned long fdt)
        {
            thread_set_exceptions(THREAD_EXCP_ALL); //设置支持哪些异常处理
            init_vfp_sec();                             //初始化浮点运算(根据实际需要考虑是否开启)
            //初始化各种memory,清空BSS段,分配TA运行时的memory
            init_runtime(pageable_part);
            /* 初始化TEE中支持的线程栈、异常处理、pagetable */
            thread_init_primary(generic_boot_get_handlers());
            //初始化每个CPU的monitor态的处理方式,如果支持ATF,则无需该操作
            thread_init_per_cpu();
            /* 如果系统不支持ATF,则需要配置在Linux内核中monitor的处理方式 */
            init_sec_mon(nsec_entry);
            /* 初始化device tree */
            init_fdt(fdt);
            /* 初始化中断控制器 */
            main_init_gic();
            /* 初始化非安全侧的浮点运算 */
            init_vfp_nsec();
            /* 初始化共享内存并执行存放在__initcall_start段的其他初始化函数 */
            if (init_teecore() ! = TEE_SUCCESS)
                panic();
            DMSG("Primary CPU switching to normal world bootn");
        }

init_primary_helper函数最后会调用init_teecore来完成OP-TEE内核的初始化 ,在init_teecore函数中会设定共享内存、系统时间,然后再返回去执行OP-TEE镜像文件中的_initcall段中的内容来启动系统的服务以及安全驱动的挂载。

call_initcalls函数

init_teecore函数通过调用call_initcalls来 启动系统的服务以及安全驱动的挂载 ,该函数的内容如下:

static void call_initcalls(void)
        {
            initcall_t *call;
            /* 遍历并执行_initcallx段中所有函数 */
            for (call = &__initcall_start; call < &__initcall_end; call++) {
                TEE_Result ret;
                  ret = (*call)();
                  if (ret ! = TEE_SUCCESS) {
                      EMSG("Initial call 0x%08" PRIxVA " failed",
                          (vaddr_t)call);
                  }
              }
          }

在执行call_initcalls函数之前,系统已完成了 memory、CPU相关设置、中断控制器、共享内存、线程堆栈设置、TA运行内存的分配等操作

call_initcalls是通过遍历OP-TEE镜像文件的_initcall段中从_initcall_start到_initcall_end之间的所有函数来完成启动服务和驱动的挂载操作。

OP-TEE镜像文件中** _initcalls段的内容是通过使用__define_initcall宏来告知编译器的**,在编译时会将使用该宏定义的函数保存到OP-TEE镜像文件的_initcall段中。该宏定义如下:

#define __define_initcall(level, fn) 
            static initcall_t __initcall_##fn __attribute__((used)) 
            __attribute__((__section__(".initcall" level))) = fn
  • • initcall_t:是一个函数指针类型(typedef int(*initcall_t)(void))。
  • attribute (( section ()):将fn对象放在一个由括号中的名称指定的section中。
  • • ##:连接作用。

例如,如果使用该宏如下:

__define_initcall("1", init_operation)

则该宏的作用是声明一个名称为__initcall_init_operation的函数指针,将该函数指针初始化为init_operation,并在编译时将该函数的内容存放在名称为“.initcall1”的段中。

core/arch/arm/kernel/kern.ld.S文件中存在如下内容:

__initcall_start = .;
        KEEP(*(.initcall1))
        KEEP(*(.initcall2))
        KEEP(*(.initcall3))
        KEEP(*(.initcall4))
        __initcall_end = .;

即在__initcall_start到__initcall_end之间保存的是initcall1到initcall4之间的内容,而在整个OP-TEE源代码的core/include/initcall.h文件中,__define_initcall宏被使用的情况如下:

#define __define_initcall(level, fn) 
        #define service_init(fn)            __define_initcall("1", fn)
        #define service_init_late(fn)      __define_initcall("2", fn)
        #define driver_init(fn)             __define_initcall("3", fn)
        #define driver_init_late(fn)       __define_initcall("4", fn)

所以遍历执行从__initcall_start到__initcall_end之间的内容就是启动OP-TEE的服务以及完成安全驱动的挂载。

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

    关注

    3

    文章

    1309

    浏览量

    39846
  • TEE
    TEE
    +关注

    关注

    0

    文章

    28

    浏览量

    10146
  • 函数调用
    +关注

    关注

    0

    文章

    19

    浏览量

    2554
收藏 人收藏

    评论

    相关推荐

    arm调用c函数初始化失败

    问题 编写了一个串口初始化文件uart.c 含有 uart0_init() 初始化函数,以及一个测试函数print() 通过调用uart0_
    发表于 03-21 07:45

    如何初始化函数? 如何从代码配置器调用函数

    我有一个关于如何从代码配置器初始化函数的问题,我如何从代码配置器调用函数?我相信我有正确的代码配置选项。只需要帮助初始化
    发表于 10-15 09:38

    请问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内核初始化过程中的调用顺序

    所有的__init函数在区段.initcall.init中还保存了一份函数指针,在初始化内核会通过这些函数指针
    发表于 05-12 08:40 1492次阅读

    UCOS2系统内核讲述(二)_ 初始化调用函数

    UCOS2系统内核讲述(二)_初始化调用函数
    的头像 发表于 03-25 09:57 1540次阅读
    UCOS2系统<b class='flag-5'>内核</b>讲述(二)_ <b class='flag-5'>初始化</b><b class='flag-5'>调用</b><b class='flag-5'>函数</b>

    OP-TEE中安全驱动的框架

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

    OP-TEE内核初始化过程

    /arch/arm generic_entry_a64.S文件中。 2 OP-TEE内核初始化过程 ** _star
    的头像 发表于 11-02 17:57 476次阅读
    <b class='flag-5'>OP-TEE</b>的<b class='flag-5'>内核</b><b class='flag-5'>初始化</b>过程

    reset_primary函数的执行流程

    reset_primary函数OP-TEE对CPU主核进行初始化操作的函数,该函数初始化
    的头像 发表于 11-02 18:06 292次阅读
    reset_primary<b class='flag-5'>函数</b>的执行流程

    OP-TEE服务项的启动

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

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

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

    ATF中bl32的启动方法

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

    OP-TEE的安全存储的简介

    时,OP-TEE会对需要被保存的数据进行加密,且每次更新安全文件时所用的加密密钥都会使用随机数重新生成,用户只要调用GP标准中定义的安全存储相关接口就能使用OP-TEE的安全存储功能对私有数据进行保护。 需要被保护的数据被
    的头像 发表于 11-21 11:33 350次阅读
    <b class='flag-5'>OP-TEE</b>的安全存储的简介

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

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