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

Ubuntu20.04搭建RISC-V和qemu环境

1. 前言

risc-v是一个非常有潜力的指令集框架,最近对其产生了浓厚的兴趣,由于之前对于这方面的知识储备很少,在加上网上的教程都是点到为止,所以安装过程异常曲折。好在最后一步一步积累摸索,终于利用源码安装完成。看到此文章的同学,相信你也对RISC-V感兴趣,并且在安装过程也遇到了一些问题,希望这篇文章能够帮到你。 本文假设你已经安装了ubuntu20.04或者Ubuntu18.04,我在Ubuntu18.04和Ubuntu20.04都安装成功过,Ubuntu18.04默认是python3.6,所以在安装qemu的时候需要升级python,并安装ninga. 本文使用Ubuntu20.04以源码的方式安装RISC-V和qemu,并测试其正常工作。

2. 安装RISC-V

2.1 下载risc-v的源码

risc-v地址为​​​​​​GitHub - riscv-collab/riscv-gnu-toolchain: GNU toolchain for RISC-V, including GCCGNU toolchain for RISC-V, including GCC. Contribute to riscv-collab/riscv-gnu-toolchain development by creating an account on GitHub.icon-default.png?t=N7T8https://github.com/riscv-collab/riscv-gnu-toolchain

下载后会有目录riscv-gnu-toolchain目录,该目录不大,使用GitHub可以很快下载完成。 下载命令为:git clone git@github.com:riscv-collab/riscv-gnu-toolchain.git  先不着急使用configure安装,因为安装过程会从github下载gcc,newlib等子库,速度非常慢,容易中断。继续看第二步下载子模块

2.2 子模块下载

使用浏览器打开https://github.com/riscv-collab/riscv-gnu-toolchain ,然后双击.gitmodules,可以看到每个子模块的路径和分支。根据绿色部分的名字,在国内的gitee上搜索,找到对应的库路径即可。cd riscv-gnu-toolchain 这个路径然后git clone gitee路径。 这里要注意:有的库名字和clone后的目录名字相同,有的不相同,不相同库的在切换到正确的分支后须修改为子目录名称。例如binutils库克隆后的目录为binutils-gdb,  需要先进入binutils-gdb目录,使用git checkout切换到binutils-2_40-branch分支。然后删除原有的binutils目录,在使用mv命令修改为binutils-gdb目录为binutils。  如gcc目录同gcc库名字相同,直接在gitee上找到库路径后克隆gcc库后切换到对应的分支即可。注意:子模块的目录都是空,使用clone之后都不为空,可以用来检查是否有遗漏。操作一定要小心,不然configure的时候会卡住。如果编译过程卡住2分钟,不要犹豫,直接停止编译,检查子库是否下载正确。纠正后清空build目录里面的内容重新编译。

下面是自己从gitee上找的对应模块,直接复制url的内容按删除操作一个一个clone修改即可。当然你也可以把内容复制到riscv-gnu-toolchain目录里面的.gitmodules文件里面,然后更新子模块配置,让其自动下载,这部分有兴趣可以自己研究,我这边尝试了一把卡住了没成功。

[submodule "binutils"]path = binutilsurl = https://gitee.com/keaide/binutils-gdb.gitbranch = binutils-2_40-branch
[submodule "gcc"]path = gccurl = https://gitee.com/mirrors/gcc.gitbranch = releases/gcc-13
[submodule "glibc"]path = glibcurl = https://gitee.com/rtlhq/glibc.git
[submodule "dejagnu"]path = dejagnuurl = https://gitee.com/nwpu-ercesi/dejagnu.gitbranch = master
[submodule "newlib"]path = newliburl = https://gitee.com/mirrors/newlib-cygwin.gitbranch = master
[submodule "gdb"]path = gdburl = https://gitee.com/keaide/binutils-gdb.gitbranch = gdb-13-branch
[submodule "qemu"]path = qemuurl = https://gitee.com/liwg06/qemu.git
[submodule "musl"]path = muslurl = https://gitee.com/nwpu-ercesi/musl.gitbranch = master
[submodule "spike"]path = spikeurl = https://gitee.com/houxibiao/riscv-isa-sim.gitbranch = master
[submodule "pk"]path = pkurl = https://gitee.com/houxibiao/riscv-pk.gitbranch = master
[submodule "llvm"]path = llvmurl = https://gitee.com/mirrors/LLVM.gitbranch = release/17.x

