2026/1/2 18:36:38
网站建设
项目流程
企业网站类型主要包括,投广告哪个平台好,外贸soho,网站运营与管理实训报告TF-A上电后从bl1_entrypoint执行的原因涉及硬件启动机制和软件设计的结合。让我详细解释#xff1a;
1. 硬件层面的原因
ARM架构的启动流程
上电/复位 → CPU从固定地址开始执行 → 执行第一条指令对于大多数ARM处理器#xff1a;
复位向量地址固定#xff1a;CPU复位后1.硬件层面的原因ARM架构的启动流程上电/复位 → CPU从固定地址开始执行 → 执行第一条指令对于大多数ARM处理器复位向量地址固定CPU复位后程序计数器PC会跳转到固定的物理地址典型地址ARMv7通常为0x00000000或0xFFFF0000ARMv8通常为0x00000000或0xFFFF0000取决于配置具体地址由SoC设计决定SoC内存映射------------------- 高地址 | DDR | ------------------- | ... | ------------------- 0x00010000 (示例) | BL1 | ← 上电后CPU从这里开始执行 ------------------- 0x00000000 | Boot ROM | ← 可能包含初始引导代码 -------------------2.链接脚本的作用BL1链接脚本(bl1.ld.S)ENTRY(bl1_entrypoint)/* 指定入口点 */SECTIONS{.BL1_BASE;/* BL1的加载地址通常是SoC的启动地址 */.text:{*(.text.entrypoint)/* bl1_entrypoint代码段 */*(.text*)/* 其他代码 */}...}关键点ENTRY(bl1_entrypoint)告诉链接器这是程序的入口点. BL1_BASE设置BL1的加载地址为SoC的启动地址.text.entrypoint段确保bl1_entrypoint函数位于镜像的最开始3.BL1镜像布局BL1镜像布局 ------------------- | .text.entrypoint | ← bl1_entrypoint (第一条指令) | (bl1_entrypoint) | ------------------- | 其他.text代码 | ------------------- | .data段 | ------------------- | .bss段 | -------------------4.完整的启动链阶段0BootROM固化在芯片中// SoC内部的BootROM代码不可修改voidbootrom_entry(void){// 1. 初始化最基本硬件时钟、最小内存// 2. 从启动介质如eMMC、SPI Flash读取BL1// 3. 将BL1加载到SRAM的固定地址如0x00000000// 4. 验证BL1签名可选// 5. 跳转到BL1的入口地址jump_to(BL1_BASE);// 跳转到bl1_entrypoint}阶段1BL1入口点(bl1_entrypoint.S)// bl1/bl1_entrypoint.S bl1_entrypoint: /* 1. 设置异常向量表 */ adr x0, exception_vectors msr vbar_el3, x0 /* 2. 设置栈指针 */ ldr x0, bl1_stack_base mov sp, x0 /* 3. 清零.bss段 */ ldr x0, __BSS_START__ ldr x1, __BSS_SIZE__ bl zeromem /* 4. 初始化.data段 */ ldr x0, __DATA_START__ ldr x1, __DATA_ROM_START__ ldr x2, __DATA_SIZE__ bl copymem /* 5. 跳转到C语言主函数 */ b bl1_main5.为什么是bl1_entrypoint而不是bl1_main启动顺序要求汇编初始化 → C语言环境 → C主函数 ↑ ↑ ↑ 必须用汇编 需要栈 需要初始化 设置CPU状态 和内存 的.data/.bss具体原因CPU状态初始化需要汇编代码设置异常向量、CPU模式等内存环境准备C语言需要有效的栈空间和初始化数据段平台无关性bl1_entrypoint处理架构相关初始化bl1_main处理逻辑6.实际SoC示例Rockchip RK3399启动流程1. 上电 → BootROM从eMMC读取idbloader.img 2. BootROM验证idbloader.img → 加载到SRAM 0xff8c0000 3. 跳转到0xff8c0000执行BL1入口 4. BL1初始化DDR → 加载BL31/BL32/BL33STM32MP1启动流程1. 上电 → ROM代码从FSBL分区读取TF-A BL2 2. 但TF-A将其重命名为BL1实际执行BL1功能 3. 跳转到BL1入口点执行7.验证方法查看BL1镜像布局# 使用readelf查看入口点aarch64-none-elf-readelf -h bl1.bin# 输出示例Entry point address: 0x00000000 Start of program headers:0(bytes intofile)Start of section headers:0(bytes intofile)查看反汇编aarch64-none-elf-objdump -d bl1.elf|head-50# 会显示0000000000000000bl1_entrypoint:0: d2800000 mov x0,#0x04: d5384100 mrs x0, elr_el3...总结为什么上电后从bl1_entrypoint执行硬件强制CPU复位后必须从固定地址开始执行链接器配置bl1_entrypoint被放置在BL1镜像的最开始启动介质加载BootROM将BL1加载到CPU的启动地址初始化需求需要汇编代码完成C语言运行环境准备安全启动要求BL1作为信任根必须首先执行验证这种设计确保了✅确定性启动每次复位都从相同位置开始✅安全性BL1作为信任链的起点✅可移植性架构相关代码与平台逻辑分离✅可靠性逐步初始化避免复杂依赖这就是TF-A以及大多数bootloader采用这种分层启动架构的根本原因。