购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.4 QEMU虚拟机与ARM64实验平台

本书中少部分实验可以在ARM64的Linux主机上完成,例如指令集实验和部分高速缓存伪共享实验。ARM64的Linux主机可以通过如下两个方式获取:一种是在树莓派4B上安装树莓派OS,另一种是使用QEMU虚拟机与ARM64实验平台。

第一种方式请参考2.2.2节的介绍,下面介绍QEMU虚拟机与ARM64实验平台。Linux主机使用Ubuntu 20.04系统。

1)安装工具

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

$ sudo apt-get install apt-get install qemu-system-arm libncurses5-dev gcc-aarch64-linux-gnu build-essential git bison flex libssl-dev

然后,在Linux主机系统中默认安装ARM64 GCC的9.3版本。

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

2)下载仓库

下载runninglinuxkernel_5.0的git仓库并切换到runninglinuxkernel_5.0分支。

$ 
$ git clone *****://github.***/runninglinuxkernel/runninglinuxkernel_5.0.git

3)编译内核以及创建文件系统

runninglinuxkernel_5.0目录中有一个rootfs_arm64.tar.xz文件,这个文件基于Ubuntu Linux 20.04系统的根文件系统创建。

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

首先,编译内核。

$ cd runninglinuxkernel_5.0
$ ./run_rlk_arm64.sh build_kernel

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

然后,编译根文件系统。

$ cd runninglinuxkernel_5.0
$ sudo ./run_rlk_arm64.sh build_rootfs

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

4)运行刚才编译好的ARM64版本的Linux系统

要运行run_rlk_arm64.sh脚本,输入run参数即可。

$./run_rlk_arm64.sh run

或者,输入以下代码。

$ qemu-system-aarch64 -m 1024 -cpu max,sve=on,sve256=on -M virt -nographic -smp 4 -kernel arch/arm64/boot/Image  -append "noinintrd sched_debug root=/dev/vda rootfstype=ext4 rw crashkernel=256M loglevel=8"  -drive if=none,file=rootfs_debian_arm64.ext4,id=hd0 -device virtio-blk-device,drive=hd0 --fsdev local,id=kmod_dev,path=./kmodules,security_model=none -device virtio-9p-pci,fsdev=kmod_dev,mount_tag=kmod_mount

运行结果如下。

rlk@ runninglinuxkernel_5.0 $ ./run_rlk_arm64.sh run
[    0.000000] Booting Linux on physical CPU 0x0000000000 [0x411fd070]
[    0.000000] Linux version 5.0.0+ (rlk@ubuntu) (gcc version 9.3.0 (Ubuntu 9.3.0-8ubuntu1)) #5 SMP Sat Mar 28 22:05:46 PDT 2020
[    0.000000] Machine model: linux,dummy-virt
[    0.000000] efi: Getting EFI parameters from FDT:
[    0.000000] efi: UEFI not found.
[    0.000000] crashkernel reserved: 0x0000000070000000 - 0x0000000080000000 (256 MB)
[    0.000000] cma: Reserved 64 MiB at 0x000000006c000000
[    0.000000] NUMA: No NUMA configuration found
[    0.000000] NUMA: Faking a node at [mem 0x0000000040000000-0x000000007fffffff]
[    0.000000] NUMA: NODE_DATA [mem 0x6bdf0f00-0x6bdf1fff]
[    0.000000] Zone ranges:
[    0.000000]   Normal   [mem 0x0000000040000000-0x000000007fffffff]
[    0.000000] Movable zone start for each node
[    0.000000] Early memory node ranges
…
[    2.269567] systemd[1]: systemd 245.2-1ubuntu2 running in system mode.
Ubuntu Focal Fossa (development branch) ubuntu ttyAMA0
rlk login:

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

●用户名:root。

●密码:123。

5)在线安装软件包

QEMU虚拟机可以通过VirtIO-Net技术来生成虚拟的网卡,并通过NAT(Network Address Translation,网络地址转换)技术和主机进行网络共享。下面使用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 2020-03-29 #假设最新日期是2020年3月29日
Sun Mar 29 00:00:00 UTC 2020

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

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

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

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

首先,复制一个文件到runninglinuxkernel_5.0/kmodules目录中。

$ cp test.c  runninglinuxkernel_5.0/kmodules

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

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

后续的实验(例如第22章和第23章的实验)会经常利用这个特性,比如把编写好的代码文件放入QEMU虚拟机。 1ik6WW1vOzVwwLvagSpLs/7v7U4PCYDAqE4Rs2tG5s44nwPzEWrBqIg5mBgPS6zJ

点击中间区域
呼出菜单
上一章
目录
下一章
×