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的实际加载地址与设定的加载地址不满足拷贝条件的情况(即二者无重叠),可以增加以下简单的自拷贝汇编代码:

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

2705

被折叠的 条评论
为什么被折叠?



