【问题标题】:why is load address of kernel, ramdisk important in booting?为什么内核,ramdisk的加载地址在引导中很重要?
【发布时间】:2016-04-05 12:56:56
【问题描述】:

我正在处理 android boot.img,它是压缩内核、ramdisk 和 dtb 的组合。我从 uboot 的串行控制台日志中看到了有关启动过程的信息,这是触发我好奇心的部分

CPU:   Freescale i.MX6Q rev1.2 at 792 MHz
CPU:   Temperature 27 C
Reset cause: POR
Board: MX6-SabreSD
I2C:   ready
DRAM:  1 GiB
PMIC:  PFUZE100 ID=0x10
MMC:   FSL_SDHC: 0, FSL_SDHC: 1, FSL_SDHC: 2
No panel detected: default to Hannstar-XGA
Display: Hannstar-XGA (1024x768)
In:    serial
Out:   serial
Err:   serial
check_and_clean: reg 0, flag_set 0
Fastboot: Normal
flash target is MMC:1
Net:   FEC [PRIME]
Normal Boot
Hit any key to stop autoboot:  3  2  1  0 
boota mmc1 
kernel   @ 14008000 (7272352)
ramdisk  @ 15000000 (869937)
fdt      @ 14f00000 (44072)
## Booting Android Image at 0x12000000 ...
Kernel load addr 0x14008000 size 7102 KiB
Kernel command line: console=ttymxc0,115200 init=/init video=mxcfb0:dev=hdmi,1920x1080M@60,bpp=32 video=mxcfb1:off video=mxcfb:off video=mxcfb3:off vmalloc=256M androidboot.console=ttymxc0 consolebalank=0 androidboot.hardware=freescale cma=384M
## Flattened Device Tree blob at 14f00000
   Booting using the fdt blob at 0x14f00000
   Loading Kernel Image ... OK
   Using Device Tree in place at 14f00000, end 14f0dc27
switch to ldo_bypass mode!

Starting kernel ...

内核的地址是14008000,ramdisk 15000000,fdt 14f00000。 我发现这些值保存在 boot.img 标头中,当我手动弄乱这些值时,即使实际内容没有修改,图像也不会启动。

为什么这个地址如此重要?为什么必须是这些值?为什么不是其他值?

我自己的一个猜测是: 这些加载地址值是在内核中硬编码的,所以如果我在 boot.img 标头中更改它,它会导致副作用。为了阐述我自己的理论,将内核加载到“修改后的”加载地址不会有问题。但是当实际执行这些行时,会导致严重的问题,因为这些代码被固定为使用正确的“加载地址”。

我的理论错了吗?如果是这样,如果您能纠正我,我将不胜感激。

【问题讨论】:

  • 内核映像是不可重定位的二进制文件。在构建内核的链接阶段,所有可重定位的非相对地址都使用指定的加载地址作为基地址转换为绝对地址。对于 Linux ARM 内核,约定是这个加载地址是从物理内存开始的 0x8000。
  • 这应该是答案,除了一件事-使用链接地址0xc0008000转换为绝对地址

标签: linux-kernel boot


【解决方案1】:

U-boot 完成后,它需要将进一步的执行移交给内核,以便内核处理所有进一步的进程。另外,内核有一些对初始化板至关重要的例程。
这组例程有一个入口点start_kernel()。在此之前,还会调用其他一些例程来执行start_kernel。这可以通过 linker script 和 init.S 来识别。

为了在这个程序中保持执行,内核需要从一个特定的地址开始,而且它的数据段和其他内存也附加在这个地址上,以便以适当的方式加载和运行所有这些,需要提供确切的内存位置.

对于这个内核需要设备树 blob 来探测连接到它的设备和 rootfs 来启动用户空间,这里加载设备树和 rootfs 需要精确的偏移量,这样任何数据都不会丢失或损坏.每个字节对于所有这些执行都很重要。

所以为了安全启动,所有这些值都存储在引导加载程序的配置中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-28
    • 2018-03-26
    • 2021-11-03
    • 1970-01-01
    • 1970-01-01
    • 2016-02-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多