基於RISC-V QEMU 仿真運行Linux 系統環境搭建

2023-11-12

前言

文章詳細說明如何從堶零開始基於RISC-V QEMU 仿真運行Linux 系統環境搭建,
是Linux 小白入門教程不二之選,歡迎留言討論,轉發請注明原文出處~

1. 準備QEMU 仿真環境 --RISC-V 64bits

安裝包下載地址: https://www.qemu.org/

安裝命令及安裝成功效果如下所示,

target-list 設定爲riscv64-softmmu, 

sudo apt-get install libglib2.0-dev
sudo apt-get install libpixman-1-dev
./configure --target-list=riscv64-softmmu
make -j24
sudo make install -j24

安裝完成後,可按如下檢查是否安裝成功

$ qemu-system-riscv64 -h
QEMU emulator version 8.0.4
Copyright (c) 2003-2022 Fabrice Bellard and the QEMU Project developers
usage: qemu-system-riscv64 [options] [disk_image]


2. 安裝RISC-V 編譯器, (過程略)


如下cmd 可檢查是否安裝成功並顯示版本號 12.2.0

$ /opt/riscv/bin/riscv64-unknown-linux-gnu-gcc -v
Using built-in specs.
COLLECT_GCC=/opt/riscv/bin/riscv64-unknown-linux-gnu-gcc
COLLECT_LTO_WRAPPER=/opt/riscv/libexec/gcc/riscv64-unknown-linux-gnu/12.2.0/lto-wrapper
Target: riscv64-unknown-linux-gnu
Configured with: /project/riscv-gnu-toolchain/gcc/configure --target=riscv64-unknown-linux-gnu --prefix=/opt/riscv --with-sysroot=/opt/riscv/sysroot --with-pkgversion=g2ee5e430018 --with-system-zlib --enable-shared --enable-tls --enable-languages=c,c++,fortran --disable-libmudflap --disable-libssp --disable-libquadmath --disable-libsanitizer --disable-nls --disable-bootstrap --src=.././gcc --enable-multilib --with-abi=lp64d --with-arch=rv64imafdc --with-tune=rocket --with-isa-spec=20191213 'CFLAGS_FOR_TARGET=-O2    -mcmodel=medlow' 'CXXFLAGS_FOR_TARGET=-O2    -mcmodel=medlow'
Thread model: posix
Supported LTO compression algorithms: zlib
gcc version 12.2.0 (g2ee5e430018) 

3. 準備U-Boot

Linux 啓動需要u-boot 引導載入鏡像文件. 節說明如何準備u-boot

下載路徑: U-Boot / U-Boot · GitLab

編譯安裝方法: 

export CROSS_COMPILE=/opt/riscv/bin/riscv64-unknown-linux-gnu-
make qemu-riscv64_smode_defconfig
make -j$(nproc) 2>&1 | tee build.log

 4. 準備OpenSBI

SBI (Supervisor Binary Interface), M-mode下运行的特定于平台固件,与bootloader引导加载程序,以及在S-mode或HS-mode模式下运行的hypervisor或通用操作系统之间的接口。與之對應, userspace 與 kernelspace 的接口稱爲ABI (Application Binary Interface).

OpenSBI 用於啓動引導操作系統,以及系統運行過程中,切換入M-Mode 提供一些硬件操作. 

下載路徑: https://github.com/riscv/opensbi.git

編譯安裝方法, FW_PAYLOAD_PATH 需換換爲上一小節u-boot.bin 實際路徑: 

export CROSS_COMPILE=/opt/riscv/bin/riscv64-unknown-linux-gnu-
make PLATFORM=generic FW_PAYLOAD_PATH=$1<uboot_build_directory>/u-boot.bin

編譯完成後,可看到生成fw_payload.elf,  至此,可以先測試openSBI + u-boot 是否可正常啓動:

build/platform/generic/firmware/fw_payload.bin
qemu-system-riscv64 -M virt -m 256M -nographic -bios build/platform/generic/firmware/fw_payload.elf
U-Boot 2023.10-rc4 (Sep 14 2023 - 22:44:30 +0800)

