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

2023-09-17 11:34:45

前言

文章詳細說明如何從堶零開始基於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: [   

更多推荐

Java高级-注解

注解1.介绍2.元注解3.注解的解析4.注解的应用场景1.介绍注解Annotation就是Java代码里的特殊标记,作用是让其他程序根据注解信息来决定什么是执行该程序注解:注解可以在类上、构造器上、方法上、成员变量上、参数上等位置自定义注解/***自定义注解*/public@interfaceMyTest1{Strin

IntelliJ IDEA 2023.2 最新版如何激活?IntelliJ IDEA 2023.2最新版激活方法及验证ja-netfilter配置成功提示

🌷🍁博主猫头虎带您GotoNewWorld.✨🍁🦄博客首页——猫头虎的博客🎐🐳《面试题大全专栏》文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺🌊《IDEA开发秘籍专栏》学会IDEA常用操作,工作效率翻倍~💐🌊《100天精通Golang(基础入门篇)》学会Golang语言,畅玩云原生,走遍大

SpringBoot +MyBatis批量插入数据

💍背景介绍在最近的开发过程中,遇到了往数据库中表中插入大量的数据。有一个全国银行各分行的信息,共计148032条数据文件有8.45MB,因为考虑到数据量比较大,就想着导入到MySQL看一看需要多长时间。💍方案一:用for语句循环插入(不推荐)使用for循环语句将,将数据一条条插入。insertintot_bankv

【LeetCode-面试经典150题-day25】

目录530.二叉搜索树的最小绝对差230.二叉搜索树中第K小的元素98.验证二叉搜索树530.二叉搜索树的最小绝对差题意:给你一个二叉搜索树的根节点root,返回树中任意两不同节点值之间的最小差值。差值是一个正数,其数值等于两值之差的绝对值。树中节点的数目范围是[2,100]0<=Node.val<=105【输入样例】

React+Typescript项目环境中搭建并使用redux环境

前几篇文章我们的项目已经开始功能渐渐完善了那么我们来说最后一个点redux这个并不需要我们多努力其实官方文档给到已经算是很全面了我们可以直接访问地址TypeScript中文手册中文手册和官方是一样的而且对我们非常友好我们会在左侧导航栏中找到一个React点进去进入之后一直往下翻我们就可以看到Redux部分我们直接用他这

9.子数组统计问题

文章目录子数组计数问题[560.和为K的子数组](https://leetcode.cn/problems/subarray-sum-equals-k/)[974.和可被K整除的子数组](https://leetcode.cn/problems/subarray-sums-divisible-by-k/)[523.连续

C#实战:基于腾讯OCR技术实现企业证书识别和数据提取实践

一、OCR技术介绍在当今数字化时代,OCR(OpticalCharacterRecognition)识别技术正发挥着越来越重要的作用。OCR技术通过将图像中的文字转化为可编辑的文本形式,实现了对大量纸质文档的数字化处理和信息提取。常见的有企业资质证书的识别到身份证、护照等各类证件的自动识别等方面,OCR技术正在为各行各

macOS Big Sur:探索新设计,聚焦新体验

自苹果公司推出macOSBigSur以来,这一新版操作系统以其突破性的设计刷新了我们对Mac的认知。本文将详细介绍macOSBigSur的各项新功能及其为用户带来的卓越体验。安装:macOSBigSur(macos11)v11.7.10正式版一、全新设计:导览更轻松,控制更随心macOSBigSur对用户界面进行了全面

ChatGPT:使用fastjson读取JSON数据问题——如何使用com.alibaba.fastjson库读取JSON数据的特定字段

ChatGPT:使用fastjson读取JSON数据问题——如何使用com.alibaba.fastjson库读取JSON数据的特定字段有一段Json字符串:{"code":200,"message":"success","data":{"total":"1","list":[{"question_no":"21520

键盘失灵按什么键恢复?详细方法分享!

“我的电脑键盘莫名其妙失灵了,试了好多方法都无法恢复。请问遇到键盘失灵的情况,应该按什么键才能恢复呢?”键盘是计算机的重要输入设备之一,但有时候它可能会出现失灵的情况,让用户感到困惑和不知所措。但其实,解决该问题并不是很困难。键盘失灵按什么键恢复呢?别着急!继续往下看吧!小编给大家总结了详细的解决方法!键盘失灵的常见原

湖南湘潭家具3D轮廓扫描测量家居三维数字化外观逆向设计-CASAIM中科广电

随着科技的不断进步,CASAIM三维扫描技术在各个行业中得到了广泛应用,家具行业也不例外。传统的家具设计和展示方式已经无法满足现代消费者的个性化、多元化需求,而三维扫描技术的出现为家具行业带来了新的机遇和可能性。家具表面有雕刻图案,纹理特征较多,幅面大,传统人工建模方式效率低、耗时长,且尺寸易出现误差。特别是针对一些比

热文推荐