我正试图为我们的简单测试板构建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(如果是这样,链接时会出现溢出错误(。