CPU:   rv64imafdch_zicbom_zicboz_zicsr_zifencei_zihintpause_zawrs_zba_zbb_zbc_zbs_sstc_svadu
Model: riscv-virtio,qemu
DRAM:  256 MiB
Core:  25 devices, 12 uclasses, devicetree: board
Flash: 32 MiB
Loading Environment from nowhere... OK
In:    serial,usbkbd
Out:   serial,vidconsole
Err:   serial,vidconsole
No working controllers found
Net:   No ethernet found.
Working FDT set to 8ef208b0
Hit any key to stop autoboot:  0 

Device 0: unknown device
scanning bus for devices...

Device 0: unknown device
starting USB...
No working controllers found
No ethernet found.
No ethernet found.
=> 

5. 準備Linux Kernel

下載路徑: https://github.com/torvalds/linux

編譯安裝方法: 

export ARCH=riscv
export KBUILD_OUTPUT=kbuild_out
export CROSS_COMPILE=/opt/riscv/bin/riscv64-unknown-linux-gnu-
make defconfig
make -j24 2>&1 | tee build.log
$ ls kbuild_out/arch/riscv/boot/Image
kbuild_out/arch/riscv/boot/Image

6. 準備rootfs

rootfs 作爲linux kernel 啓動阶段必不可少資源, 對於Linux 正常運行必不可少. busybox 是更爲常用的rootfs 制作方法,但是編譯相對較爲復雜,對於小白來說有一定難度.本小節基於buildroot 搭建rootfs, 提供一個更便捷的方法.

下載路徑: https://github.com/buildroot/buildroot

編譯安裝方法: 

前方已經準備好openSBI firmware 和 Linux Kernel Image, build 前先將兩個選項置爲no, 若爲yes, 自動從網絡下載編譯openSBI, Linux, 等待很久且沒必要.

$ git diff
diff --git a/configs/qemu_riscv64_virt_defconfig b/configs/qemu_riscv64_virt_defconfig
index 52ad87fa7c..ff330d3505 100644
--- a/configs/qemu_riscv64_virt_defconfig
+++ b/configs/qemu_riscv64_virt_defconfig
@@ -17,14 +17,14 @@ BR2_ROOTFS_POST_SCRIPT_ARGS="$(BR2_DEFCONFIG)"
 BR2_PACKAGE_HOST_LINUX_HEADERS_CUSTOM_6_1=y
 
 # Kernel
-BR2_LINUX_KERNEL=y
+BR2_LINUX_KERNEL=n
 BR2_LINUX_KERNEL_CUSTOM_VERSION=y
 BR2_LINUX_KERNEL_CUSTOM_VERSION_VALUE="6.1.44"
 BR2_LINUX_KERNEL_USE_ARCH_DEFAULT_CONFIG=y
 BR2_LINUX_KERNEL_IMAGE=y
 
 # Bootloader
-BR2_TARGET_OPENSBI=y
+BR2_TARGET_OPENSBI=n
 BR2_TARGET_OPENSBI_CUSTOM_VERSION=y
 BR2_TARGET_OPENSBI_CUSTOM_VERSION_VALUE="1.2"
 BR2_TARGET_OPENSBI_PLAT="generic"

編譯安裝方法: 

export ARCH=riscv
export CROSS_COMPILE=/opt/riscv/bin/riscv64-unknown-linux-gnu-
make qemu_riscv64_virt_defconfig
make -j24 2>&1 | tee build.log

7. 測試

上述準備完成後, buildroot 路徑下自動生成"output/images/start-qemu.sh", 執行該文件即可.

由於沒有使用buildroot 自動生成opensbi 和 linux kernel image, 需修改fw_.elf 和 kernel Image

爲實際路徑. 如下圖所示.

exec qemu-system-riscv64 -M virt -bios fw_jump.elf -kernel $LINUX_IMG_DIR/Image -append "rootwait root=/dev/vda ro" -drive file=rootfs.ext2,format=raw,id=hd0 -device virtio-blk-device,drive=hd0 -netd    ev user,id=net0 -device virtio-net-device,netdev=net0 -nographic  ${EXTRA_ARGS} "$@"
[    0.509136] devtmpfs: mounted
[    0.547883] Freeing unused kernel image (initmem) memory: 2192K
[    0.548763] Run /sbin/init as init process
[    0.775879] EXT4-fs (vda): warning: mounting unchecked fs, running e2fsck is recommended
[    0.802712] EXT4-fs (vda): re-mounted 677f7b94-119c-490a-94b9-9b9cb4651848 r/w. Quota mode: disabled.
Starting syslogd: OK
Starting klogd: OK
Running sysctl: OK
Seeding 256 bits and crediting
Saving 256 bits of creditable seed for next boot
Starting network: [    1.455587] test_kthread test_kthread_func
udhcpc: started, v1.36.1
udhcpc: broadcasting discover
udhcpc: broadcasting select for 10.0.2.15, server 10.0.2.2
udhcpc: lease of 10.0.2.15 obtained from 10.0.2.2, lease time 86400
deleting routers
adding dns 10.0.2.3
OK

