当前位置: 首页 > news >正文

初学 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 需要

  1. Xvisor 自身的镜像文件 vmm.bin
  2. 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

官网&#xff1a;https://www.xhypervisor.org/ quick-start 文档&#xff1a;https://github.com/xvisor/xvisor/blob/master/docs/riscv/riscv64-qemu.txt 零、Xvisor 介绍 下面这部分是 Xvisor 官方的介绍 Xvisor 是一款开源的 Type-1 虚拟机管理程序&#xff0c;旨在提供一…...

深度内容运营与开源AI智能名片2+1链动模式S2B2C商城小程序在打造种草社区中的应用研究

摘要&#xff1a;移动互联网的迅猛发展极大地改变了消费者的购物行为和消费习惯&#xff0c;传统的购物体验已难以满足用户日益增长的个性化需求。在这种背景下&#xff0c;深度内容运营和实时互动成为提升用户购物体验、影响用户购物行为的重要手段。同时&#xff0c;开源AI智…...

RNN/LSTM/GRU 学习笔记

文章目录 RNN/LSTM/GRU一、RNN1、为何引入RNN&#xff1f;2、RNN的基本结构3、各种形式的RNN及其应用4、RNN的缺陷5、如何应对RNN的缺陷&#xff1f;6、BPTT和BP的区别 二、LSTM1、LSTM 简介2、LSTM如何缓解梯度消失与梯度爆炸&#xff1f; 三、GRU四、参考文献 RNN/LSTM/GRU …...

音频录制一般在什么情况下会选择保存为PCM?什么情况会选择保存为WAV?

在音频开发中&#xff0c;选择保存为 PCM 或 WAV 格式取决于具体的应用场景和需求。以下是两种格式的特点以及适用场景的分析&#xff1a; PCM 格式 特点&#xff1a; 原始音频数据&#xff1a; PCM 是未压缩的原始音频数据&#xff0c;没有任何文件头或元数据。数据直接以二进…...

C#常用744单词

1.visual 可见的 2.studio 工作室 3.dot 点 4.net 网 5.harp 尖端的&#xff0c;锋利的。 6.amework 骨架&#xff0c;构架&#xff0c;框架 7.beta 测试版&#xff0c;试用版 8.XML&#xff08;全称&#xff1a;eXtensible Markup Language&#xff09…...

如何理解算法的正确性?

循环不变式&#xff08;Loop Invariant&#xff09; 是算法设计和程序验证中的一个核心概念&#xff0c;用于证明循环的正确性。它是在循环的每次迭代开始和结束时均保持为真的一种条件或性质&#xff0c;帮助开发者确保循环按预期工作&#xff0c;最终达到目标状态。 循环不变…...

蓝桥杯试题:排序

一、问题描述 给定 nn 个正整数 a1,a2,…,ana1​,a2​,…,an​&#xff0c;你可以将它们任意排序。现要将这 nn 个数字连接成一排&#xff0c;即令相邻数字收尾相接&#xff0c;组成一个数。问&#xff0c;这个数最大可以是多少。 输入格式 第一行输入一个正整数 nn&#xff…...

实验十一 Servlet(二)

实验十一 Servlet(二) 【实验目的】 1&#xff0e;了解Servlet运行原理 2&#xff0e;掌握Servlet实现方式 【实验内容】 改造实验10&#xff0c;引入数据库&#xff0c;创建用户表&#xff0c;包括用户名和密码&#xff1a;客户端通过login.jsp发出登录请求&#xff0c;请求…...

第五天 初步了解ArkTS和ArkUI

初步了解ArkTS和ArkUI&#xff0c;可以从以下几个方面进行概述&#xff1a; 一、ArkTS简介 定义与关系&#xff1a; ArkTS是HarmonyOS&#xff08;鸿蒙系统&#xff09;优选的主力应用开发语言。它基于TypeScript&#xff08;TS&#xff09;进行扩展&#xff0c;兼容TS的所有特…...

java中的锁面试题

1、多线程中 synchronized 锁升级的原理是什么&#xff1f; synchronized 是JVM层面的锁&#xff0c;是 Java 关键字&#xff0c;通过 monitor 对象来完成&#xff0c;synchronized 的实现涉及到锁的升级&#xff0c;具体为无锁、偏向锁、自旋锁、重量级锁 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