2.3 RISC-V编译

1. 正确执行2.1和2.2步骤后,可以编译安装了,按照官方文档,先执行如下命令安装库依赖:

$ sudo apt-get install autoconf automake autotools-dev curl python3 python3-pip libmpc-dev libmpfr-dev libgmp-dev gawk build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev libexpat-dev ninja-build git cmake libglib2.0-dev

2. 在/opt目录下创建riscv目录,并修改权限为777 【很重要】

sudo mkdir /opt/riscv
sudo chmod 777 /opt/riscv

3. 在riscv-gnu-toolchain目录创建build目录,然后执行如下命令:

cd riscv-gnu-toolchain
mkdir build
cd build
../configure --prefix=/opt/riscv --enable-multilib
make linux -j 4

这里使用了兼容32和64位的模式编译,其它模式也是可以的,按照github官方文档说明即可。执行上述命令估计要40分钟左右才能编译完成。看到如下执行完成,没有卡住算是编译完成

此时/opt/riscv目录如下:

2.4. 配置RISC-V环境变量

1. 编辑~/.bashrc

vim ~/.bashrc

2. 在文件~/.bashrc末尾写入如下内容:

export RISCV="/opt/riscv"
export PATH=$PATH:$RISCV/bin

3. 使配置文件生效

source ~/.bashrc

3. 测试RISC-V

1. 创建一个hello.c文件,内容如下:

#include<stdio.h>
int main(){printf("%s","hello RISCV!");return 1;    
}

2. 使用risc-v的gcc编译 

编译无报错,说明成功。编译后是无法执行的,需要安装qemu才能执行

4. 安装QEMU

进入riscv-gnu-toolchain/qemu里面,会发现这里面也有.gitmodules, 这里面的下载路径下载速度还行,直接使用如下命令安装即可,如果卡住就按照risc-v的方法手动下载qemu的子目录即可。最新的qemu是8.1.5,我这边使用6.1稳定版

qemu的子模块目录:注意带roms的模块需要cd到roms路径克隆,不带roms切换到qemu目录克隆,带test和ui路径需要切换到test和ui目录克隆。都使用默认的master分支即可

[submodule "roms/seabios"]path = roms/seabiosurl = https://gitlab.com/qemu-project/seabios.git/
[submodule "roms/SLOF"]path = roms/SLOFurl = https://gitlab.com/qemu-project/SLOF.git
[submodule "roms/ipxe"]path = roms/ipxeurl = https://gitlab.com/qemu-project/ipxe.git
[submodule "roms/openbios"]path = roms/openbiosurl = https://gitlab.com/qemu-project/openbios.git
[submodule "roms/qemu-palcode"]path = roms/qemu-palcodeurl = https://gitlab.com/qemu-project/qemu-palcode.git
[submodule "roms/sgabios"]path = roms/sgabiosurl = https://gitlab.com/qemu-project/sgabios.git
[submodule "dtc"]path = dtcurl = https://gitlab.com/qemu-project/dtc.git
[submodule "roms/u-boot"]path = roms/u-booturl = https://gitlab.com/qemu-project/u-boot.git
[submodule "roms/skiboot"]path = roms/skibooturl = https://gitlab.com/qemu-project/skiboot.git
[submodule "roms/QemuMacDrivers"]path = roms/QemuMacDriversurl = https://gitlab.com/qemu-project/QemuMacDrivers.git
[submodule "ui/keycodemapdb"]path = ui/keycodemapdburl = https://gitlab.com/qemu-project/keycodemapdb.git
[submodule "capstone"]path = capstoneurl = https://gitlab.com/qemu-project/capstone.git
[submodule "roms/seabios-hppa"]path = roms/seabios-hppaurl = https://gitlab.com/qemu-project/seabios-hppa.git
[submodule "roms/u-boot-sam460ex"]path = roms/u-boot-sam460exurl = https://gitlab.com/qemu-project/u-boot-sam460ex.git
[submodule "tests/fp/berkeley-testfloat-3"]path = tests/fp/berkeley-testfloat-3url = https://gitlab.com/qemu-project/berkeley-testfloat-3.git
[submodule "tests/fp/berkeley-softfloat-3"]path = tests/fp/berkeley-softfloat-3url = https://gitlab.com/qemu-project/berkeley-softfloat-3.git
[submodule "roms/edk2"]path = roms/edk2url = https://gitlab.com/qemu-project/edk2.git
[submodule "slirp"]path = slirpurl = https://gitlab.com/qemu-project/libslirp.git
[submodule "roms/opensbi"]path = roms/opensbiurl = 	https://gitlab.com/qemu-project/opensbi.git
[submodule "roms/qboot"]path = roms/qbooturl = https://gitlab.com/qemu-project/qboot.git
[submodule "meson"]path = mesonurl = https://gitlab.com/qemu-project/meson.git
[submodule "roms/vbootrom"]path = roms/vbootromurl = https://gitlab.com/qemu-project/vbootrom.git