Welcome to Buildroot
buildroot login: [   

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基於RISC-V QEMU 仿真運行Linux 系統環境搭建 的相关文章

  • Apache 端口转发 80 到 8080 并访问 Apache (80) 中托管的应用程序,即 phpMyadmin 和 Tomcat (8080)

    我想访问托管在 tomcat 服务器 8080 中的应用程序 myapp 当前可以通过以下方式访问http example com 8080 myapp http example com 8080 myapp in http example
  • 我想在 Red Hat Linux 服务器中执行 .ps1 powershell 脚本

    我有一个在窗口中执行的 ps1 powershell 脚本 但我的整个数据都在 Linux 服务器中 有什么可能的方法可以让我在红帽服务器中执行 powershell 脚本 powershell脚本是 Clear Host path D D
  • Qemu源代码流程[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在构建一个项目 其中我必须提取在 qemu kvm 之上运行的虚拟机的脏页面 我下载了 qemu 源代码 但无法正确理解它 因为源
  • 如何将一个文本文件拆分为多个 *.txt 文件?

    我有一个文本文件file txt 12 MB 包含 something1 something2 something3 something4 有没有办法分开file txt分成 12 个 txt 文件 比方说file2 txt file3 t
  • 使用 shell 脚本发送 HTML 邮件

    如何使用 shell 脚本发送 HTML 电子邮件 首先 您需要撰写消息 最低限度由这两个标头组成 MIME Version 1 0 Content Type text html 以及适当的消息正文 p Hello world p 获得后
  • 在 scapy 中通过物理环回发送数据包

    我最近发现了 Scapy 它看起来很棒 我正在尝试查看 NIC 上物理环回模块 存根上的简单流量 但是 Scapy sniff 没有给出任何结果 我正在做的发送数据包是 payload data 10 snf sniff filter ic
  • 在ubuntu中打开spyder

    我想在ubuntu中打开spyder Python IDE 通常我会在 shell 中编写 spyder 它会打开spyder IDE 现在 当我在shell中编写spyder时 它只是换行 什么也没有发生 类似于按 enter 我如何找回
  • Crontab 每 5 分钟一次 [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我如何告诉 crontab 每 5 分钟运行一次 但从每小时的第二分钟开始 换句话说 我想在以下时间执行我的脚本minute 5 2 例如 我的脚本应
  • “git add”返回“致命:外部存储库”错误

    我刚刚进入 git 的奇妙世界 我必须提交我对程序所做的一系列更改 位于名为的目录中 var www myapp 我创建了一个新目录 home mylogin gitclone 从这个目录中 我做了一个git clone针对公共回购 我能够
  • LINUX:如何锁定内存中进程的页面

    我有一个 LINUX 服务器 运行一个具有大量内存占用的进程 某种数据库引擎 该进程分配的内存太大 需要将其中一部分换出 换出 我想做的是将所有其他进程 或正在运行的进程的子集 的内存页面锁定在内存中 以便只有数据库进程的页面被换出 例如
  • 如何从 C++ 程序中重新启动 Linux?

    我有一个 Qt 4 GUI 我需要在下拉菜单中提供一个选项 允许用户选择重新启动计算机 我意识到这对于以其他方式重新启动计算机的能力来说似乎是多余的 但选择需要保留在那里 我尝试使用 system 来调用以下内容 suid root she
  • 如何在 Linux 上通过 FTP 递归下载文件夹 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案
  • 如何才能将 TCP 连接返回到同一端口?

    机器是 RHEL 5 3 内核 2 6 18 有时我在 netstat 中注意到我的应用程序有连接 建立了 TCP 连接本地地址 and 国外地址是一样的 其他人也报告了同样的问题 症状与链接中描述的相同 客户端连接到本地运行的服务器的端口
  • awk 在循环中使用时不打印任何内容[重复]

    这个问题在这里已经有答案了 我有一堆使用 file 1 a 1 txt 格式的文件 如下所示 A 1 B 2 C 3 D 4 并使用以下命令添加包含每个文件名称的新列 awk print FILENAME NF t 0 file 1 a 1
  • 一个单元在哪一级测试无锁代码?

    Can LLVM https packages debian org stretch llvm QEMU https packages debian org stretch qemu kvm GDB https packages debia
  • 执行命令而不将其保留在历史记录中[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 在进行软件开发时 经常需要在命令行命令中包含机密信息 典型示例是将项目部署到服务器的凭据设置为环境变量 当我不想将某些命令存储在命令历史记
  • SSH,运行进程然后忽略输出

    我有一个命令可以使用 SSH 并在 SSH 后运行脚本 该脚本运行一个二进制文件 脚本完成后 我可以输入任意键 本地终端将恢复到正常状态 但是 由于该进程仍在我通过 SSH 连接的计算机中运行 因此任何时候它都会登录到stdout我在本地终
  • FileOutputStream.close() 中的设备 ioctl 不合适

    我有一些代码可以使用以下命令将一些首选项保存到文件中FileOutputStream 这是我已经写了一千遍的标准代码 FileOutputStream out new FileOutputStream file try BufferedOu
  • Google BQ:运行参数化查询,其中参数变量是 BQ 表目标

    我正在尝试从 Linux 命令行为 BQ 表目标运行 SQL 此 SQL 脚本将用于多个日期 客户端和 BQ 表目标 因此这需要在我的 BQ API 命令行调用中使用参数 标志 parameter 现在 我已经点击此链接来了解参数化查询 h
  • 通过 Visual Studio 2017 使用远程调试时 Linux 控制台输出在哪里?

    我的Visual Studio 2017 VS2017 成功连接Linux系统 代码如下 include

随机推荐

  • 怎么使用Web3.js开发一个简单的Dapp

    通过这篇文章 我们将学习 Dapps 和 Web3js 的基础知识 让我们了解一下基本术语 区块链 去中心化应用程序 以太坊 智能合约 web3js 区块链 区块链是一个可审计且不可逆的数据库 其中数据只能添加 在区块链中 数据可以作为块添
  • elasticSearch详细教程

    一 Elasticsearch简介 Elasticsearch是使用Java编写的一种开源搜索引擎 它在内部使用Luence做索引与搜索 通过对Lucene的封装 提供了一套简单一致的RESTful API Elasticsearch也是一
  • 数据结构中Java实现KMP与BF算法对比

    public class KMPANDBF public int indexBfCount SeqString s SeqString t int begin int slen tlen i begin j 0 int count 0 sl
  • Scipy

    10 1 import numpy as np import scipy optimize as opt m 20 n 10 A np random normal loc 10 scale 3 size m n b np random no
  • 【C语言】#文件操作#有5个学生,每个学生有3门课程的成绩,从键盘输入以上数据(包括学号、姓名、3门课成绩),计算出平均成绩,将原有数据和计算出的平均分数存放在磁盘文件stud中。

    题目 1 有5个学生 每个学生有3门课程的成绩 从键盘输入以上数据 包括学号 姓名 3门课成绩 计算出平均成绩 将原有数据和计算出的平均分数存放在磁盘文件stud中 设5名学生的学号 姓名和3门课成绩如下 在向文件stud写入数据后 应检查
  • Python 正则表达式RE知识学习

    正则表达式 Regular Expression 是一种强大的文本模式匹配工具 常用于在字符串中查找 替换 分割等操作 在 Python 中 可以使用内置的 re 模块来操作正则表达式 ChatGPT编写 下面是一些需要掌握的正则表达式知识
  • 《大五人格心理学》读书笔记

    这本书介绍了一下职场中的大五人格 具有不同人格特质的人适合干不同的工作 了解自己的人格特质 有利于自己的职业规划 了解同事的人格特质 有利于合作 1 宜人性 宜人性的心声 这对他人有什么影响VS 这对我有什么价值 宜人性的子维度 同理心 经
  • Nginx实现404页面的几种方法

    Nginx实现404页面的几种方法 第一种 Nginx自己的错误页面 第二种 反向代理的错误页面 第三种 Nginx解析php代码的错误页面 第四种 指定一个url地址 第一种 Nginx自己的错误页面 Nginx访问一个静态的html 页
  • JAVA单元测试框架-12-java代码重复执行失败的测试用例

    在使用testng执行测试用例时候 都会遇到测试用例执行失败 怎么再次执行失败的测试用例呢 官网给出了java代码执行测试的案例 每次执行完用例后会在test output目录路径下保存执行失败的测试用例 可以再次执行失败的测试用例来达到重
  • QT实现中英文键盘

    使用Qt中实现中英文键盘 支持各种linux嵌入式设备 实现思路 需要一个中文字体库 将字体库加载到一个Hash容器 字母和拼音作为key值 对应的中文作为value值 核心代码 include UKeyBoard h include ui
  • CSDN-markdown编辑器

    这里写自定义目录标题 欢迎使用Markdown编辑器 新的改变 功能快捷键 合理的创建标题 有助于目录的生成 如何改变文本的样式 插入链接与图片 如何插入一段漂亮的代码片 生成一个适合你的列表 创建一个表格 设定内容居中 居左 居右 Sma
  • 使用高德地图 vue-amap 中遇到的问题

    1 搜索组件进行搜索的时候 无论搜索哪个城市 地图一直固定在一个城市 我的是深圳
  • 基于Docker环境安装ElasticSearch

    1 搜索技术 搜索技术在我们日常生活的方方面面都会用到 例如 综合搜索网站 百度 谷歌等 电商网站 京东 淘宝的商品搜索 软件内数据搜索 我们用的开发工具 如Idea的搜索功能 这些搜索业务有一些可以使用数据库来完成 有一些却不行 因此我们
  • 【Java进阶篇】—— File类与IO流

    一 File类的使用 1 1 概述 File 类以及本章中的各种流都定义在 java io 包下 一个File对象代表硬盘或网络中可能存在的一个文件或文件夹 文件目录 File 能新建 删除 重命名 文件和目录 但 File不能访问文件内容
  • 数据结构视频教程 -《[北风网]C#版数据结构与算法高级教程》

    整个视频打包下载地址 史上最全的数据结构视频教程系列分享之 北风网 C 版数据结构与算法高级教程 转载请保留出处和链接 更多优秀资源请访问 我是码农 数据结构是计算机存储 组织数据的方式 数据结构是指相互之间存在一种或多种特定关系的数据元素
  • Redis可视化工具无法连接Redis(安装在服务器上面)的解决方案

    redis可视化工具连接安装在阿里云上面的redis时 一直连接不上 你可以按下面三步去完美解决 第一 确保redis正常启动 我这主要解决redis可视化工具无法连接redis哈 具体redis安装我就不讲了奥 首先通过指令 cd usr
  • 区块链共识机制技术一——POW(工作量证明)共识机制

    什么是共识机制 所谓 共识机制 是通过特殊节点的投票 在很短的时间内完成对交易的验证和确认 对一笔交易 如果利益不相干的若干个节点能够达成共识 我们就可以认为全网对此也能够达成共识 区块链作为一个去中心化的分布式账本系统 然而在实际运行中
  • RPC通信基本原理 -- 浅析RPC远程过程调用基本原理

    一 RPC基本概念 1 1 RPC简介 RPC 的全称是 Remote Procedure Call是一种进程间通信方式 RPC只是一个概念 而不是具体的协议或框架 它允许程序调用另一个地址空间 通常是共享网络的另一台机器上 的过程或函数
  • 应用布尔盲注来爆库(1)

    先上道练习题Less 8 打开sqli labs项目的练习题Less 8 http 192 168 3 2 sqli labs Less 8 然后输入id 1参数 可以得到以下信息 输入有效id 1时 只提示成功 You are in 没有
  • 基於RISC-V QEMU 仿真運行Linux 系統環境搭建

    前言 文章詳細說明如何從堶零開始基於RISC V QEMU 仿真運行Linux 系統環境搭建 是Linux 小白入門教程不二之選 歡迎留言討論 轉發請注明原文出處 1 準備QEMU 仿真環境 RISC V 64bits 安裝包下載地址 ht