QEMU 6.1.0 运行 RISCV64 OpenSBI + U-Boot + Linux

本文介绍了如何在QEMU 6.1.0环境下运行RISCV64架构的OpenSBI、U-Boot和Linux系统。内容包括准备工具、修改U-Boot以解决FDT查找问题、编译OpenSBI和Linux内核、创建虚拟块设备以及启动QEMU的详细步骤。
摘要由CSDN通过智能技术生成

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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值