具体命令如下:

1. 创建qemu目录存放编译后的二进制文件

sudo mkdir /opt/qemu
sudo chmod 777 /opt/qemu

3. 执行如下命令,避免过程报错Dependency "pixman-1" not found, tried pkgconfig和一些依赖错误

 sudo apt-get install libpixman-1-devpip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple sphinx==5.3.0# 还有一个python依赖,没记录下来,如果出现了,执行pip3安装该库的命令即可

3. 进入riscv-gnu-toolchain/qemu创建build目录并编译,编译耗时1小时左右,出现下图即算编译成功

mkdir build
cd build
../configure --prefix=/opt/qemu
make j 4
make install

4.参考2.4配置qemu的环境变量即可,我这边最终的riscv和qemu的环境变量如下:

其中.local/bin是安装python库的时候一个告警,我手动添加的。应该不加也没事。

5. 测试QEMU(用户模式)

1.报错找不到链接库

使用qemu执行hello二进制文件报错找不到链接库

原因是:qemu-riscv64会在/lib下搜索riscv64的动态链接,而我们编译的riscv链接在/opt/riscv/sysroot里面。网上有直接copy到/lib下,但是还有其他.so文件问题,全部拷贝之后,容易把系统搞崩溃,我怀疑我的Ubuntu18.04就是这样高崩溃的。

2. 指定链接库路径执行

为了避免每次都需要手动执行动态链接库,使用 qemu-riscv64 -h发现设置QEMU的目录动态链接路径即可

3. 配置默认动态链接路径:

相关文章:

Ubuntu20.04搭建RISC-V和qemu环境

1. 前言 risc-v是一个非常有潜力的指令集框架&#xff0c;最近对其产生了浓厚的兴趣&#xff0c;由于之前对于这方面的知识储备很少&#xff0c;在加上网上的教程都是点到为止&#xff0c;所以安装过程异常曲折。好在最后一步一步积累摸索&#xff0c;终于利用源码安装完成。看…...

代码生成器

Easycode Entity ##导入宏定义 $!{define.vm}##保存文件&#xff08;宏定义&#xff09; #save("/entity", ".java")##包路径&#xff08;宏定义&#xff09; #setPackageSuffix("entity")##自动导入包&#xff08;全局变量&#xff09; $!{au…...

AndroidMonitor - 基于AndroidLocalService实现的抓取OKHTTP请求的工具

官网 GitHub - lygttpod/AndroidMonitor: easy show android okhttp request data 项目简介 Demo下载体验 文章介绍---->Android抓包从未如此简单 切记&#xff1a;monitor需要配合monitor-plugin使用 1、monitor接入 添加依赖 debugImplementation io.github.lygttp…...

LuatOS-SOC接口文档(air780E)--nbiot - NB-IOT操作库

nbiot.isReady()# 网络是否就绪 参数 无 返回值 返回值类型 解释 boolean 已联网返回true,否则返回false 例子 -- 判断是否已经联网 if nbiot.isReady() then log.info("nbiot", "net is ready") endnbiot.imsi() 读取IMSI 参数 无 返回值 …...

