- RISC-V體系結構編程與實踐(第2版)
- 笨叔
- 1070字
- 2024-09-23 17:56:01
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虛擬機。