news 2026/5/5 2:58:29

U-boot:自搬移

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
U-boot:自搬移

背景:代码在flash上,但是内存运行得快,所以uboot要自搬移到内存去跑代码

Boot 自搬移是 U-Boot 启动流程中一个核心机制,简单来说就是 U-Boot 将自身从启动时的加载地址,搬运到编译时指定的运行地址,并修正内部地址引用后,在新地址上继续执行 的过程。这个机制是 U-Boot 能灵活适配不同硬件平台、优化内存使用的关键。

一、 为什么需要自搬移?

U-Boot 的启动分为两个阶段,自搬移的需求源于加载地址和运行地址的不一致:

1)加载地址:U-Boot 最初被 BootROM(芯片内置的固化程序)从启动介质(如 SPI Flash、eMMC)加载到内存的低地址区域,这个地址由芯片硬件特性决定(比如很多 ARM 芯片会把 Flash 映射到 0x00000000 地址,U-Boot 被加载到这里执行第一阶段代码)。

2)运行地址:编译 U-Boot 时会通过链接脚本指定一个高地址的内存空间(称为TEXT_BASE),这个地址是 U-Boot 的最优运行地址(通常是 SDRAM 的一片连续、无冲突的空间,能启用 Cache 加速,且不会和内核镜像、设备树的加载地址冲突)。

如果不进行自搬移,U-Boot 只能在狭窄的低地址空间运行,不仅性能受限,还会占用内核镜像的加载区域,导致内核无法正常启动。

二、 U-Boot 自搬移的核心流程

自搬移发生在 U-Boot 第一阶段(SPL,Secondary Program Loader) 初始化关键硬件(如 SDRAM)之后,第二阶段主程序启动之前,具体步骤如下:

1、硬件初始化准备

1)关闭中断:防止搬移过程被打断导致程序崩溃。

2)初始化栈:为搬移函数分配临时栈空间(栈必须在未被搬移覆盖的内存区域)。

3)初始化 SDRAM:这是自搬移的前提—— 只有 SDRAM 初始化完成,才有足够的空间存放搬移后的 U-Boot。

2、计算搬移参数

1)确定源地址(Src):U-Boot 当前的加载地址(可通过链接脚本符号或硬件寄存器获取)。

2)确定目的地址(Dst):编译时指定的TEXT_BASE(运行地址,在 SDRAM 中)。

3)确定搬移长度(Len):U-Boot 镜像的总长度(通过链接脚本中的__end - __start计算)。

3、执行内存拷贝(搬移操作)

1)调用内存拷贝函数(通常是汇编实现的高效memcpy),将 U-Boot 从源地址完整拷贝到目的地址。

2)关键注意点:如果源地址和目的地址存在内存重叠(如Dst < Src + Len),必须从高地址向低地址拷贝,避免未拷贝的内容被提前覆盖。

4、重定位修正(最核心的步骤)

1)U-Boot 中存在大量绝对地址引用(如全局变量、函数指针、跳转指令),这些地址在编译时基于TEXT_BASE生成,但搬移前指向的是源地址空间。自搬移后必须修正这些地址,否则程序会跳转到错误的位置执行。

2)读取编译时生成的重定位表(Relocation Table):该表记录了所有需要修正的绝对地址的位置和偏移量。

3)遍历重定位表,对每个绝对地址执行修正:修正后地址 = 原地址 + 目的地址 - 源地址

4)修正全局偏移表(GOT)、函数指针等关键数据结构。

5、跳转到新地址执行

1)修正程序计数器(PC),跳转到目的地址的 U-Boot 入口函数(通常是board_init_r)。

2)此时 U-Boot 正式在TEXT_BASE地址运行,后续所有操作都基于新地址空间。

3)可选:将原地址空间的内容清空,释放内存给内核或其他程序使用。

三、 自搬移的关键技术细节

1、链接脚本的作用

U-Boot 的自搬移依赖链接脚本(如u-boot.lds)的精准配置,主要定义:

1)TEXT_BASE:运行地址(如0x80800000)。

2)代码段(.text)、数据段(.data)、BSS 段(.bss)的地址范围。

3)重定位表的起始和结束地址(__rel_dyn_start、__rel_dyn_end)。

2、与芯片架构的关联

