OP-TEE笔记之TEECORE的启动过程

TEECORE的启动代码在路径/optee_os/core/arch/arm/tee/下的init.c,我们来分段解读以下:

#define TEE_MON_MAX_NUM_ARGS 8

首先定义了一个宏来设定TEE的最大参数个数

extern  __initcall_start, __initcall_end;

外部链接的数据类型initcall_t的两个变量指针,用于指向初始化调用的起始地址和终止地址。

static void call_initcalls(void)
{
    initcall_t *call;

    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); } } }

使用此函数对内核调用进行初始化,若初始化失败,则返回出错信息,并指出出错的内核调用地址,若调用初始化成功则返回TEE__SUCCESS。

TEE_Result init_teecore(void)
{
    static int is_first = 1;

    /* (DEBUG) for inits at 1st TEE service: when UART is setup */
    if (!is_first)
        return TEE_SUCCESS;
    is_first = 0;

设置标志位is_first标识TEECORE是否被初始化过,即此方法只能执行一次。

 tee_svc_uref_base = CFG_TEE_LOAD_ADDR;

将TEE的所在地址赋值给tee_svc_uref_base

    /* init support for futur mapping of TAs */
    tee_mmu_kmap_init();
    teecore_init_pub_ram();

    /* time initialization */
    time_source_init();

    /* call pre-define initcall routines */
    call_initcalls();

    IMSG("teecore inits done");
    return TEE_SUCCESS;
}

你可能感兴趣的:(数据)