官网:https://www.xhypervisor.org/
quick-start 文档:https://github.com/xvisor/xvisor/blob/master/docs/riscv/riscv64-qemu.txt
零、Xvisor 介绍
下面这部分是 Xvisor 官方的介绍
Xvisor® 是一款开源的 Type-1 虚拟机管理程序,旨在提供一种整体式、轻量级、可移植且灵活的虚拟化解决方案。
它为 ARMv7a-ve、ARMv8a、x86_64、RISC-V 及其他 CPU 架构提供高性能、低内存占用的虚拟化方案。与其他 ARM 平台的虚拟机管理程序相比,Xvisor 是少数支持具有 ARM 虚拟化扩展的 32 位 ARM 处理器的方案之一。而在 RISC-V 领域,Xvisor 是全球首款 Type-1 RISC-V 虚拟机管理程序。
Xvisor 具有高度的可移植性,只要目标架构具备分页内存管理单元(PMMU)并支持 GNU C 编译器(GCC),就可以轻松移植到大多数通用的 32 位或 64 位架构上。
Xvisor 主要支持完全虚拟化,因此可以运行各种未经修改的客户机操作系统。同时,Xvisor 也提供可选的半虚拟化支持,并采用与架构无关的方式(如 VirtIO PCI/MMIO 设备),以确保客户机操作系统无需修改即可使用半虚拟化功能。
Xvisor 拥有现代虚拟机管理程序所具备的大部分关键特性,包括:[基于设备树的配置]、无滴答(tickless)和高精度计时、线程管理框架、主机设备驱动框架、I/O 设备仿真框架、可运行时加载的模块、直通硬件访问、动态客户机创建与销毁、管理终端、网络虚拟化、输入设备虚拟化、显示设备虚拟化等。
根据主机硬件访问、CPU 虚拟化和客户机 I/O 仿真方式的不同,虚拟机管理程序可以分为以下三类:
- 完全宏内核化(Complete Monolithic):完全宏内核化虚拟机管理程序(如 Xvisor)采用统一的软件架构,负责主机硬件访问、CPU 虚拟化和客户机 I/O 仿真。
- 部分宏内核化(Partially Monolithic):部分宏内核化虚拟机管理程序(如 KVM)通常是通用宏内核操作系统(如 Linux®、FreeBSD®、NetBSD® 等)的扩展,其内核负责主机硬件访问和 CPU 虚拟化,而客户机 I/O 仿真则由用户态软件(如 QEMU®)完成。
- 微内核化(Micro-kernelized):微内核化虚拟机管理程序(如 Xen®)通常采用轻量级微内核,在内核中提供基础的主机硬件访问和 CPU 虚拟化,其余功能依赖管理客户机(如 Xen 的 Dom0),后者负责完整的主机硬件访问、管理接口以及客户机 I/O 仿真。
Xvisor 是一个完全宏内核化的虚拟机管理程序,而大多数开源虚拟机管理程序要么是部分宏内核化的,要么是微内核化的。
个人认为的几个关注点:
- Xvisor 基于设备树的配置(使用设备树作为 guest 资源的配置文件,使用时注意区分其和 Linux 使用的设备树)
- Xvisor 有管理终端,可以通过命令进行动态客户机创建与销毁
- Xvisor 是一个宏内核化 Type-1 Hypervisor,本身包含设备驱动,支持全虚拟化和半虚拟化
启动 Xvisor 需要
- Xvisor 自身的镜像文件 vmm.bin
- xvisor 使用的根文件系统 disk.img,包含配置 Guest Linux 资源的配置文件(设备树),Guest Linux Image、Guest Linux 使用的设备树等内容
一、根据 Xvisor 的文档准备镜像
对 docs/riscv/riscv64-qemu.txt 的部分进行了划分,使整体结构更清晰
- Xvisor 镜像
- Xvisor 启动 Guest 时,先执行 Basic Firmware(执行一些准备工作),然后跳转执行 Guest Image
- Basic Firmware 也就是虚拟的固件程序,完成一些 Guest 执行前的初始化工作,例如搬运数据到内存
- OpenSBI
- Linux
- Xvisor 使用根文件系统
CROSS_COMPILE=riscv64-unknown-linux-gnu-# 1. Build Xvisor
cd <xvisor_source_directory>
make ARCH=riscv generic-64b-defconfig
make# Build Basic Firmware
make -C tests/riscv/virt64/basic# 2. Build OpenSBI
cd <opensbi_source_directory>
make PLATFORM=generic# 3. Build Linux
cd <linux_source_directory>
cp arch/riscv/configs/defconfig arch/riscv/configs/tmp-virt64_defconfig
<xvisor_source_directory>/tests/common/scripts/update-linux-defconfig.sh -p arch/riscv/configs/tmp-virt64_defconfig -f <xvisor_source_directory>/tests/riscv/virt64/linux/linux_extra.config
make O=<linux_build_directory> ARCH=riscv tmp-virt64_defconfig
make O=<linux_build_directory> ARCH=riscv Image dtbs# 4. Create disk image for Xvisor
cd <xvisor_source_directory>
mkdir -p ./build/disk/tmp
mkdir -p ./build/disk/system
cp -f ./docs/banner/roman.txt ./build/disk/system/banner.txt
cp -f ./docs/logo/xvisor_logo_name.ppm ./build/disk/system/logo.ppm
mkdir -p ./build/disk/images/riscv/virt64
# 4.0 准备 Guest 的配置文件(设备树配置)
dtc -q -I dts -O dtb -o ./build/disk/images/riscv/virt64-guest.dtb ./tests/riscv/virt64/virt64-guest.dts
# 4.1 拷贝 basic firmware
cp -f ./build/tests/riscv/virt64/basic/firmware.bin ./build/disk/images/riscv/virt64/firmware.bin
cp -f ./tests/riscv/virt64/linux/nor_flash.list ./build/disk/images/riscv/virt64/nor_flash.list
cp -f ./tests/riscv/virt64/linux/cmdlist ./build/disk/images/riscv/virt64/cmdlist
cp -f ./tests/riscv/virt64/xscript/one_guest_virt64.xscript ./build/disk/boot.xscript # 自动执行,类似于 Linux 使用的 init
# 4.2 拷贝 Guest Linux Image
cp -f ~/riscv-linux-devel/arch/riscv/boot/Image ./build/disk/images/riscv/virt64/Image # Linux Image
# 4.3 准备 Guest Linux 使用的设备树
dtc -q -I dts -O dtb -o ./build/disk/images/riscv/virt64/virt64.dtb ./tests/riscv/virt64/linux/virt64.dts
# 4.4 拷贝 Guest Linux 使用的 rootfs
cp -f ../busybox-1.33.1/rootfs.img ./build/disk/images/riscv/virt64/rootfs.img # Linux rootfs
genext2fs -B 1024 -b 32768 -d ./build/disk ./build/disk.img
二、在 Qemu 中运行
Xvisor 具备解析设备树的能力,借助设备树探测并驱动设备
并且会执行启动参数中的 vmm.bootcmd 命令
Launch QEMU
qemu-system-riscv64 -M virt -m 512M -nographic \-kernel ./build/vmm.bin \-initrd ./build/disk.img \-append 'vmm.bootcmd="vfs mount initrd /;vfs run /boot.xscript;vfs cat /system/banner.txt"'
启动 Guest Linux
# 1. Kick Guest0 to start Basic Firmware
XVisor# guest kick guest0
# 2. Bind to virtual UART
XVisor# vserial bind guest0/uart0
# 3. Copy linux from NOR flash to RAM and start linux booting from RAM, 执行 cmdlist
[guest0/uart0] basic# autoexec
# 4. Wait for Linux prompt to come-up and then try out some commands
[guest0/uart0] / # ls
(Note: "autoexec" is a short-cut command)
(Note: The <xvisor_source_directory>/tests/riscv/virt64/linux/cmdlist file which we have added to guest NOR flash contains set of commands for booting linux from NOR flash)
Enter character seqence 'ESCAPE+x+q" return to Xvisor prompt]
[guest0/uart0] / #
进入 xvisor
进入 guest linux
补充:【已经过验证】
Xvisor 包含了中断控制器的驱动,Xvisor 自身可以驱动 AIA 硬件,并可以提供虚拟的 PLIC 供 Guest 使用