1)ARM 架构:自搬移逻辑通常在arch/arm/lib/relocate.S中实现,依赖 ARM 的异常向量表、PC 寄存器操作。

2)RISC-V 架构:逻辑类似,但地址修正规则和寄存器操作与 ARM 不同,对应代码在arch/riscv/lib/relocate.S。

3)对于你接触的瑞芯微 RK3506/RK3576(ARM 架构),移植 U-Boot 时需重点确认TEXT_BASE是否与芯片的 SDRAM 地址空间匹配。

3、自搬移的异常排查

自搬移失败是 U-Boot 移植中常见的问题,典型现象是 U-Boot 第一阶段执行后卡死,常见原因:

1)TEXT_BASE设置错误(超出 SDRAM 地址范围)。

2)重定位表生成不完整(编译时未启用-ffunction-sections等参数)。

3)内存拷贝时发生地址重叠,且拷贝方向错误。

4)SDRAM 初始化不完整(如时序配置错误,导致搬移后的数据损坏)。

四、 特殊场景:无自搬移的 U-Boot

并非所有场景都需要自搬移,比如:

1)加载地址 = 运行地址:如果 U-Boot 直接被加载到TEXT_BASE指定的地址(如通过 JTAG 烧写至 SDRAM 运行),则无需搬移。

2)片内 RAM 运行的 U-Boot SPL:SPL 通常体积很小,直接在芯片的片内 RAM 运行,无需搬移。

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

PCB 表面处理工艺:喷锡(热风整平)与镀金 全对比解析

PCB表面处理工艺&#xff1a;喷锡&#xff08;热风整平&#xff09;与镀金 全对比解析 PCB表面处理的核心目的是保护焊盘铜箔不被氧化、提升焊接可靠性&#xff0c;喷锡和镀金是两种主流工艺&#xff0c;核心差异在于涂层材质、工艺原理和适用场景。以下从工艺细节、特性对比、…

作者头像 李华
网站建设 2026/5/1 12:12:55

微服务分布式SpringBoot+Vue+Springcloud高校教学选课管理系统_

目录微服务架构下的高校教学选课管理系统技术架构与核心功能系统优势与创新点开发技术源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;微服务架构下的高校教学选课管理系统 该系统基于SpringBoot、Vue.js和SpringCloud技术栈构建&#…

作者头像 李华
网站建设 2026/5/3 14:56:25

开箱即用的中文情感分析方案|StructBERT镜像集成WebUI与API

开箱即用的中文情感分析方案&#xff5c;StructBERT镜像集成WebUI与API 1. 背景与需求&#xff1a;为什么需要轻量级中文情感分析&#xff1f; 在自然语言处理&#xff08;NLP&#xff09;的实际应用中&#xff0c;情感分析是企业洞察用户反馈、监控舆情、优化服务体验的核心…

作者头像 李华
网站建设 2026/5/1 17:22:57

32 位浮点数(IEEE 754 单精度)数轴分布技术文档

目录 1. 文档概述 2. 核心定义与格式 2.1 IEEE 754 单精度浮点数结构 2.2 数值表示公式 3. 数轴分布核心特性 3.1 整体分布规律 3.2 关键区间分布说明 3.3 直观示例 4. 编程指导意见 4.1 精度控制建议 4.2 边界值处理 4.3 性能与精度权衡 5. 常见问题与解决方案 6…

作者头像 李华
网站建设 2026/5/1 8:28:53

如何高效运行AutoGLM-Phone-9B?一文掌握本地部署全流程

如何高效运行AutoGLM-Phone-9B&#xff1f;一文掌握本地部署全流程 随着多模态大模型在移动端的广泛应用&#xff0c;轻量化、高效率的推理能力成为关键需求。AutoGLM-Phone-9B 作为一款专为移动设备优化的90亿参数多模态大语言模型&#xff0c;融合了文本、语音与视觉处理能力…

作者头像 李华
网站建设 2026/5/3 10:44:47

分类模型压测工具:云端GPU模拟百万QPS,成本可控

分类模型压测工具&#xff1a;云端GPU模拟百万QPS&#xff0c;成本可控 引言 作为技术负责人&#xff0c;你是否遇到过这样的困境&#xff1a;系统上线前需要验证承载能力&#xff0c;但本地测试环境根本无法模拟真实的高并发场景&#xff1f;传统的压测工具要么性能不足&…

作者头像 李华