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

news2024/11/26 5:37:19

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 = binutils
	url = https://gitee.com/keaide/binutils-gdb.git
	branch = binutils-2_40-branch
[submodule "gcc"]
	path = gcc
	url = https://gitee.com/mirrors/gcc.git
	branch = releases/gcc-13
[submodule "glibc"]
	path = glibc
	url = https://gitee.com/rtlhq/glibc.git
[submodule "dejagnu"]
	path = dejagnu
	url = https://gitee.com/nwpu-ercesi/dejagnu.git
	branch = master
[submodule "newlib"]
	path = newlib
	url = https://gitee.com/mirrors/newlib-cygwin.git
	branch = master
[submodule "gdb"]
	path = gdb
	url = https://gitee.com/keaide/binutils-gdb.git
	branch = gdb-13-branch
[submodule "qemu"]
	path = qemu
	url = https://gitee.com/liwg06/qemu.git
[submodule "musl"]
	path = musl
	url = https://gitee.com/nwpu-ercesi/musl.git
	branch = master
[submodule "spike"]
	path = spike
	url = https://gitee.com/houxibiao/riscv-isa-sim.git
	branch = master
[submodule "pk"]
	path = pk
	url = https://gitee.com/houxibiao/riscv-pk.git
	branch = master
[submodule "llvm"]
	path = llvm
	url = https://gitee.com/mirrors/LLVM.git
	branch = 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/seabios
	url = https://gitlab.com/qemu-project/seabios.git/
[submodule "roms/SLOF"]
	path = roms/SLOF
	url = https://gitlab.com/qemu-project/SLOF.git
[submodule "roms/ipxe"]
	path = roms/ipxe
	url = https://gitlab.com/qemu-project/ipxe.git
[submodule "roms/openbios"]
	path = roms/openbios
	url = https://gitlab.com/qemu-project/openbios.git
[submodule "roms/qemu-palcode"]
	path = roms/qemu-palcode
	url = https://gitlab.com/qemu-project/qemu-palcode.git
[submodule "roms/sgabios"]
	path = roms/sgabios
	url = https://gitlab.com/qemu-project/sgabios.git
[submodule "dtc"]
	path = dtc
	url = https://gitlab.com/qemu-project/dtc.git
[submodule "roms/u-boot"]
	path = roms/u-boot
	url = https://gitlab.com/qemu-project/u-boot.git
[submodule "roms/skiboot"]
	path = roms/skiboot
	url = https://gitlab.com/qemu-project/skiboot.git
[submodule "roms/QemuMacDrivers"]
	path = roms/QemuMacDrivers
	url = https://gitlab.com/qemu-project/QemuMacDrivers.git
[submodule "ui/keycodemapdb"]
	path = ui/keycodemapdb
	url = https://gitlab.com/qemu-project/keycodemapdb.git
[submodule "capstone"]
	path = capstone
	url = https://gitlab.com/qemu-project/capstone.git
[submodule "roms/seabios-hppa"]
	path = roms/seabios-hppa
	url = https://gitlab.com/qemu-project/seabios-hppa.git
[submodule "roms/u-boot-sam460ex"]
	path = roms/u-boot-sam460ex
	url = https://gitlab.com/qemu-project/u-boot-sam460ex.git
[submodule "tests/fp/berkeley-testfloat-3"]
	path = tests/fp/berkeley-testfloat-3
	url = https://gitlab.com/qemu-project/berkeley-testfloat-3.git
[submodule "tests/fp/berkeley-softfloat-3"]
	path = tests/fp/berkeley-softfloat-3
	url = https://gitlab.com/qemu-project/berkeley-softfloat-3.git
[submodule "roms/edk2"]
	path = roms/edk2
	url = https://gitlab.com/qemu-project/edk2.git
[submodule "slirp"]
	path = slirp
	url = https://gitlab.com/qemu-project/libslirp.git
[submodule "roms/opensbi"]
	path = roms/opensbi
	url = 	https://gitlab.com/qemu-project/opensbi.git