大数据之LibrA数据库系统告警处理(ALM-12017 磁盘容量不足)

告警解释 系统每30秒周期性检测磁盘使用率&#xff0c;并把磁盘使用率和阈值相比较。磁盘使用率有一个默认阈值&#xff0c;当检测到磁盘使用率超过阈值时产生该告警。 平滑次数为1&#xff0c;主机磁盘某一分区使用率小于或等于阈值时&#xff0c;告警恢复&#xff1b;平滑次…...

Python算法例4 求平方根

1. 问题描述 实现int sqrt&#xff08;int x&#xff09;函数&#xff0c;计算并返回x的平方根。 2. 问题示例 sqrt&#xff08;3&#xff09;1&#xff1b;sqrt&#xff08;4&#xff09;2&#xff1b;sqrt&#xff08;5&#xff09;2&#xff1b;sqrt&#xff08;17&#…...

LVGL_多界面切换

LVGL_多界面切换 1、创建多个界面&#xff08;create_page1();&#xff09; 2、加载一个界面显示&#xff08;lv_scr_load(page1);&#xff09; 3、切换不同界面显示&#xff08;lv_scr_load_anim(page2, LV_SCR_LOAD_ANIM_OVER_LEFT, 300, 0, false);&#xff09; static lv_…...

C/C++输出字符菱形 2021年3月电子学会青少年软件编程(C/C++)等级考试一级真题答案解析

目录 C/C输出字符菱形 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 C/C输出字符菱形 2021年3月 C/C编程等级考试一级编程题 一、题目要求 1、编程实现 给定一个字符&#xff0c;用它构造一个对角线长…...

DI93a HESG440355R3 通过其Achilles级认证提供网络安全

DI93a HESG440355R3 通过其Achilles级认证提供网络安全 施耐德电气宣布推出Modicon M580以太网PAC (ePAC)自动化控制器&#xff0c;该控制器采用开放式以太网标准&#xff0c;通过其Achilles级认证提供网络安全。M580 ePAC使工厂操作员能够设计、实施和运行一个积极利用开放网…...

Go中Panic and Recover

什么是Panic&#xff1f; 在 Go 程序中处理异常情况的惯用方法是使用errors.。errors足以应对程序中出现的大多数异常情况。 **但有些情况下&#xff0c;程序在出现异常情况后无法继续执行。在这种情况下&#xff0c;我们使用panic提前终止程序。当函数遇到恐慌时&#xff0c…...

webpack 与 grunt、gulp 的不同?

结论先行&#xff1a; Webpack、Grunt 和 Gulp 都是前端开发中常用的构建工具&#xff0c;但是 Webpack 是基于模块化打包的工具&#xff0c;并支持模块化开发。而 Grunt 和 Gulp 都是基于任务的构建工具&#xff0c;自动执行指定的任务&#xff0c;但不支持模块化开发。 1、相…...

园区网真实详细配置大全案例

实现要求&#xff1a; 1、只允许行政部电脑对全网telnet管理 2、所有dhcp都在核心 3、wifi用户只能上外网&#xff0c;不能访问局域网其它电脑 4、所有接入交换机上bpdu保护 5、只允许vlan 10-40上网 5、所有接入交换机开dhcp snoop 6、所有的交换机指定核心交换机为ntp时间服务…...

小程序video标签在底部出现1px无法去除的黑色线

问题描述 参见社区问题详情 此问题只会在ios手机真机中出现&#xff0c;视频底部出现1px无法去除的黑色线 解决方法 1.尝试过video各种配置&#xff0c;以为是设置参数导致 2.尝试过父元素设置height&#xff1a;200px&#xff1b;overflow&#xff1a;hidden&#xff1b;vi…...

渗透工具使用及思路总结(持续更新)

扫描类 nmap 快速扫描开放端口 nmap --min-rate 10000 -p- 10.129.252.63扫描详细全服务 nmap -sV -A -p 22,80 10.129.252.63 nmap -sV -A -p- 10.129.252.63-l:显示正在监听的 TCP 和 UDP 端口; -a:显示所有活动的 TCP 连接; -A <网络类型>或 - <网络类型&g…...

