【问题标题】:Understanding Linux load address for U-Boot process了解 U-Boot 进程的 Linux 加载地址
【发布时间】: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


【解决方案1】:

如果你检查u-boot的环境变量,你会发现内核映像是通过fatload这样的命令从引导设备复制到RAM位置(这里是12000000)。

现在,这不是LOADADDRESS。您在编译内核时将LOADADDRESS 提供给命令行,该地址主要位于处理器物理地址空间中RAM 起始处的32K 偏移处。

您的 RAM 映射在 10000000 和内核 LOADADDRESS10008000(32K 偏移量)。 bootm 命令将内核映像从12000000 解压到10008000 地址,然后调用kernel entry point

【讨论】:

  • 好吧,我会添加 0x12000000 和 0x80008000 必须都在物理 DDR 地址空间中。所以 0x12000000 只是存放内核的初步位置,在从 u-boot 解压之前,会将未压缩的二进制文件放入 0x80008000 中,该位置也必须在内核构建中设置为 load_addr。
【解决方案2】:

查看包含/配置文件夹。它包含所有板定义

i.MX uboot include/configs

要将uboot移植到另一个端口,基于一个非常相似的板并从那里修改。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-22
    • 1970-01-01
    • 2016-02-08
    • 1970-01-01
    相关资源
    最近更新 更多