u-boot的自拷贝(重定位)

本文介绍了U-Boot启动加载地址的配置方法及其自拷贝功能的实现细节。通过增加自拷贝汇编代码,解决了因加载地址不匹配导致的启动异常问题。此外,还探讨了U-Boot的位置无关配置选项。

u-boot的加载地址

早期的通用启动器(Universal Bootloader, u-boot)没有图形界面配置的功能,为某个设备修改配置的操作比较繁琐。较新版本的u-boot提供了图形化配置界面,可以在以下配置界面下修改u-boot的加载基地址(对应的配置项为CONFIG_SYS_TEXT_BASE):

-> Boot options
   -> Boot images
       -> Text Base

该地址指定了u-boot在内存中存放的起始地址,通常由SoC厂商的内置BOOTROM把u-boot镜像从启动介质读取,加载到该地址,并跳转到此处运行。某些芯片可能因未初始化DDR,不能直接将u-boot镜像加载到该地址处;一种可行的解决方案是使用u-boot的二级启动器(Secondary Program Loader,SPL)来加载常规的u-boot。SPL的特点是体积小,可用于初始化DDR等SoC外围设备。

笔者希望通过u-boot的TFTP网络命令下载u-boot,避免频繁将u-boot烧写至设备,从而加速对u-boot的调试过程。而u-boot要求在内存中的加载地址是固定的,正在运行的u-boot不能将其使用的加载地址(CONFIG_SYS_TEXT_BASE)作为TFTP命令的目标地址。一种解决方法是修改调试u-boot的加载地址,不过该方法的缺陷是,它与正常使用的加载地址不同,可能会对调试结果产生影响。另一种解决方法是u-boot在运行过程中进行自考贝,其优点是其加载地址可以任意(需要满足一定的拷贝条件)。

u-boot的加载地址不同时的异常

在实现u-boot的自拷贝功能之前,先尝试一下加载地址不匹配的启动操作。在不修改加载地址的情况下,将u-boot加载到其他的地址,发现u-boot出现挂死的问题(仅保留了相关的信息):

U-Boot 2021.07-rc5-g79cf70d9 (Jul 04 2021 - 17:29:50 +0800)

DRAM:  948 MiB
MMC:   mmc@7e202000: 0, sdhci@7e300000: 1
Loading Environment from FAT... OK
Hit any key to stop autoboot:  0 
U-Boot> tftp 0x8000000 u-boot-old.bin
TFTP from server 10.10.8.100; our IP address is 10.10.8.151
Filename 'u-boot-old.bin'.
Load address: 0x8000000
Loading: ##################################################  528.8 KiB
         3.1 MiB/s
done
Bytes transferred = 541512 (84348 hex)
U-Boot> go 0x8000000
## Starting application at 0x08000000 ...
U-Boot 2021.07-rc5-g79cf70d9 (Jul 04 2021 - 17:29:50 +0800)

DRAM:  948 MiB

u-boot的加载地址(CONFIG_SYS_TEXT_BASE)默认为0x80000,但被加载到0x8000000之后,也能运行;但挂在DRAM: 948M之后便再没有新的串口信息了。

u-boot的自拷贝功能

不考虑u-boot的实际加载地址与设定的加载地址不满足拷贝条件的情况(即二者无重叠),可以增加以下简单的自拷贝汇编代码:


                
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值