速卖通新卖家有必要测评吗?

大家都知道通过测评可以提升产品的转化率&#xff0c;提升产品的销量&#xff0c;那么做速卖通的卖家有必要测评吗&#xff1f; 测评就是类似于国内电商的补单&#xff0c;而一个类目里面竞争很大很卷的话&#xff0c;不去补销量来提升产品的权重&#xff0c;凭借着平台给的自…...

从lc114. 二叉树展开为链表到lc-LCR 155二叉搜索树转化为排序的双向链表

1 lc114. 二叉树展开为链表 1.1 描述 进阶&#xff1a;你可以使用原地算法&#xff08;O(1) 额外空间&#xff09;展开这棵树吗&#xff1f; 1.2 解法一&#xff1a; 先序遍历这棵树并且将节点加入到一个list中&#xff0c;随后按顺序将list中的每一个元素的left指针置换为…...

做读书笔记时的一个高效小技巧

你好&#xff0c;我是 EarlGrey&#xff0c;一名双语学习者&#xff0c;会一点编程&#xff0c;目前已翻译出版《Python 无师自通》、《Python 并行编程手册》等书籍。 在这里&#xff0c;我会持续和大家分享好书、好工具和高效生活、工作技巧&#xff0c;欢迎大家一起提升认知…...

Redis7.x 高级篇

Redis7.x 高级篇 Redis版本发行时间Redis单线程说的是什么东西 Redis版本发行时间 Redis单线程说的是什么东西...

2023辽宁省数学建模B题数据驱动的水下导航适配区分类预测完整原创论文分享(python求解)

大家好呀&#xff0c;从发布赛题一直到现在&#xff0c;总算完成了辽宁省数学建模B题完整的成品论文。 本论文可以保证原创&#xff0c;保证高质量。绝不是随便引用一大堆模型和代码复制粘贴进来完全没有应用糊弄人的垃圾半成品论文。 B用Python&#xff0b;SPSSPRO求解&…...

向量数据库的崛起与多元化场景创新

向量数据库的崛起与多元化场景创新 前言&#xff1a; 在当今数字化时代&#xff0c;数据被认为是黄金&#xff0c;对于企业、科学家和决策者而言都具有巨大的价值。然而&#xff0c;随着数据规模的不断增长&#xff0c;有效地管理、存储和检索数据变得愈发复杂。这就引入了向量…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析

今天聊的内容&#xff0c;我认为是AI开发里面非常重要的内容。它在AI开发里无处不在&#xff0c;当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗"&#xff0c;或者让翻译模型 "将这段合同翻译成商务日语" 时&#xff0c;输入的这句话就是 Prompt。…...

【Oracle APEX开发小技巧12】

有如下需求&#xff1a; 有一个问题反馈页面&#xff0c;要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据&#xff0c;方便管理员及时处理反馈。 我的方法&#xff1a;直接将逻辑写在SQL中&#xff0c;这样可以直接在页面展示 完整代码&#xff1a; SELECTSF.FE…...

高频面试之3Zookeeper

高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个&#xff1f;3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制&#xff08;过半机制&#xff0…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具

文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

GO协程(Goroutine)问题总结

在使用Go语言来编写代码时&#xff0c;遇到的一些问题总结一下 [参考文档]&#xff1a;https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现&#xff1a; 今天在看到这个教程的时候&#xff0c;在自己的电…...

uniapp 字符包含的相关方法

在uniapp中&#xff0c;如果你想检查一个字符串是否包含另一个子字符串&#xff0c;你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的&#xff0c;但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...

MySQL:分区的基本使用

目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区&#xff08;Partitioning&#xff09;是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分&#xff08;分区&#xff09;可以独立存储、管理和优化&#xff0c;…...

Spring Boot + MyBatis 集成支付宝支付流程

Spring Boot MyBatis 集成支付宝支付流程 核心流程 商户系统生成订单调用支付宝创建预支付订单用户跳转支付宝完成支付支付宝异步通知支付结果商户处理支付结果更新订单状态支付宝同步跳转回商户页面 代码实现示例&#xff08;电脑网站支付&#xff09; 1. 添加依赖 <!…...