【问题标题】:Zynq Linux Kernel Load addressZynq Linux 内核加载地址
【发布时间】:2020-06-08 16:40:27
【问题描述】:

我想为zed板构建linux。当我查看 u-boot/include/configs 目录中的 zynq-common.h 文件时,我看到 kernel_load_address 是 0x02080000。

为什么内核加载地址是0x02080000? 它的逻辑是什么?

我使用的是 2018.01 版本。 我提到的值是 CONFIG_EXTRA_ENV_SETTINGS 中的“kernel_load_address=0x2080000”

【问题讨论】:

  • 我使用的是 2018.01 版本。我提到的值是 CONFIG_EXTRA_ENV_SETTINGS 中的“kernel_load_address=0x2080000”

标签: linux linux-kernel u-boot zynq


【解决方案1】:

我认为这不是实际的加载地址。 UBoot 应该默认将其加载到 0x8000。它可以被修改,但你不想通过头文件来做。

(您不需要查看这些文件,尤其是不需要修改它们。)

如果您想为 zedboard 构建内核,我建议您遵循以下任一指南: https://wiki.analog.com/resources/eval/user-guides/ad-fmcomms2-ebz/software/linux/zynq_2014r2 https://highlevel-synthesis.com/2016/10/31/how-to-compile-xilinx-linux-kernel-for-zynq/

如果您不想在需要 4-6 小时或更长时间的平台上构建内核(我以前必须这样做,不好玩),您还需要 Xilinx 的工具链。

【讨论】:

  • "我想为 zed board 构建 linux" -> 我建议从已知的工作配置开始。 Buildroot 有一个用于 zedboard 的 defconfig,在一些命令中,您将获得一个启动 SD 卡映像。 yocto meta-xilinx 层也有一个 zedboard machine conf。对于实际工作,两者都比遵循 IMO 教程更简单、更可重用。
  • 我之前已经构建过linux内核。但我不明白 0x2080000 的逻辑。我将 0x08008000 用于 TI 的 AM335x 处理器。因为在 AM335x 中 ram 的起始地址是 0x08000000,我在这个地址上加上了 32k 的偏移量。
【解决方案2】:

我提到的值是 CONFIG_EXTRA_ENV_SETTINGS 中的“kernel_load_address=0x2080000”

那个特定的环境变量不是 U-Boot 的主线版本。所以显然你正在使用自定义版本。

使用该环境变量很可能通过输入命令在主内存中定位内核映像。由于这是一个 ARM 板,内核映像将是 zImage 或 uImage(其中将包含 zImage)。
zImage 能够自行解压缩并将内核映像重新定位到正确的加载地址以供实际执行。
最终加载地址通常是物理内存的开头加上 0x8000。见Building kernel uImage using LOADADDR

由于内核在解压过程中会被重定位,这个U-boot用来读入压缩内核镜像的中间内存地址并不重要。附加到 zImage 的解压缩代码与位置无关,因此将 zImage 加载到内存中是灵活的。只要 zImage 驻留在高于内核实际加载地址的内存中,就没有问题(即额外的重定位)。

【讨论】:

    猜你喜欢
    • 2016-02-08
    • 1970-01-01
    • 2021-08-17
    • 2013-03-10
    • 2020-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-23
    相关资源
    最近更新 更多