在 u-boot 编译中,链接器脚本的 sdram 开始和长度由 CONFIG_SPL_BSS_START_ADDR 和 CONFIG_SPL_BSS_MAX_SIZE 值设置,为什么?



我正试图为我们的简单测试板构建u-boot。(arm64(
在include/configs/ab21m.h(我们的板(中设置后,

#define CONFIG_SPL_BSS_START_ADDR 0x4f00000
#define CONFIG_SPL_BSS_MAX_SIZE   SZ_32K

当我编译它时,它会在链接u-boot-spl时出错。错误消息如下所示。

===================== WARNING ======================
This board does not use CONFIG_DM_ETH (Driver Model
for Ethernet drivers). Please update the board to use
CONFIG_DM_ETH before the v2020.07 release. Failure to
update by the deadline may result in board removal.
See doc/driver-model/migration.rst for more info.
====================================================
UPD     include/generated/timestamp_autogenerated.h
CFGCHK  u-boot.cfg
CC      cmd/version.o
AR      cmd/built-in.o
LD      u-boot
CC      spl/common/spl/spl.o
OBJCOPY u-boot.srec
OBJCOPY u-boot-nodtb.bin
SYM     u-boot.sym
RELOC   u-boot-nodtb.bin
COPY    u-boot.bin
MKIMAGE u-boot.img
LD      u-boot.elf
AR      spl/common/spl/built-in.o
LD      spl/u-boot-spl
aarch64-none-elf-ld.bfd: invalid length for memory region .sdram
make[1]: *** [scripts/Makefile.spl:509: spl/u-boot-spl] Error 1
make: *** [Makefile:1984: spl/u-boot-spl] Error 2
make: *** Waiting for unfinished jobs....

顺便说一句,spl的链接器脚本在构建之后像这样启动。

MEMORY { .sram : ORIGIN = 0x4000000,
LENGTH = (14*1024*1024) }
MEMORY { .sdram : ORIGIN = 0x4f00000,
LENGTH = SZ_32K }
OUTPUT_FORMAT("elf64-littleaarch64", "elf64-littleaarch64", "elf64-littleaarch64")
OUTPUT_ARCH(aarch64)
ENTRY(_start)
SECTIONS
{

这很奇怪,因为这个0x4f00000和SZ_32K是我为CONFIG_SPL_BSS_START_ADDR和CONFIG_SPLL_BSS_MAX_SIZE给出的。我把这个范围放在片上RAM区域中,在CONFIG_SPL_TEXT_BASE上方和CONFIG_SPLL_STACK下方有足够的空间,有足够的堆栈空间。(我引用了imx8mm_evk板(。我应该纠正什么
BTW,我发现CONFIG_SYS_SDRAM_BASE、CONFIG_SYS _INIT_RAM_ADDR在imx8mm_evk中都设置为0x40000000,这是DRAM的起始地址。但是CONFIG_SYS_INIT_RAM_SIZE设置为0x200000(2MB(,其中实际存在3072MB DDR。为什么将此值设置为小尺寸?我问了两个问题。任何帮助都将不胜感激。

所以,您的第一个问题是字面上的问题。您有SZ_32K作为CONFIG_SPL_BSS_MAX_SIZE的值,但由于include/configs/ab21m.h中可能缺少#include <linux/sizes.h>,因此无法计算该常数。

至于这一切都在做什么,以及为什么你可能会使用其他平台上更像2MB的东西,并将其放置在SDRAM中,而不是更小的片上内存中,如果你查看arch/arm/cpu/armv8/u-boot-spl.lds,你可以看到我们正在定义BSS应该驻留的位置,它可能大于32KB(如果是这样,链接时会出现溢出错误(。

最新更新