RISCV虚拟化环境搭建

概要

本文记搭建 RISCV 虚拟化环境的流程。

整体架构

我们使用 QEMU 来模拟 RISCV 的各种硬件扩展环境,通过 QEMU 启动 Ubuntu 作为我们的 Host 来在 Host 之中通过 KVMTOOL 来运行 Guest,学习 RISCV 的虚拟化。

目前我的 X86_64 主机使用的是 Ubuntu 的 22.04 桌面版。具体如下:

Linux ovo-ovo 6.8.0-52-generic #53~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Wed Jan 15 19:18:46 UTC 2 x86_64 x86_64 x86_64 GNU/Linux

准备 Ubuntu 镜像

打开终端,执行以下命令,下载镜像。

wget https://old-releases.ubuntu.com/releases/22.04.4/ubuntu-22.04-preinstalled-server-riscv64+unmatched.img.xz

解压缩系统镜像文件然后扩个容。

xz -d ubuntu-22.04-preinstalled-server-riscv64+unmatched.img.xz
qemu-img resize ubuntu-22.04-preinstalled-server-riscv64+unmatched.img +20G

编译 QEMU-v9.2.2

考虑到直接使用 apt 命令安装的 QEMU 可能不支持 RISC-V 虚拟化扩展。所以直接下载源码编译。

安装编译前所需工具

sudo apt install autoconf automake autotools-dev curl libmpc-dev libmpfr-dev libgmp-dev \gawk build-essential bison flex texinfo gperf libtool patchutils bc \zlib1g-dev libexpat-dev git ninja-build \libglib2.0-dev libfdt-dev libpixman-1-dev
# 根据 python 版本调整版本号
sudo apt-get install python3.12-venv

QEMU 的 user 用户模式网络配置需要 libslirp 的支持

下载 libslirp 源码和编译所需工具

git clone https://gitlab.freedesktop.org/slirp/libslirp.git
sudo apt install meson

libslirp 编译,安装

meson build
ninja -C build install

下载 QEMU 源码

git clone https://gitee.com/popukey/qemu.git

切换到目标版本。

git checkout v9.2.2

编译 RV64 架构下的 QEMU:qemu-system-riscv64

cd qemu && ./configure --target-list=riscv64-softmmu --enable-slirp  && make -j 8

编译结束之后生成的可执行文件位于 QEMU 目录下的 build 目录中。

把该路径在 ~/.bashrc 文件最后写入环境变量 PATH

export PATH="\$HOME/riscv64-qemu/qemu/build/:\$PATH"
source ~/.bashrc

确保修改生效。qemu-system-riscv64 --version 通过该命令验证 QEMU 版本正确。

安装最新 U-Boot 和 OpenSBI-v1.6

交叉编译工具

编译需要交叉编译工具 riscv64-unknown-linux-gnu-gcc,RISCV 仓库中有编译好的,这里我使用当前最新的会出错,需要我更新 libc 到 2.38。遂放弃。使用低一点的版本。

wget https://github.com/riscv-collab/riscv-gnu-toolchain/releases/download/2024.09.03/riscv64-glibc-ubuntu-22.04-gcc-nightly-2024.09.03-nightly.tar.gz
mkdir riscv
tar -xf riscv64-glibc-ubuntu-22.04-gcc-nightly-2024.09.03-nightly.tar.gz -C riscv --strip-components=1

把目录加入 PATH 中,方便后续使用。把下面内容放入 ~/.bashrc 文件最末尾。

export PATH="$HOME/crossTools/riscv/bin/:$PATH" 

确保修改生效。

source ~/.bashrc

U-boot

克隆 U-boot 项目并编译。

git clone https://source.denx.de/u-boot/u-boot.git
cd u-boot
export ARCH=riscv
make CROSS_COMPILE=riscv64-unknown-linux-gnu- qemu-riscv64_smode_defconfig
make CROSS_COMPILE=riscv64-unknown-linux-gnu- -j 8

编译之后的 u-boot 位于项目目录下。

openSBI-v1.6

克隆 openSBI 项目并编译。

git clone https://github.com/riscv-software-src/opensbi.git
cd opensbi && git checkout v1.6
make PLATFORM=generic CROSS_COMPILE=riscv64-unknown-linux-gnu- ARCH=riscv -j 8

编译之后的内容位于 build/platform/generic/firmware/ 目录中。

qemu引导Linux

启动 Linux

qemu-system-riscv64 -machine virt -nographic -m 8192 -smp 6 -bios opensbi/build/platform/generic/firmware/fw_jump.bin -kernel u-boot/u-boot -device virtio-net-device,netdev=eth0 -netdev user,id=eth0,hostfwd=tcp::6666-:22 -device virtio-rng-pci -drive file=./ubuntu-22.04-preinstalled-server-riscv64+unmatched.img,format=raw,if=virtio