[submodule "roms/qboot"]
	path = roms/qboot
	url = https://gitlab.com/qemu-project/qboot.git
[submodule "meson"]
	path = meson
	url = https://gitlab.com/qemu-project/meson.git
[submodule "roms/vbootrom"]
	path = roms/vbootrom
	url = 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-dev
 pip3 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. 配置默认动态链接路径:

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

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

相关文章

python对象方法是什么

python对象方法是什么 概念 1、在类中&#xff0c;对象调用的函数称为对象方法&#xff0c;一般也称为方法。 定义格式 class 类名:def 函数1(self, 参数1, 参数2):...实例 2、在定义对象方法时&#xff0c;第一个参数默认使用self&#xff0c;这个参数在定义时必须存在&am…

new Proxy

Proxy&#xff1a;代理 - JavaScript |MDN网络 (mozilla.org) 首先要确定Proxy的入参&#xff1a;new Proxy 的两个参数分别是目标对象和处理程序。 如下&#xff0c;写了个只有两个方法的Proxy let target {name:张三,age:18}; let handler {get(target, property, recei…

今天,他们一起聊了聊数据融合|CNCC 2023

2023 年 10 月 26-28 日&#xff0c;第二十届中国计算机大会(CNCC 2023)在沈阳市举行&#xff0c;27 日下午&#xff0c;由 OceanBase 申办的「下一代数据融合技术趋势」技术论坛圆满落幕。 会上&#xff0c;OceanBase 联合多位数据库领域知名学者、专家围绕 HTAP 工作负载融合…

Vector CANape 21安装

系列文章目录 文章目录 系列文章目录简介下载 Vector CANape 21 简介 CANape基础操作介绍&#xff1a;工程创建&#xff0c;测量&#xff0c;标定&#xff0c;离线分析操作。 下载 Vector CANape 21 如下是Vector CANape21的下载安装步骤&#xff1a; https://www.vector.co…

uni-app 开发的H5 定位功能部署注意事项

一、H5部署的时候&#xff0c;如果设计到定位功能&#xff0c;需要注意以下几点 1、打包部署的时候需要在Web配置-定位和地图里面勾选一个地图&#xff0c;并配置key 2、打包部署需要域名是https协议的&#xff0c;大多数现代浏览器要求在HTTPS协议下才能够访问地理位置信息&a…

【Python基础知识四】控制语句

Python基础知识&#xff1a;控制语句 1 条件控制1.1 if语句1.2 match...case语句 2 循环语句2.1 for循环2.2 for...else语句2.3 while循环2.4 while 循环使用 else 语句2.5 无限循环 参考 Python控制语句主要包含顺序、选择和循环三个方面&#xff0c;下面主要从这三方面进行介…

winscp文件增量同步到linux服务器

一&#xff0c;点击同步 场景&#xff1a;在做服务器迁移的时候&#xff0c;文件好几十个G一天也迁移不完&#xff0c;每天还有增量的文件&#xff0c;先全量同步一次&#xff0c;然后再用增量同步&#xff0c;然后你用winscp的同步工具&#xff0c;进增量同步。 将本地文件同…

[JavaWeb]——JWT令牌技术

&#x1f308;键盘敲烂&#xff0c;年薪30万&#x1f308; 目录 一、前言&#xff1a; 二、JWT令牌技术 2.1 概念介绍 2.2 组成介绍 2.3 JWT对象介绍 2.4 JWT生成 2.5 JWT校验 三、总结 一、前言&#xff1a; 问题抛出❓ 许多网页都会设置登录界面&#xff0c;我们点击…

HarmonyOS列表组件

