初学 Xvisor 之理解并跑通 Demo
官网: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 使用
相关文章:
初学 Xvisor 之理解并跑通 Demo
官网:https://www.xhypervisor.org/ quick-start 文档:https://github.com/xvisor/xvisor/blob/master/docs/riscv/riscv64-qemu.txt 零、Xvisor 介绍 下面这部分是 Xvisor 官方的介绍 Xvisor 是一款开源的 Type-1 虚拟机管理程序,旨在提供一…...
深度内容运营与开源AI智能名片2+1链动模式S2B2C商城小程序在打造种草社区中的应用研究
摘要:移动互联网的迅猛发展极大地改变了消费者的购物行为和消费习惯,传统的购物体验已难以满足用户日益增长的个性化需求。在这种背景下,深度内容运营和实时互动成为提升用户购物体验、影响用户购物行为的重要手段。同时,开源AI智…...
RNN/LSTM/GRU 学习笔记
文章目录 RNN/LSTM/GRU一、RNN1、为何引入RNN?2、RNN的基本结构3、各种形式的RNN及其应用4、RNN的缺陷5、如何应对RNN的缺陷?6、BPTT和BP的区别 二、LSTM1、LSTM 简介2、LSTM如何缓解梯度消失与梯度爆炸? 三、GRU四、参考文献 RNN/LSTM/GRU …...
音频录制一般在什么情况下会选择保存为PCM?什么情况会选择保存为WAV?
在音频开发中,选择保存为 PCM 或 WAV 格式取决于具体的应用场景和需求。以下是两种格式的特点以及适用场景的分析: PCM 格式 特点: 原始音频数据: PCM 是未压缩的原始音频数据,没有任何文件头或元数据。数据直接以二进…...
C#常用744单词
1.visual 可见的 2.studio 工作室 3.dot 点 4.net 网 5.harp 尖端的,锋利的。 6.amework 骨架,构架,框架 7.beta 测试版,试用版 8.XML(全称:eXtensible Markup Language)…...
如何理解算法的正确性?
循环不变式(Loop Invariant) 是算法设计和程序验证中的一个核心概念,用于证明循环的正确性。它是在循环的每次迭代开始和结束时均保持为真的一种条件或性质,帮助开发者确保循环按预期工作,最终达到目标状态。 循环不变…...
蓝桥杯试题:排序
一、问题描述 给定 nn 个正整数 a1,a2,…,ana1,a2,…,an,你可以将它们任意排序。现要将这 nn 个数字连接成一排,即令相邻数字收尾相接,组成一个数。问,这个数最大可以是多少。 输入格式 第一行输入一个正整数 nnÿ…...
实验十一 Servlet(二)
实验十一 Servlet(二) 【实验目的】 1.了解Servlet运行原理 2.掌握Servlet实现方式 【实验内容】 改造实验10,引入数据库,创建用户表,包括用户名和密码:客户端通过login.jsp发出登录请求,请求…...
第五天 初步了解ArkTS和ArkUI
初步了解ArkTS和ArkUI,可以从以下几个方面进行概述: 一、ArkTS简介 定义与关系: ArkTS是HarmonyOS(鸿蒙系统)优选的主力应用开发语言。它基于TypeScript(TS)进行扩展,兼容TS的所有特…...
java中的锁面试题
1、多线程中 synchronized 锁升级的原理是什么? synchronized 是JVM层面的锁,是 Java 关键字,通过 monitor 对象来完成,synchronized 的实现涉及到锁的升级,具体为无锁、偏向锁、自旋锁、重量级锁 synchronized 锁升级…...
ES6 变量解构赋值总结
1. 数组的解构赋值 1.1 基本用法 // 基本数组解构 const [a, b, c] [1, 2, 3]; console.log(a); // 1 console.log(b); // 2 console.log(c); // 3// 跳过某些值 const [x, , y] [1, 2, 3]; console.log(x); // 1 console.log(y); // 3// 解构剩余元素 const [first, ...re…...
知识蒸馏教程 Knowledge Distillation Tutorial
来自于:Knowledge Distillation Tutorial 将大模型蒸馏为小模型,可以节省计算资源,加快推理过程,更高效的运行。 使用CIFAR-10数据集 import torch import torch.nn as nn import torch.optim as optim import torchvision.tran…...
DeepSeek各版本说明与优缺点分析
DeepSeek各版本说明与优缺点分析 DeepSeek是最近人工智能领域备受瞩目的一个语言模型系列,其在不同版本的发布过程中,逐步加强了对多种任务的处理能力。本文将详细介绍DeepSeek的各版本,从版本的发布时间、特点、优势以及不足之处࿰…...
java进阶专栏的学习指南
学习指南 java类和对象java内部类和常用类javaIO流 java类和对象 类和对象 java内部类和常用类 java内部类精讲Object类包装类的认识String类、BigDecimal类初探Date类、Calendar类、SimpleDateFormat类的认识java Random类、File类、System类初识 javaIO流 java IO流【…...
kamailio-osp模块
该文档详细讲解了如何在Kamailio中配置和使用OSP模块(Open Settlement Protocol Module),以实现基于ETSI标准的安全多边对等互联(Secure Multi-Lateral Peering)。以下是核心内容的总结: 1. 模块功能 OSP模…...
【TensorFlow】T1:实现mnist手写数字识别
🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 1、设置GPU import tensorflow as tf gpus tf.config.list_physical_devices("GPU")if gpus:gpu0 gpus[0]tf.config.experimental.set_memory_g…...
Rapidjson 实战
Rapidjson 是一款 C 的 json 库. 支持处理 json 格式的文档. 其设计风格是头文件库, 包含头文件即可使用, 小巧轻便并且性能强悍. 本文结合样例来介绍 Rapidjson 一些常见的用法. 环境要求 有如何的几种方法可以将 Rapidjson 集成到您的项目中. Vcpkg安装: 使用 vcpkg instal…...
【React】受控组件和非受控组件
目录 受控组件非受控组件基于ref获取DOM元素1、在标签中使用2、在组件中使用 受控组件 表单元素的状态(值)由 React 组件的 state 完全控制。组件的 state 保存了表单元素的值,并且每次用户输入时,React 通过事件处理程序来更新 …...
Ollama+deepseek+Docker+Open WebUI实现与AI聊天
1、下载并安装Ollama 官方网址:Ollama 安装好后,在命令行输入, ollama --version 返回以下信息,则表明安装成功, 2、 下载AI大模型 这里以deepseek-r1:1.5b模型为例, 在命令行中,执行&…...
DEEPSEKK GPT等AI体的出现如何重构工厂数字化架构:从设备控制到ERP MES系统的全面优化
随着深度学习(DeepSeek)、GPT等先进AI技术的出现,工厂的数字化架构正在经历前所未有的变革。AI的强大处理能力、预测能力和自动化决策支持,将大幅度提升生产效率、设备管理、资源调度以及产品质量管理。本文将探讨AI体(…...
(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...
【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...
QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...
如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...
C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
