问题描述
我不知道,这个问题是否与 Stackoverflow 无关,但在我在官方 U-Boot 邮件列表中提出这个问题之前,我会在这个网站上提出这个问题。
出于教育目的,已经启动了一个裸机应用程序(简单内核)。现在我想实现一个简单的 initrd 支持来加载内核模块以及加载和执行用户应用程序。
在启动 ELF 映像时,U-Boot 是否有可能(也许有解决方法)在 AArch64 寄存器中传递多个参数?
我知道使用 U-Boot bootm 命令可能是可能的。但我目前还没有弄清楚它是如何完全工作的。 U-Boot documentation 指的是 Linux documentation。根据这个文档,只有 register x0
应该填充 device-tree-blob 地址,我目前还没有实现。 x1
、x2
、x3
是保留的,应该用零填充:
-
主 cpu 通用寄存器设置:
- x0 = 系统 RAM 中设备树 blob (dtb) 的物理地址。
- x1 = 0(保留以备将来使用)
- x2 = 0(保留以备将来使用)
- x3 = 0(保留以备将来使用)
不知道从哪里可以得到其他参数。
解决方法
您有两个选择:
booti 命令会将起始地址和结束地址添加到设备树中,例如
/ {
chosen {
linux,initrd-start = <0x82000000>;
linux,initrd-end = <0x82800000>;
};
};
请在这里找到 booti 命令的描述: https://u-boot.readthedocs.io/en/latest/usage/booti.html
另一种可能是通过 UEFI 启动。
使用 efidebug 命令,您可以定义启动选项,例如Boot0000 指示内核和 initrd 的位置。当您运行“bootefi bootmgr”时,initrd 将作为 EFI_LOAD_FILE2_PROTOCOL 公开。
或者从内核的 EFI 存根使用 UEFI 文件协议加载 initrd。
使用 gnu-efi 构建 UEFI 应用程序是最简单的。
除了邮件列表,Freenode 上还有一个#u-boot IRC 频道。
,有第三个选项,它是 bootelf
,它看着 cmd/elf.c
/*
* pass address parameter as argv[0] (aka command name),* and all remaining args
*/
rc = do_bootelf_exec((void *)addr,argc,argv)