来自于&#xff1a;Knowledge Distillation Tutorial 将大模型蒸馏为小模型&#xff0c;可以节省计算资源&#xff0c;加快推理过程&#xff0c;更高效的运行。 使用CIFAR-10数据集 import torch import torch.nn as nn import torch.optim as optim import torchvision.tran…...

DeepSeek各版本说明与优缺点分析

DeepSeek各版本说明与优缺点分析 DeepSeek是最近人工智能领域备受瞩目的一个语言模型系列&#xff0c;其在不同版本的发布过程中&#xff0c;逐步加强了对多种任务的处理能力。本文将详细介绍DeepSeek的各版本&#xff0c;从版本的发布时间、特点、优势以及不足之处&#xff0…...

java进阶专栏的学习指南

学习指南 java类和对象java内部类和常用类javaIO流 java类和对象 类和对象 java内部类和常用类 java内部类精讲Object类包装类的认识String类、BigDecimal类初探Date类、Calendar类、SimpleDateFormat类的认识java Random类、File类、System类初识 javaIO流 java IO流【…...

kamailio-osp模块

该文档详细讲解了如何在Kamailio中配置和使用OSP模块&#xff08;Open Settlement Protocol Module&#xff09;&#xff0c;以实现基于ETSI标准的安全多边对等互联&#xff08;Secure Multi-Lateral Peering&#xff09;。以下是核心内容的总结&#xff1a; 1. 模块功能 OSP模…...

【TensorFlow】T1:实现mnist手写数字识别

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;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、在组件中使用 受控组件 表单元素的状态&#xff08;值&#xff09;由 React 组件的 state 完全控制。组件的 state 保存了表单元素的值&#xff0c;并且每次用户输入时&#xff0c;React 通过事件处理程序来更新 …...

Ollama+deepseek+Docker+Open WebUI实现与AI聊天

1、下载并安装Ollama 官方网址&#xff1a;Ollama 安装好后&#xff0c;在命令行输入&#xff0c; ollama --version 返回以下信息&#xff0c;则表明安装成功&#xff0c; 2、 下载AI大模型 这里以deepseek-r1:1.5b模型为例&#xff0c; 在命令行中&#xff0c;执行&…...

DEEPSEKK GPT等AI体的出现如何重构工厂数字化架构:从设备控制到ERP MES系统的全面优化

随着深度学习&#xff08;DeepSeek&#xff09;、GPT等先进AI技术的出现&#xff0c;工厂的数字化架构正在经历前所未有的变革。AI的强大处理能力、预测能力和自动化决策支持&#xff0c;将大幅度提升生产效率、设备管理、资源调度以及产品质量管理。本文将探讨AI体&#xff08…...

(十)学生端搭建

本次旨在将之前的已完成的部分功能进行拼装到学生端&#xff0c;同时完善学生端的构建。本次工作主要包括&#xff1a; 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度&#xff08;创建索引的主要原因&#xff09;。3. 可以加速表和表之间的连接&#xff0c;实现数据的参考完整性。4. 可以在查询过程中&#xff0c;…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

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 证书

&#x1f511; 1. ​​生成 SSH 密钥对​​ 在终端&#xff08;Windows 使用 Git Bash&#xff0c;Mac/Linux 使用 Terminal&#xff09;执行命令&#xff1a; ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" ​​参数说明​​&#xff1a; -t rsa&#x…...

数据链路层的主要功能是什么

数据链路层&#xff08;OSI模型第2层&#xff09;的核心功能是在相邻网络节点&#xff08;如交换机、主机&#xff09;间提供可靠的数据帧传输服务&#xff0c;主要职责包括&#xff1a; &#x1f511; 核心功能详解&#xff1a; 帧封装与解封装 封装&#xff1a; 将网络层下发…...

【HTTP三个基础问题】

面试官您好&#xff01;HTTP是超文本传输协议&#xff0c;是互联网上客户端和服务器之间传输超文本数据&#xff08;比如文字、图片、音频、视频等&#xff09;的核心协议&#xff0c;当前互联网应用最广泛的版本是HTTP1.1&#xff0c;它基于经典的C/S模型&#xff0c;也就是客…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

C# 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...