QEMU 6.1.0 运行 RISCV64 OpenSBI + U-Boot + Linux
1. 准备
OpenSBI v0.9
git clone https://github.com/riscv-software-src/opensbi.git --branch v0.9
U-Boot v2021.07
https://source.denx.de/u-boot/u-boot.git --branch v2021.07
Linux 5.10.70 (直接在 www.kernel.org 上下载即可)
安装 RISCV 编译工具链 gcc-riscv64-linux-gnu
2. 修改 U-Boot
当使用 QEMU -biso 参数启动 OpenSBI + U-Boot 镜像时,一直出现找不到扁平设备树 (FDT)的情况,目前认为问题出在 U-Boot 函数 boot_get_fdt 中,这个函数位于文件 common/image-fdt.c 中 ,由4个分支进行 FDT 查找:
if (select || genimg_has_config(images)) ...
else if (images->legacy_hdr_valid &&
image_check_type(&images->legacy_hdr_os_copy,
IH_TYPE_MULTI)) ...
else if (genimg_get_format(buf) == IMAGE_FORMAT_ANDROID)
else ...
在最后一个 else 中直接就返回了而没有设置 images 中的 ft_addr 和 ft_len (即 FDT 的地址和长度)。目前没想过度分析,所以直接在最后一个else中补救,原代码如下:
else {
debug("## No Flattened Device Tree\n");
goto no_fdt;
}
通过 U-Boot 环境变量来查找 FDT,修改如下:
else {
fdt_addr = env_get_hex("fdtaddr", 0);
if(!fdt_addr) goto no_fdt;
fdt_blob = map_sysmem(fdt_addr, 0);
if(fdt_che