此时,我们可以通过 ssh 命令 ssh -p 6666 ubuntu@localhost 登录到 Linux,系统会立即要求更改密码

# 默认用户名和密码
username: ubuntu
password: ubuntu

加载 kvm 模块,并验证

sudo modprobe kvm

此时应该会看到,系统目前没有 KVM 模块。

编译升级 Linux 内核

依照上文方式用 QEMU 引导 RISCV 的内核之后,在 Host 中编译。这种方式可能较慢。接下来的操作都在 Host 中进行。

安装必要的工具:

sudo apt update
sudo apt install build-essential libncurses-dev bison flex libssl-dev libelf-dev fakeroot dwarves

下载内核源码压缩包。

在这里插入图片描述
这里下载版本 v6.13.7 并解压缩。

wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.13.7.tar.xz
tar -xf linux-6.13.7.tar.xz
cd linux-6.13.7/

拷贝配置文件并对配置文件做选择性修改。

 cp -v /boot/config-$(uname -r) .configmake localmodconfig

最后对配置文件做些修改,确保编译过程顺利。

scripts/config --disable SYSTEM_TRUSTED_KEYS
scripts/config --disable SYSTEM_REVOCATION_KEYS
scripts/config --set-str CONFIG_SYSTEM_TRUSTED_KEYS ""
scripts/config --set-str CONFIG_SYSTEM_REVOCATION_KEYS ""

开始编译

fakeroot make -j8

查看结果,命令执行之后为 0 则一切正常。

echo $?

安装内核模块、更新用户头文件、安装内核内核并重启。

sudo make modules_install
sudo make headers_install INSTALL_HDR_PATH=/usr
sudo make install
sudo reboot

输入命令验证内核版本。

uname -rs

此时,我们再加载 kvm 模块。并验证在 dev 下有 kvm 这个设备文件存在。

sudo modprobe kvm
ls /dev/

下载最新 KVMTool

下载另外一个经常更新的 KVMTOOL 并编译源码。

sudo apt-get install libfdt-dev
git clone git://git.kernel.org/pub/scm/linux/kernel/git/will/kvmtool.git
cd kvmtool && make

小结

完结撒花!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/73700.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

书摘 ASP.NET Core技术内幕与项目实战:基于DDD与前后端分离

IT行业的发展瞬息万变,新技术层出不穷,很多技术人员出于个人兴趣、个人职业发展等考虑而选择一些流行的新技术,他们会把各种复杂的架构模式、高精尖的技术都加入架构中,这增加了项目的复杂度、延长了交付周期、增加了项目的研发成本。有些技术并不符合公司的情况,最后项目…

神策数据接入 DeepSeek,AI 赋能数据分析与智能运营

在 AI 技术迅猛发展的浪潮下,神策数据正在加速推进人工智能在数据分析和智能运营领域的深度应用。近日,神策数据宣布全面接入 DeepSeek,为企业客户带来更加智能化、高效的数据分析与智能运营服务。这一举措展现了神策数据在人工智能方向的探索…

c++ 类和对象 —— 中 【复习笔记】

1. 类的默认成员函数 如果一个类什么成员都没有,简称空类。但实际上,任何类在不写成员时,编译器会自动生成6个默认成员函数(用户未显式实现,编译器生成的成员函数) 这6个成员函数可分为三类: …

数学建模:MATLAB循环神经网络

一、简述 1.循环神经网络 循环神经网络(RNN)是一种用于处理序列数据的神经网络。不同于传统的前馈神经网络,RNN在隐藏层中加入了自反馈连接,使得网络能够对序列中的每个元素执行相同的操作,同时保持一个“记忆”状态…

在windows10系统上安装docker,然后在容器中运行GPU版本的Pytorch,并使用vscode连接该容器

一 . 安装Docker Desktop 首先打开网址https://docs.docker.com/desktop/install/windows-install/ 下载完后,双击下面的exe文件进行安装,默认情况下,Docker Desktop 安装在C:\Program Files\Docker\Docker 出现提示时,请确保…

基于SpringBoot + Vue 的房屋租赁系统

基于springboot的房屋租赁管理系统-带万字文档 SpringBootVue房屋租赁管理系统 送文档 本项目有前台和后台两部分、多角色模块、不同角色权限不一样 共分三种角色:用户、管理员、房东 管理员:个人中心、房屋类型管理、房屋信息管理、预约看房管理、合…

C++特性——智能指针

