初学 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体(…...
QMK Toolbox:机械键盘固件定制与刷写全攻略
QMK Toolbox:机械键盘固件定制与刷写全攻略 【免费下载链接】qmk_toolbox A Toolbox companion for QMK Firmware 项目地址: https://gitcode.com/gh_mirrors/qm/qmk_toolbox 一、核心价值:重新定义键盘控制自由 QMK Toolbox 作为开源硬件领域的…...
AEB紧急制动系统与carsim及simulink联仿技术:卓越效果与性能的完美结合
紧急制动系统AEB,carsim与simulink联仿,效果极好 ,踩下刹车的那一刻,方向盘突然传来剧烈震动。盯着屏幕里那辆虚拟的前车尾灯,我手心全是汗——这已经是今天第三次测试紧急制动了。Carsim里那台SUV正以60km/h的速度冲向…...
工业数智化转型路径:JBoltAI 工具与定制化服务实践
当前,我国工业数智化已进入高质量发展、规模化推广的新阶段,成为推动制造业转型升级、构建先进工业体系的核心动力。结合行业发展现状与企业实际需求,JBoltAI推出针对性数智化工具及定制服务,为工业企业转型提供实用支撑。一、工业…...
面向对象编程入门(下篇):继承、封装与多态
在上篇中,我们学会了如何定义类和创建对象,将现实世界的事物用代码表示。今天,我们将深入面向对象编程的三大核心特性:继承、封装和多态。这些特性将让你的代码更加灵活、可扩展和易维护。一、继承:代码复用的“家族传…...
VRM-Addon-for-Blender:虚拟角色创作全流程指南
VRM-Addon-for-Blender:虚拟角色创作全流程指南 【免费下载链接】VRM-Addon-for-Blender VRM Importer, Exporter and Utilities for Blender 2.93 or later 项目地址: https://gitcode.com/gh_mirrors/vr/VRM-Addon-for-Blender VRM-Addon-for-Blender是一款…...
如何通过Universal Android Debloater实现Android设备深度优化
如何通过Universal Android Debloater实现Android设备深度优化 【免费下载链接】universal-android-debloater Cross-platform GUI written in Rust using ADB to debloat non-rooted android devices. Improve your privacy, the security and battery life of your device. …...
tcc-g15: 开源散热管理工具实战指南
tcc-g15: 开源散热管理工具实战指南 【免费下载链接】tcc-g15 Thermal Control Center for Dell G15 - open source alternative to AWCC 项目地址: https://gitcode.com/gh_mirrors/tc/tcc-g15 Thermal Control Center(tcc-g15)是一款专为Dell G…...
OpenClaw多模型管理:同时接入百川2-13B-4bits与其他开源大模型
OpenClaw多模型管理:同时接入百川2-13B-4bits与其他开源大模型 1. 为什么需要多模型管理? 去年冬天,我尝试用OpenClaw自动化处理一批技术文档的翻译和摘要任务时,遇到了一个典型问题:当处理简单段落翻译时࿰…...
零代码玩转OpenClaw:ollama-QwQ-32B自动化脚本生成教程
零代码玩转OpenClaw:ollama-QwQ-32B自动化脚本生成教程 1. 为什么选择OpenClawollama-QwQ-32B组合? 上周我在整理旅行照片时,面对上千张命名混乱的图片文件,突然意识到:这不正是测试OpenClaw自动化能力的绝佳场景吗&…...
全基因组序列比对工具mVISTA的保姆级使用指南:从文件准备到结果解读
全基因组序列比对工具mVISTA的保姆级使用指南:从文件准备到结果解读 在基因组学研究领域,序列比对是揭示物种间进化关系、识别保守区域和功能元件的基础操作。mVISTA作为一款专门用于全基因组序列比对的在线工具,凭借其直观的可视化界面和强…...
