【发布时间】:2015-03-23 13:54:05
【问题描述】:
我正在尝试了解嵌入式 Linux 原理,但无法确定 u-boot 输出的地址。
例如,我有基于 i.MX6 四核处理器的 UDOO 板,我从 U-Boot 得到以下输出:
U-Boot 2013.10-rc3 (Jan 20 2014 - 13:33:34)
CPU: Freescale i.MX6Q rev1.2 at 792 MHz
Reset cause: POR
Board: UDOO
DRAM: 1 GiB
MMC: FSL_SDHC: 0
No panel detected: default to LDB-WVGA
Display: LDB-WVGA (800x480)
In: serial
Out: serial
Err: serial
Net: using phy at 6
FEC [PRIME]
Warning: FEC MAC addresses don't match:
Address in SROM is 00:c0:08:88:a5:e6
Address in environment is 00:c0:08:88:9c:ce
Hit any key to stop autoboot: 0
Booting from mmc ...
4788388 bytes read in 303 ms (15.1 MiB/s)
## Booting kernel from Legacy Image at 12000000 ...
Image Name: Linux-3.0.35
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 4788324 Bytes = 4.6 MiB
Load Address: 10008000
Entry Point: 10008000
Verifying Checksum ... OK
Loading Kernel Image ... OK
Starting kernel ...
我不明白加载地址 0x10008000 的值。根据此特定处理器的文档,在地址区域 0x10000000 - 0xffffffff 映射主内存。但是什么是 0x8000 偏移量?我无法弄清楚这个值的原因。
我也不明白地址 0x12000000,内核映像是从哪里加载的。 SD卡是否有映射内存区域?
请你给我一些关于这些地址的解释,或者更好的是,一些关于这个主题的资源的参考。我的目标是学习如何将 u-boot 和 Linux 内核移植到其他板上。
谢谢!
【问题讨论】:
-
内核启动要求记录在Documentation/arm/Booting 中。我不记得准确为什么 TEXT_OFFSET 是一个东西,但它是。
-
典型的是 RAM + 0x8000 的开头,因为 'ATAGS' 存储在最低地址。从飞思卡尔下载 iMX6 参考手册,所有地址都将在前几章之一中。
-
“我也不明白地址 0x12000000,内核映像是从哪里加载的。” -- U-Boot 使用变量 loadaddr来存储这个值。它在高端内存中是一个有点随意的值,但仍远低于 U-Boot 正在执行的位置。该地址是内核 uImage 或 zImage 文件在从非易失性存储器(例如 NAND 或 SD 卡)读取或从网络加载时临时存储在主存储器中的位置。 uImage 或 zImage 的这个 loadaddr 必须与实际内核的“加载地址”0x10008000 不同,以允许解压缩内核映像。
-
"SD卡有映射内存区域吗?" -- 没有,会有读SD卡的命令(如
fatload mmc 0:1 0x12000000 uImage),只有输出是 "4788388 bytes read in 303 ms (15.1 MiB/s)" 的结果。您需要获取 printenv 命令的输出,以完全揭示和了解自动引导在您的板上是如何工作的。显着的环境变量是 bootcmd。 -
@sawdust "of 0x10008000 to allow for decompressing kernel image" 在这种情况下不是,因为图像是未压缩的。当 u-boot 将控制权转移给内核时,内核将至少执行两件事。 1)如果需要解压缩自己,2)重新定位自己。在 OP 的情况下,当 u-boot 将控制权转移到内核时,不会执行解压缩,而是执行重定位。内核将自身重定位/复制到 RAM 的开头(硬件地址)。
标签: linux arm embedded-linux boot u-boot