为什么需要智能指针 对于定义的局部变量,当作用域结束之后,就会自动回收,这没有什么问题。 当时用new delete的时候,就是动态分配对象的时候,如果new了一个变量,但却没有delete,这会造成内存泄…

C语言之 循环语句:程序运行的核心动力(上)

个人主页:strive-debug 在 C 语言中,分支结构可以通过 if、switch 语句来实现,循环结构则可以通过 for、while、do while 语句来实现。 if 语句 if 语句的语法形式如下: if (表达式)语句; 如果表达式成立(为真&am…

FreeRTOSBug解析:一个任务printf打印一半突然跳转另一个任务,导致另一个任务无法打印

bug现象: key任务: 默认任务: 此时两个任务的优先级相同,抢占式调度,时间片轮转,空闲任务让步。 但是会出现一个问题,key任务在发送完队列之后不会立即跳转到默认任务的队列接收函数后的print…

操作系统八股文整理(一)

操作系统八股文整理 一、进程和线程的区别二、进程与线程的切换过程一、进程切换进程切换的步骤: 二、线程切换线程切换的步骤: 三、进程切换与线程切换的对比四、上下文切换的优化 三、系统调用一、系统调用的触发二、从用户空间切换到内核空间三、执行…

卷积神经网络(CNN)之 EfficientNet

在深度学习领域,模型的计算效率与性能之间的平衡一直是一个核心挑战。随着卷积神经网络(CNN)在图像分类、目标检测等任务中取得显著成果,模型的复杂度和计算需求也急剧增加。2019年,Google Research 提出的 EfficientN…

学生选课管理系统数据库设计报告

学生选课管理系统数据库设计报告 一、需求分析 (一)项目背景 学生选课管理系统是高校教学管理的重要组成部分,旨在实现学生选课、课程管理、成绩录入与查询等功能的自动化和信息化。通过该系统,学生可以方便地选择课程&#xf…

工具介绍《Awsome-Redis-Rogue-Server 与 redis-rogue-server》

1. 核心功能与攻击场景 redis-rogue-server 基于Redis主从复制漏洞(CVE未公开),针对Redis 4.x~5.0.5版本设计,通过伪造恶意主节点强制同步恶意模块(.so文件)实现远程代码执行(RCE)。…

Razor C# 变量

Razor C# 变量 引言 在ASP.NET MVC和Razor视图引擎中,变量是构建动态网页的基础。理解Razor C#变量的使用对于开发者来说至关重要。本文将详细介绍Razor C#变量的概念、类型、作用域以及如何在实际项目中有效使用它们。 一、Razor C# 变量的概念 Razor C# 变量是存储在Raz…

【QA】模板方法模式在Qt中有哪些应用?

在 Qt 框架中,模板方法模式(Template Method Pattern)被广泛应用于框架的设计中,通过定义算法骨架并允许子类在不改变结构的情况下重写部分步骤。以下是 Qt 中典型的应用场景及示例: 1. 事件处理(Event Ha…

有趣的算法实践:整数反转与回文检测(Java实现)

题目描述:整数反转与回文检测 要求实现两个功能: 将输入的整数反转(保留符号,如输入-123返回-321)判断反转后的数是否为回文数(正反读相同) 示例: 输入:123 → 反转结…

【协作开发】低成本一键复刻github的gitea

在阅读 next-public 时,反思原本的需求,是否本未倒置,故而重新调研当下开源现状。发现 gitea 完全满足商业软件的开发要求,并且价格足够低,使用足够方便,其他同类软件完全不用看了,真是世界级的…

基于“动手学强化学习”的知识点(二):第 15 章 模仿学习(gym版本 >= 0.26)

第 15 章 模仿学习(gym版本 > 0.26) 摘要 摘要 本系列知识点讲解基于动手学强化学习中的内容进行详细的疑难点分析!具体内容请阅读动手学强化学习! 对应动手学强化学习——模仿学习 # -*- coding: utf-8 -*-import gy…

JAVA面试_进阶部分_Java JVM:垃圾回收(GC 在什么时候,对什么东西,做了什么事情)

在什么时候: 首先需要知道,GC又分为minor GC 和 Full GC(major GC)。Java堆内存分为新生代和老年代,新生代 中又分为1个eden区和两个Survior区域。 一般情况下,新创建的对象都会被分配到eden区&#xff…

2024年消费者权益数据分析

📅 2024年315消费者权益数据分析 数据见:https://mp.weixin.qq.com/s/eV5GoionxhGpw7PunhOVnQ 一、引言 在数字化时代,消费者维权数据对于市场监管、商家诚信和行业发展具有重要价值。本文基于 2024年315平台线上投诉数据,采用数…