news 2026/5/27 15:57:36

TF-A上电后从`bl1_entrypoint`执行的原因

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
TF-A上电后从`bl1_entrypoint`执行的原因

TF-A上电后从bl1_entrypoint执行的原因涉及硬件启动机制和软件设计的结合。让我详细解释:

1.硬件层面的原因

ARM架构的启动流程

上电/复位 → CPU从固定地址开始执行 → 执行第一条指令

对于大多数ARM处理器:

  • 复位向量地址固定:CPU复位后,程序计数器(PC)会跳转到固定的物理地址
  • 典型地址
    • ARMv7:通常为0x000000000xFFFF0000
    • ARMv8:通常为0x000000000xFFFF0000(取决于配置)
    • 具体地址由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*)/* 其他代码 */}...}

关键点

  1. ENTRY(bl1_entrypoint):告诉链接器这是程序的入口点
  2. . = BL1_BASE:设置BL1的加载地址为SoC的启动地址
  3. .text.entrypoint:确保bl1_entrypoint函数位于镜像的最开始

3.BL1镜像布局

BL1镜像布局: +-------------------+ | .text.entrypoint | ← bl1_entrypoint (第一条指令) | (bl1_entrypoint) | +-------------------+ | 其他.text代码 | +-------------------+ | .data段 | +-------------------+ | .bss段 | +-------------------+

4.完整的启动链

阶段0:BootROM(固化在芯片中)

// 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}

阶段1:BL1入口点(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_main

5.为什么是bl1_entrypoint而不是bl1_main?

启动顺序要求

汇编初始化 → C语言环境 → C主函数 ↑ ↑ ↑ 必须用汇编 需要栈 需要初始化 设置CPU状态 和内存 的.data/.bss

具体原因

  1. CPU状态初始化:需要汇编代码设置异常向量、CPU模式等
  2. 内存环境准备:C语言需要有效的栈空间和初始化数据段
  3. 平台无关性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/BL33

STM32MP1启动流程

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# 会显示:0000000000000000<bl1_entrypoint>:0: d2800000 mov x0,#0x04: d5384100 mrs x0, elr_el3...

总结

为什么上电后从bl1_entrypoint执行?

  1. 硬件强制:CPU复位后必须从固定地址开始执行
  2. 链接器配置bl1_entrypoint被放置在BL1镜像的最开始
  3. 启动介质加载:BootROM将BL1加载到CPU的启动地址
  4. 初始化需求:需要汇编代码完成C语言运行环境准备
  5. 安全启动要求:BL1作为信任根,必须首先执行验证

这种设计确保了:

  • 确定性启动:每次复位都从相同位置开始
  • 安全性:BL1作为信任链的起点
  • 可移植性:架构相关代码与平台逻辑分离
  • 可靠性:逐步初始化,避免复杂依赖

这就是TF-A(以及大多数bootloader)采用这种分层启动架构的根本原因。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/26 8:15:22

GemDesign:一键生成网页app原型设计稿

GemDesign 今天推荐一款非常适合产品经理&#xff0c;UI/UX 设计师使用的工具——GemDesign。 它是一款AI原生的高保真原型设计工具&#xff0c;能把你的想法、草图或需求迅速转变为可交互、高保真原型或专业设计界面。 支持文字描述、草图上传生成&#xff0c;提供灵活编辑…

作者头像 李华
网站建设 2026/5/26 21:38:21

如何用Golang高效处理Word文档?docx库的完整实战指南

如何用Golang高效处理Word文档&#xff1f;docx库的完整实战指南 【免费下载链接】docx Simple Google Go (Golang) library for replacing text in Microsoft Word (.docx) file 项目地址: https://gitcode.com/gh_mirrors/docx/docx 在日常开发中&#xff0c;Word文档…

作者头像 李华
网站建设 2026/5/26 6:56:59

气象监测系统升级必读(动态阈值Agent部署的4个关键步骤)

第一章&#xff1a;气象灾害 Agent 的预警阈值 在构建智能气象监测系统时&#xff0c;Agent 的预警机制依赖于精确的阈值设定。这些阈值决定了系统对极端天气事件&#xff08;如暴雨、高温、强风等&#xff09;的响应时机与级别。合理的阈值配置不仅能提升预警的准确性&#xf…

作者头像 李华
网站建设 2026/5/27 9:32:10

自动批改准确率提升80%的秘密:教育测评Agent的多模态评分模型

第一章&#xff1a;教育测评 Agent 的自动批改在现代教育技术中&#xff0c;自动批改系统正逐步成为教学评估的重要组成部分。通过引入基于人工智能的 Agent 模型&#xff0c;教师能够高效处理大量主观题与客观题的评分任务&#xff0c;同时保证评判的一致性与准确性。核心功能…

作者头像 李华
网站建设 2026/5/26 3:42:08

模型体积缩小10倍仍保持精度?:揭秘边缘AI Agent的稀疏化奇迹

第一章&#xff1a;边缘 AI Agent 的模型压缩在资源受限的边缘设备上部署 AI Agent 面临计算能力、内存和功耗的多重挑战。模型压缩技术成为实现高效推理的关键手段&#xff0c;能够在几乎不损失精度的前提下显著降低模型体积与计算开销。剪枝 剪枝通过移除神经网络中冗余或不重…

作者头像 李华
网站建设 2026/5/27 9:38:20

错过用药时间=医疗事故?:构建高可用护理提醒Agent的6个必备要素

第一章&#xff1a;错过用药时间医疗事故&#xff1f;重新定义护理提醒的可靠性边界在现代医疗系统中&#xff0c;用药依从性是患者康复的关键因素。然而&#xff0c;当护理提醒系统未能及时触发通知&#xff0c;导致患者错过关键用药时间&#xff0c;这一事件是否应被归类为医…

作者头像 李华