配置riscv-isa-sim模拟器(包含配置riscv-tools和riscv-toolchain)

前言

riscv-isa-sim是RISCV指令集的一个模拟器,可以在非RISCV的平台上编写、编译并运行RISCV程序,方便相关人员的学习和研究。关于RISCV的相关背景知识本文不再赘述,相关内容在网上多如牛毛,本文重点关注如何在PC上配置RISCV模拟器,并就配置过程中遇到的问题给出解决方法。
为了方便讨论和实践,我们选取Ubuntu 18.04 64bits作为实验平台。在用户目录下建立riscv文件夹(我这里是/home/pi/riscv),此后以此目录作为我们的工作目录,之后各项操作如不特殊说明皆在此目录下进行。
事实上,本人通过实际操作发现,并不用专门配置riscv-isa-sim,而只需要配置riscv-tools即可(因为riscv-tools里包含有riscv-isa-sim,这个在git下riscv-tools后就可以发现里面包含riscv-isa-sim模拟器这个文件夹)。主要配置过程还是参照riscv-tools里的说明文档README.md,本文就是在这篇文档的基础上进行的扩展说明。

配置riscv-toolchain

在配置riscv-isa-sim模拟器之前,需要构建riscv相关工具链,该工具链可以通过以下命令获得:

git clone https://github.com/riscv/riscv-gnu-toolchain 

对于工具链的安装,在riscv-gnu-toolchain下的README.md有详细的说明,这里只给出本人安装时采用的命令。
首先确保依赖库都已经安装:

$ sudo apt-get install autoconf automake autotools-dev curl python3 libmpc-dev libmpfr-dev libgmp-dev gawk build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev libexpat-dev

创建/opt/riscv,并将其访问权限设置为777。

sudo chmod 777 /opt/riscv

运行:

./configure --prefix=/opt/riscv --enable-multilib

这会产生同时支持32位和64位的工具链,产生的工具链包含riscv64-unknown-elf- 或 riscv64-unknown-linux-gnu-前缀。
注意,在configure过程中会不断的下载各种依赖库到riscv-gnu-toolchain中,这些依赖库都是以riscv-开头,由于网络问题,有时候下载速度非常缓慢,各位可以手动下载这些依赖库,例如:riscv-gcc可以通过git命令手动下载:

git clone https://github.com/riscv/riscv-gcc

注意: 有两个库riscv-binutils和riscv-gdb在目前的版本中合并成为一个库:riscv-binutils-gdb,但是configure的时候仍然会检查riscv-binutils和riscv-gdb这两个目录,因此,建议建立两个符号链接:riscv-binutils和riscv-gdb,都指向riscv-binutils-gdb即可。

接下来运行:

make
make linux

这样会在/opt/riscv下产生两套编译工具链:riscv64-unknown-elf-xxx 或 riscv64-unknown-linux-gnu-xxx。其中,riscv64-unknown-elf-xxx工具链我们将在后面编译程序时用到。

配置riscv-tools

首先下载源码:

git clone https://github.com/riscv/riscv-tools

为防止在编译riscv-tests的过程中出现变量重定义错误,先修改文件:riscv-tools/riscv-tests/env/v/vm.c,将第12、13行前的变量加上extern:

extern volatile uint64_t tohost;
extern volatile uint64_t fromhost;

根据README.md文件,先确定依赖包是否安装(有些在编译riscv-gnu-toolchain时已经安装):

$ sudo apt-get install autoconf automake autotools-dev curl libmpc-dev libmpfr-dev libgmp-dev libusb-1.0-0-dev gawk build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev device-tree-compiler pkg-config libexpat-dev

运行:

$ git submodule update --init --recursive
$ export RISCV=/opt/riscv
$ ./build.sh

注意: RISCV环境变量设置为我们安装toolchian的地方。
build完成后riscv-tools编译完成并可以使用。

关于riscv-isa-sim

我们可以发现,在编译riscv-tools时,系统自动下载并编译了riscv-isa-sim,这里主要产生了一个用于在Linux下模拟执行riscv指令的程序spike,该程序位于/opt/riscv/bin中。我们可以通过一个hello程序测试是否部署成功。

