手动启动Linux,如何将initrd、dtb、命令行传递给Kernel?

问题描述 投票:0回答:1

我正在尝试完全手动启动 ARMv8 Linux,这意味着手中根本没有启动加载程序。我可以将内核映像、initrd 和 fdt 加载到内存中,然后“跳转”到内核入口点来启动它。
但我不知道如何告诉内核 initrd 或 dtb 在哪里,以及内核命令行是什么..:-(.
所以关于 ARMv8 Linux 的问题是如何在不使用 bootloader 的情况下将 initrd、dtb 和命令行的信息传递给内核?

ARM的bootm的uboot代码如下(arch/arm/lib/bootm.c),

    if (CONFIG_IS_ENABLED(OF_LIBFDT) && images->ft_len)
        r2 = (unsigned long)images->ft_addr;
    else
        r2 = gd->bd->bi_boot_params;

    if (!fake) {
#ifdef CONFIG_ARMV7_NONSEC
        if (armv7_boot_nonsec()) {
            armv7_init_nonsec();
            secure_ram_addr(_do_nonsec_entry)(kernel_entry,
                              0, machid, r2);
        } else
#endif
            kernel_entry(0, machid, r2);
    }
#endif

将fdt加载到内存后,r2就是fdt内存地址。
ARM64的Linux内核(5.19.9)的入口点如下(arch/arm64/kernel/head.S),

/*
 * Preserve the arguments passed by the bootloader in x0 .. x3
 */
SYM_CODE_START_LOCAL(preserve_boot_args)
    mov x21, x0             // x21=FDT

    adr_l   x0, boot_args           // record the contents of
    stp x21, x1, [x0]           // x0 .. x3 at kernel entry
    stp x2, x3, [x0, #16]

    dmb sy              // needed before dc ivac with
                        // MMU off

    add x1, x0, #0x20           // 4 x 8 bytes
    b   dcache_inval_poc        // tail call
SYM_CODE_END(preserve_boot_args)

内核似乎认为 X0 是 fdt(或 boot args)的地址。
那么在启动时使用什么寄存器将FDT传递给内核呢?

linux-kernel arm bootloader
1个回答
0
投票

根据你的问题,首先需要知道你是如何做到这一点的?

“我可以将内核映像、initrd 和 fdt 加载到内存”

© www.soinside.com 2019 - 2024. All rights reserved.