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

macOS - 上编译运行 risc-v (spike)

文章目录

    • 一、说明
    • 二、安装步骤
    • 三、测试


一、说明

本文根据以下文章改编:

  • RISC-V 环境配置
    https://decaf-lang.github.io/minidecaf-tutorial/docs/step0/riscv_env.html

相关链接:

  • riscv-gnu-toolchain
    GNU toolchain for RISC-V, including GCC
    https://github.com/riscv/riscv-gnu-toolchain
  • brew - Custom-GCC-and-cross-compilers
    https://docs.brew.sh/Custom-GCC-and-cross-compilers
  • riscv-isa-sim
    Spike, a RISC-V ISA Simulator
    https://github.com/riscv-software-src/riscv-isa-sim
  • riscv-pk
    RISC-V Proxy Kernel
    https://github.com/riscv-software-src/riscv-pk

二、安装步骤

1、使用 brew 安装相关依赖

brew install dtc gawk gnu-sed gmp mpfr libmpc isl zlib expat texinfo flockbrew tap riscv/riscv
brew install riscv-tools  
brew install riscv-isa-sim  
brew install qemu

brew 安装的文件包一般位于:/usr/local/Cellar


2、下载预编译好的 RISC-V 工具链
riscv64-unknown-elf-gcc-8.3.0-2020.04.0-x86_64-apple-darwin.tar.gz
https://static.dev.sifive.com/dev-tools/riscv64-unknown-elf-gcc-8.3.0-2020.04.0-x86_64-apple-darwin.tar.gz

解压后,将 bin 目录添加到环境变量


可以得到如下的可执行文件等:

riscv64-unknown-elf-addr2line

  • riscv64-unknown-elf-gcc-ar
  • riscv64-unknown-elf-ld.bfd
  • riscv64-unknown-elf-ar
  • riscv64-unknown-elf-gcc-nm
  • riscv64-unknown-elf-nm
  • riscv64-unknown-elf-as
  • riscv64-unknown-elf-gcc-ranlib
  • riscv64-unknown-elf-objcopy
  • riscv64-unknown-elf-c++
  • riscv64-unknown-elf-gcov
  • riscv64-unknown-elf-objdump
  • riscv64-unknown-elf-c++filt
  • riscv64-unknown-elf-gcov-dump
  • riscv64-unknown-elf-ranlib
  • riscv64-unknown-elf-cpp
  • riscv64-unknown-elf-gcov-tool
  • riscv64-unknown-elf-readelf
  • riscv64-unknown-elf-elfedit
  • riscv64-unknown-elf-gdb
  • riscv64-unknown-elf-size
  • riscv64-unknown-elf-g++
  • riscv64-unknown-elf-gdb-add-index
  • riscv64-unknown-elf-strings
  • riscv64-unknown-elf-gcc
  • riscv64-unknown-elf-gprof
  • riscv64-unknown-elf-strip
  • riscv64-unknown-elf-gcc-8.3.0
  • riscv64-unknown-elf-ld

3、下载 spike 预编译的二进制程序包

spike-pk-prebuilt-x86_64-apple-darwin.tar.gz
https://cloud.tsinghua.edu.cn/f/6246e90c407b4a508816/


解压后,制作 pk 软连接

ln xxx/software/spike-pk-prebuilt-x86_64-apple-darwin/pk  /usr/local/bin/pk

否则执行程序可能报错:

libc++abi: terminating due to uncaught exception of type std::runtime_error: could not open /usr/local/bin/pk (did you misspell it? If VCS, did you forget +permissive/+permissive-off?)


三、测试

实现如下功能:

  • 生成 RISC-V 汇编
  • 使用 gcc 把 RISC-V 汇编变成 RISC-V 可执行文件
  • 用 spike 运行 RISC-V 可执行文件。
                  你的编译器                gcc            qemu/spike
MiniDecaf 源文件 ------------> RISC-V 汇编 -----> 可执行文件 --------> 输出

1、编写文件 input.c

int main(){return 233;}

2、编译到 input.s

riscv64-unknown-elf-gcc -march=rv32im -mabi=ilp32 -O3 -S input.c

得到 cat input.s,你可以查看它的内容

cat input.s

得到:

	.file	"input.c".option nopic.attribute arch, "rv32i2p1_m2p0".attribute unaligned_access, 0.attribute stack_align, 16.text.section	.text.startup,"ax",@progbits.align	2.globl	main.type	main, @function
main:li	a0,122ret.size	main, .-main.ident	"GCC: (g2ee5e430018-dirty) 12.2.0"

3、编译成可执行文件

riscv64-unknown-elf-gcc -march=rv32im -mabi=ilp32 input.s

生成 a.out 文件


你也可以跳过 -s 直接生成可执行文件

riscv64-unknown-elf-gcc -march=rv32im -mabi=ilp32 -O3 test.c

查看 a.out 文件属性

file a.out

得到:

a.out: ELF 32-bit LSB executable, UCB RISC-V, soft-float ABI, version 1 (SYSV), statically linked, not stripped


4、执行 a.out

spike --isa=RV32G /usr/local/bin/pk a.out

打印出

bbl loader

继续执行
打印 $?,这是 spike 的返回码,也就是我们 .c 文件 main 方法返回的值

echo $?

伊织 2023-08-21

http://www.lryc.cn/news/139630.html

相关文章:

  • Linux--线程地址空间
  • 华为OD机试 - 最佳植树距离 - 二分查找(Java 2023 B卷 100分)
  • RNN+LSTM正弦sin信号预测 完整代码数据视频教程
  • 如何自己实现一个丝滑的流程图绘制工具(四)bpmn-js开启只读状态
  • 字节跳动 Git 的正确使用姿势与最佳实践
  • 龙迅LT7911UX TYPE-C/DP转MIPI/LVDS,内有HDCP
  • Spearman Footrule距离
  • docker 安装 Wordpress 用lnmp搭建出现的故障
  • 【C++入门到精通】C++入门 —— 继承(基类、派生类和多态性)
  • 【Spring框架】Spring事务的介绍与使用方法
  • 七夕特别篇 | 浪漫的Bug
  • 数据结构双向链表
  • 解决政务审计大数据传输难题!镭速传输为政务行业提供解决方案
  • redis 7高级篇1 redis的单线程与多线程
  • GO语言:Worker Pools线程池、Select语句、Metex互斥锁详细示例教程
  • vue ui 创建项目没有反应
  • go语言中channel类型
  • 基于STM32F1的电子罗盘HMC5883L角度测量
  • Oracle解锁表、包、用户、杀会话、停job
  • 软考高级系统架构设计师系列论文九十九:论软件开发平台的选择和应用
  • Redis Pub/Sub 指南
  • Nest(2):Nest 应用目录结构和脚手架命令介绍
  • 【嵌入式】MKV31F512VLL12 微控制器 (MCU) 、Cyclone® IV E EP4CE10E22I8LN,FPGA-现场可编程门阵列芯片
  • 矢量调制分析基础
  • ensp-Ipv6配置配置
  • java八股文面试[java基础]—— hashCode 与 equals 区别 == 与 equals的区别
  • Dubbo之PojoUtils源码分析
  • 【C++】—— C++11新特性之 “右值引用和移动语义”
  • 谈一谈redis脑裂
  • 基于原生Servlet使用模板引擎Thymeleaf访问界面