#include <stdio.h>
int main(){
    printf("hello world!\n");
    return 0;
}

将其保存为hello.c,编译程序:

/opt/riscv/bin/riscv64-unknown-elf-gcc -o hello hello.c

之后产生可执行程序hello,模拟执行程序:

$ spike pk ./hello
bbl loader
hello world!

注意: 这里可能会产生一个错误:
bad syscall #90463429510455458
解决方法: 修改riscv-tools/riscv-pk/util/string.c,添加最上面的两行#pragma

#pragma GCC push_options
#pragma GCC optimize ("no-tree-loop-distribute-patterns")
void* memset(void* dest, int byte, size_t len)
{
  if ((((uintptr_t)dest | len) & (sizeof(uintptr_t)-1)) == 0) {
    uintptr_t word = byte & 0xFF;
    word |= word << 8;
    word |= word << 16;
    word |= word << 16 << 16;

    uintptr_t *d = dest;
    while (d < (uintptr_t*)(dest + len))
      *d++ = word;
  } else {
    char *d = dest;
    while (d < (char*)(dest + len))
      *d++ = byte;
  }
  return dest;
}
#pragma GCC pop_options

关于riscv-isa-sim的进阶用法可以参考riscv-isa-sim目录下的README.md文件。

最后,欢迎留言或私信。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
riscv-tools的安装可以按照以下步骤进行: 1. 首先,根据需要选择合适的编译器类型。根据引用,riscv-tools的编译器分为裸机和嵌入式Linux两大类。其中,裸机编译器为riscv32-unknown-elf-gcc和riscv64-unknown-elf-gcc,嵌入式Linux编译器为riscv32-unknown-linux-gnu-gcc和riscv64-unknown-linux-gnu-gcc。 2. 在命令行中执行以下步骤来编译相应的编译器: a. 编译裸机编译器riscv32-unknown-elf-gcc: - 进入riscv-gnu-toolchain目录 - 创建一个build目录并进入 - 运行configure命令,设置安装路径和相关参数 - 运行make命令进行编译 b. 编译裸机编译器riscv64-unknown-elf-gcc: - 进入riscv-gnu-toolchain目录 - 创建一个build目录并进入 - 运行configure命令,设置安装路径和相关参数 - 运行make命令进行编译 c. 编译嵌入式Linux编译器riscv32-unknown-linux-gnu-gcc: - 进入riscv-gnu-toolchain目录 - 创建一个build目录并进入 - 运行configure命令,设置安装路径和相关参数,包括启用Linux支持 - 运行make linux命令进行编译 d. 编译嵌入式Linux编译器riscv64-unknown-linux-gnu-gcc: - 进入riscv-gnu-toolchain目录 - 创建一个build目录并进入 - 运行configure命令,设置安装路径和相关参数,包括启用Linux支持和禁用multilib选项 - 运行make linux命令进行编译 3. 另外,根据引用,为了模拟RISC-V二进制文件,还需要构建riscv-fesvr和riscv-isa-sim两个组件。可以按照以下步骤进行: - 获取riscv-tools源码 - 进入riscv-tools目录 - 运行build.sh脚本进行构建 4. 创建安装目录并设置环境变量: - 创建安装目录,例如sudo mkdir /opt/RISCV/riscv64 - 设置目录权限,例如sudo chmod -R 777 /opt/RISCV/riscv64 - 编辑.bashrc文件,添加环境变量设置,例如export RISCV="/opt/RISCV/riscv64"和export PATH=$PATH:$RISCV/bin - 运行source ~/.bashrc命令使环境变量生效 综上所述,以上是安装riscv-tools的一般步骤。根据具体需求选择编译器类型,并根据引用、中提供的命令和参数进行操作即可。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Ubuntu安装riscv-gnu-toolchain和riscv-tools](https://blog.csdn.net/weixin_43283275/article/details/125365614)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [RISC-V Tools编译安装三部曲之一](https://blog.csdn.net/l919898756/article/details/80987091)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值