本书少部分实验(如指令集实验和部分高速缓存伪共享实验)可以在基于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大小的镜像文件,因此主机系统需要保证至少有10GB的空余磁盘空间。如果需要生成更大的根文件系统镜像文件,可以修改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虚拟机。