linux-kernel – 为什么加载内核地址,ramdisk在启动时很重要?
我正在处理
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. 为什么这个地址如此重要?为什么必须是这些价值观?为什么不是其他价值? 我自己的一个猜测是: 我的理论错了吗?如果是这样,如果你能纠正我,我将不胜感激. 解决方法
在U-boot完成之后,它需要将进一步的执行切换到内核,以便内核负责所有进一步的进程. Plus Kernel具有一些初始化板必不可少的例程.
这些例程集具有入口点 start_kernel().在此之前,还调用其他一些例程来执行start_kernel.这可以通过 linker script和 init.S来确定. 为了在此过程中保持执行,需要从特定地址启动内核,而且还附加其数据段和其他存储器,以便以适当的方式加载和运行所有这些,需要提供精确的存储器位置. 使用此内核需要设备树blob来探测连接到它的设备和rootfs来调出用户空间,这里需要加载设备树和rootfs,需要精确的偏移量,以便不会丢失或损坏任何数据.每个字节对于所有这些执行都很重要. 因此,为了安全启动,所有这些值都存储在引导加载程序的配置中. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |