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.pswp.cn/bicheng/73700.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/73700.shtml
英文地址,請注明出處:http://en.pswp.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平臺線上投訴數據,采用數…