跳到主要内容

基于 OpenSBI-H 的 KVM 虚拟化

RevyOS 为 TH1520 平台提供基于 OpenSBI-H 的 KVM 虚拟化。

目前已验证支持的开发板:

  • Milk-V Meles
  • Sipeed Lichee Pi 4A
注意

TH1520 平台的 OpenSBI-H 为实验性支持。 可能会遇到 KVM 启动时间久、控制台输出缓慢、特定场景性能下降严重等问题。

软件包安装

备注

旧版本系统不被支持,请使用最新版本镜像。

在安装之前,请务必执行一次全系统更新,并安装 6.6.77 版本内核。此版本附带了 kvm 内核模块。

安装结束后,重启系统。

sudo apt update; sudo apt upgrade -y
sudo apt install -y th1520-mainline-opensbi-h qemu-system wget linux-image-6.6.77-th1520
# 如需使用 U-Boot 引导 VM:
# sudo apt install -y u-boot-qemu
sudo reboot

验证

若您的开发板已连接 UART 串口,则可以在启动时的串口打印中看到类似如下字样:

Hypervisor Extension      : Emulated
Shadow PT Space Base : 0x3ff000000
Shadow PT Space Size : 4096 pages

此外,进入系统后,可检查 /proc/cpuinfo

grep isa /proc/cpuinfo

应当会输出类似如下内容(可以看到每个核心的 ISA 部分增加了 H 扩展):

processor       : 0
hart : 0
isa : rv64imafdch_zicntr_zicsr_zifencei_zihpm_xtheadvector
mmu : sv39
uarch : thead,c910
mvendorid : 0x5b7
marchid : 0x0
mimpid : 0x0

processor : 1
hart : 1
isa : rv64imafdch_zicntr_zicsr_zifencei_zihpm_xtheadvector
mmu : sv39
uarch : thead,c910
mvendorid : 0x5b7
marchid : 0x0
mimpid : 0x0

processor : 2
hart : 2
isa : rv64imafdch_zicntr_zicsr_zifencei_zihpm_xtheadvector
mmu : sv39
uarch : thead,c910
mvendorid : 0x5b7
marchid : 0x0
mimpid : 0x0

processor : 3
hart : 3
isa : rv64imafdch_zicntr_zicsr_zifencei_zihpm_xtheadvector
mmu : sv39
uarch : thead,c910
mvendorid : 0x5b7
marchid : 0x0
mimpid : 0x0

使用

加载 kvm 内核模块。

sudo modprobe kvm

检查 dmesg

$ sudo dmesg | grep kvm
[ 1645.703407] kvm [762]: hypervisor extension available
[ 1645.708548] kvm [762]: using Sv39x4 G-stage page table format
[ 1645.714352] kvm [762]: VMID 0 bits available

我们提供了一个基于 busybox 的 KVM demo,其中附带了一份静态编译的 coremark 二进制,可自行取用。

注意

您可能会发现 coremark 执行速度非常慢,这是预期结果。 目前的性能测试结果可能无法反映 VM 的真实性能。

wget https://mirror.iscas.ac.cn/revyos/extra/kvm_demo/rootfs_kvm_guest.img \
https://mirror.iscas.ac.cn/revyos/extra/kvm_demo/start_vm.sh \
https://mirror.iscas.ac.cn/revyos/extra/kvm_demo/Image \

启动 KVM:

chmod +x start_vm.sh; ./start_vm.sh

qemu-system-riscv64 的如下警告是预期的,可安全忽略:

qemu-system-riscv64: warning: disabling h extension for hart 0x0 because privilege spec version does not match
qemu-system-riscv64: warning: disabling zba extension for hart 0x0 because privilege spec version does not match
qemu-system-riscv64: warning: disabling zbb extension for hart 0x0 because privilege spec version does not match
qemu-system-riscv64: warning: disabling zbc extension for hart 0x0 because privilege spec version does not match
qemu-system-riscv64: warning: disabling zbs extension for hart 0x0 because privilege spec version does not match
qemu-system-riscv64: warning: disabling sstc extension for hart 0x0 because privilege spec version does not match
qemu-system-riscv64: warning: disabling h extension for hart 0x1 because privilege spec version does not match
qemu-system-riscv64: warning: disabling zba extension for hart 0x1 because privilege spec version does not match
qemu-system-riscv64: warning: disabling zbb extension for hart 0x1 because privilege spec version does not match
qemu-system-riscv64: warning: disabling zbc extension for hart 0x1 because privilege spec version does not match
qemu-system-riscv64: warning: disabling zbs extension for hart 0x1 because privilege spec version does not match
qemu-system-riscv64: warning: disabling sstc extension for hart 0x1 because privilege spec version does not match

Enter 激活终端:

[   13.274754] Run /init as init process
_ _
| ||_|
| | _ ____ _ _ _ _
| || | _ \| | | |\ \/ /
| || | | | | |_| |/ \
|_||_|_| |_|\____|\_/\_/

Busybox Rootfs

Please press Enter to activate this console.
/ #

屏幕录像(运行在 Milk-V Meles 上):

asciicast

CoreMark 结果如下:

/ # coremark
2K performance run parameters for coremark.
CoreMark Size : 666
Total ticks : 19343
Total time (secs): 19.343000
Iterations/Sec : 10339.657757
Iterations : 200000
Compiler version : GCC13.2.0
Compiler flags : -O2 -lrt
Memory location : Please put data memory location here
(e.g. code in flash, data on heap etc)
seedcrc : 0xe9f5
[0]crclist : 0xe714
[0]crcmatrix : 0x1fd7
[0]crcstate : 0x8e3a
[0]crcfinal : 0x4983
Correct operation validated. See README.md for run and reporting rules.
CoreMark 1.0 : 10339.657757 / GCC13.2.0 -O2 -lrt / Heap
/ #

恢复

恢复原本的 OpenSBI,然后重启即可。

sudo apt install th1520-mainline-opensbi -y

致谢