List组件的使用 import router from ohos.routerEntry Component struct Index {private arr: number[] [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]build() {Row() {Column() {List({ space: 10 }) {ForEach(this.arr, (item: number) > {ListItem() {Text(${item}).width(100%).heig…

光电直读水表支持短时间多次抄表吗

传统的水表读数方式已经逐渐无法满足人们对于便捷、准确的需求。为此&#xff0c;光电直读水表应运而生&#xff0c;它凭借出色的读数性能和稳定的准确性&#xff0c;赢得了广大用户的一致好评。那么&#xff0c;光电直读水表支持短时间多次抄表吗&#xff1f;答案是肯定的&…

centos7-lamp

目录 一、安装 1.关闭防火墙关闭selinux 2.安装apache 3.配置主页 二、部署mariadb&#xff08;mysql&#xff09; 1.用yum安装 2.启动数据库 3.看下端口是否listen 4登录mysql 5.修改下密码 三、安装php 1.安装依赖包 2.安装php解释器和php连接mysql驱动 3.配置…

网站文章收录因素,别人复制文章排名比你原创的好?

我经常看到有站长抱怨“网站不收录”&#xff0c;“排名不好”&#xff0c;“复制的文章为什么秒收”之类的问题。对于SEO从业者来说&#xff0c;这确实是一个打击&#xff0c;认为搜索引擎不公平。凭什么自己原创不收录&#xff0c;别人复制去了&#xff0c;秒收他的&#xff…

ClickHouse 学习之从高级到监控以及备份(二)

第 一 部分 高级篇 第 1 章 Explain 查看执行计划 在 clickhouse 20.6 版本之前要查看 SQL 语句的执行计划需要设置日志级别为 trace 才能可以看到&#xff0c;并且只能真正执行 sql&#xff0c;在执行日志里面查看。在 20.6 版本引入了原生的执行计划的语法。在 20.6.3 版本成…

库房管理软件采购申请流程代码实现解析

300rmb掏了个javavue2的小系统&#xff0c;学习代码&#xff0c;调整下申请流程。 原有的入库流程是&#xff0c;库管&#xff08;admin&#xff09;提出采购申请给采购员&#xff08;caigou&#xff09;&#xff0c;采购员采购入库时点击入库完成采购入库流程。 想弄清后端代…

基于深度学习之基于KNN算法智慧体育检测系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 智慧体育检测系统是一种基于K最近邻&#xff08;KNN&#xff09;算法的人工智能系统&#xff0c;旨在分析和评估个体…

Docker DeskTop安装与启动(Windows版本)

一、官网下载Docker安装包 Docker官网如下&#xff1a; Docker官网不同操作系统下载页面https://docs.docker.com/desktop/install/windows-install/ 二、安装Docker DeskTop 2.1 双击 Docker Installer.exe 以运行安装程序 2.2 安装操作 默认勾选&#xff0c;具体操作如下…

HCL模拟器综合实验案例(2)

本案例提供给计算机网络专业学生以及参加新华三杯的同学进行学习 题目 由于公司并购前的历史原因导致双方使用不同的 OSPF 进程&#xff0c;经由总部技术部统一规划后再做调整&#xff0c;现阶段使用暂时过渡方案&#xff0c;即使用静态路由、OSPF、RIP、BGP多协议组网&#x…

C++之继承(篇一)

&#x1f37c;博客主页:阿博历练记 &#x1f4d6;文章专栏:c &#x1f68d;代码仓库:阿博编程日记 &#x1f361;欢迎关注:欢迎友友们点赞收藏关注哦&#x1f339; 文章目录 &#x1f95d;1.继承的概念及定义&#x1f4dc;1.1继承的概念&#x1f5dd;️1.2继承图解&#x1f50d…

基于学校优化算法的无人机航迹规划-附代码

基于学校优化算法的无人机航迹规划 文章目录 基于学校优化算法的无人机航迹规划1.学校优化搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要&#xff1a;本文主要介绍利用学校优化算法来优化无人机航迹规划。 …

MySQL 分组后统计 TopN 思路优化

一、表信息 表结构如下&#xff1a; CREATE TABLE score (id int(11) NOT NULL AUTO_INCREMENT,name varchar(255) DEFAULT NULL,score int(11) DEFAULT NULL,PRIMARY KEY (id) ) ENGINEInnoDB AUTO_INCREMENT1746687 DEFAULT CHARSETutf8;使用存储过程生成十万条测试数据&am…