在u-boot编译中,linker script的sdram start和length由CONFIG_SPL_BSS_START_ADDR和CONFIG_SPL_BSS_MAX_SIZE值设置,为什么?

In u-boot compile, linker script's sdram start and length are set by CONFIG_SPL_BSS_START_ADDR and CONFIG_SPL_BSS_MAX_SIZE values, why?

我正在尝试为我们的简单测试板构建 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_SPL_BSS_MAX_SIZE 提供的。我将这个范围放在片上 RAM 区域中 CONFIG_SPL_TEXT_BASE 以上 space 和 CONFIG_SPL_STACK 以下的足够 space 并具有足够的堆栈 space。 (我引用了 imx8mm_evk 板)。我应该纠正什么?
顺便说一句,我发现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(如果是这样,你会在链接时遇到溢出错误)。