我正在尝试完全手动启动 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传递给内核呢?
根据你的问题,首先需要知道你是如何做到这一点的?
“我可以将内核映像、initrd 和 fdt 加载到内存”