Zynq Linux 内核加载地址

Zynq Linux Kernel Load address

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

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

我使用的是2018.01版本。 我提到的值是 CONFIG_EXTRA_ENV_SETTINGS

中的 "kernel_load_address=0x2080000"

我认为那不是实际的加载地址。默认情况下,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 的工具链(我以前不得不这样做,不好玩)。

Value that I mentioned is "kernel_load_address=0x2080000" in CONFIG_EXTRA_ENV_SETTINGS

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

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

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