optee的启动

本文详细解析了Optee在ATF中的启动过程,从_kern.ld.S文件找到入口函数_start,并逐步深入到arm32和arm64的入口函数。启动过程中涉及DTB传递、内存管理、初始化、MMU启用等多个关键步骤,最终通过SMC返回到ATF。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

optee是从ATF中启动的,是作为一个svc来启动,启动玩后在optee中又通过smc返回到ATF中.
从core/arch/arm/kernel/kern.ld.S 中可以发现optee的入口,这也是个通用的规律,即从lds文件中找到入口函数

OUTPUT_FORMAT(CFG_KERN_LINKER_FORMAT)
OUTPUT_ARCH(CFG_KERN_LINKER_ARCH)

ENTRY(_start)

这里可以知道入口是_start,针对arm32的函数在entry_a32.S 中,针对arm64的入口函数在entry_a64.S中
_start 函数如下,这个函数中调用了很多其他函数,后面我们逐个分析.最后通过smc    #0 返回到ATF中
FUNC _start , :
#if defined(CFG_CORE_SEL1_SPMC)
    /*
     * With OP-TEE as SPMC at S-EL1 the SPMD (SPD_spmd) in TF-A passes
     * the DTB in x0, pagaeble part in x1 and the rest of the registers
     * are unused
     */
    mov    x19, x1        /* Save pagable part */
    mov    x20, x0        /* Save DT address */
#else
    mov    x19, x0        /* Save pagable part address */
#if defined(CFG_DT_ADDR)
    ldr     x20, =CFG_DT_ADDR
#else
    mov    x20, x2        /* Save DT address */
#endif
#endif

    adr    x0, reset_vect_table
    msr    vbar_el1, x0
    isb

    set_sctlr_el1
    isb

#ifdef CFG_WITH_PAGER
    /*
     * Move init code into correct location and move hashes to a
     * temporary safe location until the heap is initialized.
     *
     * The binary is built as:
     * [Pager code, rodata and data] : In correct location
&nb

OP-TEE的启动流程是一个复杂且严谨的过程,确保其运行环境的安全性和完整性。该流程主要依赖于ARM TrustZone技术,并结合系统的Secure Boot机制完成。 在系统启动的早期阶段,Bootloader负责加载OP-TEE的操作系统镜像(通常称为`tee.bin`)到内存中的特定位置。此镜像包含OP-TEE OS的核心代码和初始化数据。加载完成后,Bootloader将控制权转移到OP-TEE的入口点,标志着OP-TEE的启动正式开始[^1]。 OP-TEE启动的第一步是进行底层硬件初始化,包括设置处理器模式、关闭中断、配置内存管理单元(MMU)等。这一步骤确保OP-TEE能够在安全模式下运行,并为后续的初始化提供基础支持。随后,OP-TEE会初始化其核心组件,如调度器、内存管理模块、中断控制器等。这些模块的初始化为OP-TEE提供了运行时所需的基础设施[^5]。 在核心组件初始化完成后,OP-TEE进入服务初始化阶段。该阶段包括加载和注册可信应用程序(Trusted Applications, TAs),这些应用程序是实现特定安全功能的关键组件。OP-TEE通过解析TA的元数据,将其加载到安全内存区域,并为其分配必要的资源。加载完成后,TAs可以响应来自普通世界(Normal World)的请求,通过RPC机制与普通世界的客户端进行交互[^3]。 为了确保启动过程的安全性,OP-TEE利用Secure Boot机制验证其镜像的完整性和真实性。Secure Boot通过签名和验证机制防止恶意代码篡改或替换OP-TEE镜像,从而保护系统的安全启动过程[^1]。 以下是OP-TEE启动流程的关键代码示例: ```c // 初始化中断控制器 void tee_core_init_irqs(void) { irq_controller_init(); irq_register_handler(IRQ_TIMER_0, timer_interrupt_handler); } ``` ```c // 定时器中断处理函数 void timer_interrupt_handler(void) { // 执行定时器相关操作 // ... // 清除中断标志 irq_clear_interrupt(IRQ_TIMER_0); // 恢复之前的上下文信息 // ... } ``` ```c // 中断向量表定义 const struct irq_handler tee_irq_handlers[IRQ_MAX] = { [IRQ_TIMER_0] = { .func = timer_interrupt_handler, .flags = IRQ_FLAG_SECURE }, // ... }; ``` 上述代码展示了OP-TEE中断处理的初始化和实现细节,这是启动流程中的一个重要环节。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值