2.4 QEMU + RISC-V + Linux实验平台

本书少部分实验(如指令集实验和部分高速缓存伪共享实验)可以在基于RISC-V的Linux主机上完成。基于RISC-V的Linux主机可以通过两种方式获取,一种是购买RISC-V开发板,另一种是使用QEMU+RISC-V+Linux实验平台。

下面介绍QEMU+RISC-V+Linux实验平台。Linux主机使用Ubuntu 20.04系统。

(1)安装工具

首先,在Linux主机中安装相关工具。

$ sudo apt-get install qemu-system-misc libncurses5-dev gcc-riscv64-linux-gnu
build-essential git bison flex libssl-dev opensbi

然后,在Linux主机系统中安装RISC-V GCC编译器的9.3版本。

$ riscv64-linux-gnu-gcc -v
gcc version 9.3.0 (Ubuntu 9.3.0-8ubuntu1) 

(2)下载仓库

下载runninglinuxkernel_5.15的GIT仓库并切换到master分支。

$ git clone https://github.com/runninglinuxkernel/runninglinuxkernel_5.15.git

(3)编译内核并创建文件系统

runninglinuxkernel_5.15目录中有一个rootfs_debian_riscv.tar.xz文件,这个文件采用Ubuntu Linux 20.04系统的根文件系统制作而成。

注意,该脚本会使用dd命令生成一个2GB大小的镜像文件,因此主机系统需要保证至少有10 GB的空余磁盘空间。如果需要生成更大的根文件系统镜像文件,可以修改run_rlk_ riscv.sh脚本。

首先,编译内核。

$ cd runninglinuxkernel_5.15
$ ./run_rlk_riscv.sh build_kernel

执行上述脚本可能需要几十分钟时间,具体取决于主机的计算能力。

然后,编译根文件系统。

$ sudo ./run_rlk_riscv.sh build_rootfs

注意,编译根文件系统需要管理员权限,而编译内核则不需要。执行完上述命令后,将会生成名为rootfs_debian_riscv.ext4的根文件系统。

(4)运行刚才编译好的RISC-V版本的Linux系统

要运行run_rlk_riscv.sh脚本,输入“run”即可。

$./run_rlk_riscv.sh run

运行结果如下。

rlk@ runninglinuxkernel_5.15 $ ./run_rlk_riscv.sh run
[   0.000000] OF: fdt: Ignoring memory range 0x80000000 - 0x80200000
[   0.000000] No DTB passed to the kernel
[   0.000000] Linux version 5.15.0+ (rlk@master) (gcc version 9.3.0 (Ubuntu 
9.3.0-17ubuntu1~20.04)) #4 SMP Thu Sep 9 19:14:52 CST 2021
[   0.000000] initrd not found or empty - disabling initrd
[   0.000000] Zone ranges:
[   0.000000]   DMA32    [mem 0x0000000080200000-0x00000000bfffffff]
[   0.000000]   Normal   empty
[   0.000000] Movable zone start for each node
[   0.000000] Early memory node ranges...
...
rlk login:

登录系统时使用的用户名和密码如下。

用户名:root。

密码:123。

(5)在线安装软件包

QEMU虚拟机可以通过VirtIO-Net技术生成虚拟的网卡,并通过网络地址转换(Network Address Translation,NAT)技术和主机进行网络共享。下面使用ifconfig命令检查网络配置。

root@ubuntu:~# ifconfig
enp0s1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.0.2.15  netmask 255.255.255.0  broadcast 10.0.2.255
        inet6 fec0::ce16:adb:3e70:3e71  prefixlen 64  scopeid 0x40<site>
        inet6 fe80::c86e:28c4:625b:2767  prefixlen 64  scopeid 0x20<link>
        ether 52:54:00:12:34:56  txqueuelen 1000  (Ethernet)
        RX packets 23217  bytes 33246898 (31.7 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 4740  bytes 267860 (261.5 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

可以看到,这里生成了名为enp0s1的网卡设备,分配的IP地址为10.0.2.15。

可通过apt update命令更新Debian系统的软件仓库。

root@ubuntu:~# apt update

如果更新失败,有可能是因为计算机系统中的时间比较旧,可以使用date命令设置日期。

root@ubuntu:~# date -s 2024-03-29 #假设最新日期是2024年3月29日
Sun Mar 29 00:00:00 UTC 2024

使用apt install命令安装软件包。比如,在线安装GCC等软件包。

root@ubuntu:~# apt install gcc build-essential

(6)在主机和QEMU虚拟机之间共享文件

主机和QEMU虚拟机可以通过NET_9P技术进行文件共享,这需要QEMU虚拟机和主机的Linux内核都使能NET_9P的内核模块。本实验平台已经支持主机和QEMU虚拟机的文件共享,可以通过一个简单方法来测试。

在Ubuntu主机上复制一个test.c文件到runninglinuxkernel_5.15/kmodules目录。

$ cp test.c  runninglinuxkernel_5.15/kmodules

启动并登录QEMU虚拟机之后,检查一下/mnt目录中是否有test.c文件。

root@ubuntu:/# cd /mnt
root@ubuntu:/mnt # ls
README    test.c

后续的实验(例如,第7章以及第14~16章的部分实验)中会经常用到这个特性,如把编写好的代码文件复制到QEMU虚拟机。