ATF(EL3级别运行环境初始化)

本文介绍了aarch64架构下EL3级别的运行环境初始化过程,包括字节顺序配置、引导类型检测、内存初始化等关键步骤。通过宏指令实现不同场景下的灵活配置。
El3 级别运行环境初始化定义在 include/commom/aarch64/el3_common_macros.S文件中
    .macro el3_entrypoint_common                    \
        _set_endian, _warm_boot_mailbox, _secondary_cold_boot,  \
        _init_memory, _init_c_runtime, _exception_vectors

    .if \_set_endian
        mrs x0, sctlr_el3
        bic x0, x0, #SCTLR_EE_BIT
        msr sctlr_el3, x0
        isb
    .endif /* _set_endian */

    .if \_warm_boot_mailbox
        bl  plat_get_my_entrypoint
        cbz x0, do_cold_boot
        br  x0

    do_cold_boot:
    .endif /* _warm_boot_mailbox */

    .if \_secondary_cold_boot
        bl  plat_is_my_cpu_primary
        cbnz    w0, do_primary_cold_boot
    secondary_panic:
        b   secondary_panic

    do_primary_cold_boot:
    .endif 
    bl  reset_handler

    el3_arch_init_common \_exception_vectors

    .if \_init_memory
        bl  platform_mem_init
    .endif /* _init_memory */
    .if \_init_c_runtime

这是在冷启动过程中需要执行的超级动作或在EL3中启动热启动。该代码由BL1和BL31共享。
该宏将始终执行重置处理,架构初始化和堆栈设置。其余的操作是可选的,因为它们可能不是需要,这取决于调用此宏的上下文。这是为什么这个宏被参数化了每个参数允许启用/禁用一些行动。

  • _set_endian:

宏需要配置数据访问的字节顺序。

  • _warm_boot_mailbox:

宏需要检测引导类型(冷/暖)。该检测是基于平台entrypoint地址:如果为零那么它是一个冷启动,否则它是一个温暖的启动。在后一种情况下,这个宏跳到平台entrypoint地址。

  • _secondary_cold_boot:

宏是否需要识别正在调用它的CPU:primaryCPU或二级CPU。主CPU将被允许进行平台初始化,而次级将被放在一个同时平台特定的状态。如果主叫方知道这个宏只会被主CPU调用那么此参数可以定义为0以跳过此步骤。

  • _init_memory:

宏需要初始化内存。

  • _init_c_runtime:

宏是否需要初始化C运行时环境。

  • _exception_vectors:

异常向量的地址在VBAR_EL3寄存器中编程。

在ARM Trusted Firmware(ATF)中,当系统运行在EL3(Exception Level 3)时发生PANIC错误,通常表示在EL3运行时服务(如BL31)中出现了严重错误,导致系统无法继续执行。这类错误通常与系统初始化、内存访问、异常处理机制或平台配置相关。 ### 常见原因 1. **内存访问越界或非法访问** EL3运行时服务需要访问特定的安全内存区域,如用于栈、页表、安全监控调用(SMC)处理的内存。若访问了未映射或受保护的地址空间,将触发异常并导致PANIC。例如,在BL31阶段未正确设置MMU页表,或在异常处理过程中访问了非法地址,都会引发此类错误 [^1]。 2. **异常处理失败** BL31负责处理来自低异常等级(如EL2或EL1)的SMC指令和中断请求。若在异常处理流程中未能正确解析异常类型、未正确设置ELR_EL3寄存器(异常返回地址)或SPSR_EL3(异常状态),将导致系统陷入无法恢复的状态 [^3]。 3. **平台初始化失败** 在BL31启动过程中,调用`bl31_early_platform_setup`和`bl31_plat_arch_setup`进行平台初始化和架构配置。若这些函数中存在错误(如串口初始化失败、内存控制器配置错误、时钟未正确启用等),可能导致后续流程无法正常执行,最终触发PANIC [^4]。 4. **C运行时环境初始化失败** BL31入口点`bl31_entrypoint`依赖C运行时环境(如栈、全局变量、内存分配器等)。若在初始化阶段未能正确设置栈指针或未能清零`.bss`段,可能导致后续函数调用失败,进而引发PANIC [^2]。 5. **镜像加载或跳转错误** BL2阶段负责将BL31镜像加载到安全内存区域,并跳转执行。若镜像未正确加载、地址错误、或未对齐到正确的入口点,将导致BL31无法正常启动,从而在EL3触发PANIC [^4]。 ### 解决方案 1. **检查内存映射与MMU配置** 确保在BL31阶段正确设置了页表,并将关键内存区域(如栈、堆、异常向量表)映射为可访问状态。检查`plat/arm/board/common/arm_common.c`中`arm_setup_mmu()`函数的实现,确保其符合平台内存布局要求 [^1]。 2. **验证异常处理流程** 检查EL3异常向量表的初始化,确保其能够正确处理同步异常(如SMC指令)、中断和未定义指令。特别注意`el3_entrypoint_common`中对SCTLR、SPSR_EL3ELR_EL3的设置是否符合预期 [^3]。 3. **调试平台初始化函数** 在`bl31_early_platform_setup`和`bl31_plat_arch_setup`中添加调试输出,确认平台初始化流程是否正常执行。例如,检查串口是否初始化成功、内存控制器是否启用、时钟是否配置正确 [^4]。 4. **确保C运行时环境正确初始化** 验证`bl31_entrypoint`中栈指针是否指向有效内存区域,并确认`.bss`段是否被清零。可在入口点添加简单的调试打印(如点亮LED或串口输出),以确认执行流程是否进入BL31主函数 [^2]。 5. **检查BL2到BL31的跳转逻辑** 确保BL2正确加载BL31镜像到指定地址,并调用`smc`指令或`eret`指令跳转执行。检查BL2中`bl2_plat_handle_smc()`函数是否正确设置EL3寄存器,并确保BL31入口地址与链接脚本中定义的入口点一致 [^4]。 --- ### 示例:EL3异常向量表初始化代码 ```armasm // 示例:EL3异常向量表初始化 .section .vectors, "ax" .globl vectors vectors: b reset_handler b sync_exception_handler b irq_handler b fiq_handler b serror_handler reset_handler: // 初始化栈指针等操作 ldr x0, =bl31_entrypoint br x0 sync_exception_handler: // 处理同步异常(如SMC指令) mrs x1, esr_el3 mrs x2, elr_el3 mrs x3, spsr_el3 // 调用异常处理函数 bl sync_exception_handler_c eret ``` --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值