news 2026/6/25 15:05:05

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/6/15 12:41:15

微服务分布式SpringBoot+Vue+Springcloud高中学生综合素质评价档案系统_

目录微服务分布式学生综合素质评价系统摘要开发技术源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;微服务分布式学生综合素质评价系统摘要 该系统基于SpringBootVueSpringCloud微服务架构&#xff0c;面向高中学生综合素质评价档案管理…

作者头像 李华
网站建设 2026/6/21 12:58:52

GTE中文向量模型核心优势解析|附语义相似度计算同款部署案例

GTE中文向量模型核心优势解析&#xff5c;附语义相似度计算同款部署案例 在自然语言处理的诸多任务中&#xff0c;语义相似度计算是构建智能搜索、问答系统、推荐引擎和文本聚类等应用的核心能力。传统的关键词匹配方法已无法满足对“语义理解”的深层需求——用户输入“苹果真…

作者头像 李华
网站建设 2026/6/23 13:37:01

万能分类器+CLIP联合使用教程:云端GPU双模型同时跑

万能分类器CLIP联合使用教程&#xff1a;云端GPU双模型同时跑 引言&#xff1a;当分类器遇上CLIP 想象你是一位博物馆管理员&#xff0c;手头有两件神奇工具&#xff1a;一个能自动识别展品类别的智能标签机&#xff08;万能分类器&#xff09;&#xff0c;另一个是精通艺术史…

作者头像 李华
网站建设 2026/6/15 6:31:57

分类模型微调实战:云端GPU 3小时完成训练,花费9元

分类模型微调实战&#xff1a;云端GPU 3小时完成训练&#xff0c;花费9元 引言&#xff1a;为什么选择云端GPU微调分类模型&#xff1f; 当你手头有一批行业数据&#xff08;比如电商评论、医疗报告或金融新闻&#xff09;&#xff0c;想要训练一个能自动分类的AI模型时&…

作者头像 李华
网站建设 2026/6/20 10:19:44

StructBERT中文情感分析镜像发布|CPU支持+开箱即用Web界面

StructBERT中文情感分析镜像发布&#xff5c;CPU支持开箱即用Web界面 1. 背景与需求&#xff1a;中文情感分析的工程落地挑战 在自然语言处理&#xff08;NLP&#xff09;的实际应用中&#xff0c;中文情感分析是企业级服务中最常见的需求之一。无论是电商评论、客服对话还是…

作者头像 李华