当前位置: 首页 > 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

相关文章:

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 ht…...

Linux--线程地址空间

1.程序地址空间 先来就看这张图 这是一张程序地址分布的图,通过一段代码来证明地址空间的分布情况 编译结果: 可以看出的是,父子进程中对于同一个变量打印的地址是一样的,这是因为子进程以父进程为模板,因为都没有对数…...

华为OD机试 - 最佳植树距离 - 二分查找(Java 2023 B卷 100分)

目录 一、题目描述二、输入描述三、输出描述四、备注说明五、二分查找六、解题思路七、Java算法源码八、效果展示1、输入2、输出3、说明 一、题目描述 按照环保公司要求,小明需要在沙化严重的地区进行植树防沙工作,初步目标是种植一条直线的树带。 由于…...

RNN+LSTM正弦sin信号预测 完整代码数据视频教程

视频讲解:RNN+LSTM正弦sin信号预测_哔哩哔哩_bilibili 效果演示: 数据展示: 完整代码: import torch import torch.nn as nn import torch.optim as optim import numpy as np import matplotlib.pyplot as plt import pandas as pd from sklearn.preprocessing import…...

如何自己实现一个丝滑的流程图绘制工具(四)bpmn-js开启只读状态

背景 流程图需要支持只读状态和编辑状态 翻看官方案例源码,扒拉到了禁用的js代码 DisableModeling.js const TOGGLE_MODE_EVENT toggleMode const HIGH_PRIORITY 10001export default function DisableModeling(eventBus,contextPad,dragging,directEditing,e…...

字节跳动 Git 的正确使用姿势与最佳实践

版本控制Git 黑马&尚硅谷 Git的前世今生 方向介绍 为什么要学习Git 1.0 Git是什么 1.1 版本控制 1.1.1 本地版本控制 1.1.2 集中版本控制 1.1.3 分布式版本控制 我们已经把三个不同的版本控制系统介绍完了,Git 作为分布式版本控制工具, 虽然目前来讲…...

龙迅LT7911UX TYPE-C/DP转MIPI/LVDS,内有HDCP

1. 描述 LT7911UX是一种高性能的Type-C/DP1.4a到MIPI或LVDS芯片。HDCP RX作为HDCP中继器的上游端,可以与其他芯片的HDCP TX协同工作,实现中继器的功能。 对于DP1.4a输入,LT7911UX可以配置为1/2/4车道。自适应均衡使其适用于长电缆应用&#…...

Spearman Footrule距离

Spearman Footrule距离是一种用于衡量两个排列之间差异的指标。它衡量了将一个排列变换为另一个排列所需的操作步骤,其中每个操作步骤都是交换相邻元素。具体而言,Spearman Footrule距离是每个元素在两个排列中的排名差的绝对值之和。 这个指标的名字中…...

docker 安装 Wordpress 用lnmp搭建出现的故障

第一个故障就是mysql出现的故障了 你起mysql镜像是这么起的导致pid号用不了 docker run --namemysql -d --privileged --device-write-bps /dev/sda:10M -v /usr/local/mysql --net mynetwork --ip 172.20.0.20 mysql:lnmp 解决方法 docker run --namemysql -d --privilege…...

【C++入门到精通】C++入门 —— 继承(基类、派生类和多态性)

阅读导航 前言一、继承的概念及定义1. 继承的概念2.继承的定义⭕定义格式⭕继承关系和访问限定符⭕继承基类成员访问方式的变化 二、基类和派生类对象赋值转换三、继承中的作用域四、派生类的默认成员函数五、继承与友元六、继承与静态成员七、复杂的菱形继承及菱形虚拟继承⭕单…...

【Spring框架】Spring事务的介绍与使用方法

⚠️ 再提醒一次:Spring 本身并不实现事务,Spring事务 的本质还是底层数据库对事务的支持。你的程序是否支持事务首先取决于数据库 ,比如使用 MySQL 的话,如果你选择的是 innodb 引擎,那么恭喜你,是可以支持…...

七夕特别篇 | 浪漫的Bug

文章目录 前言一、迷失的爱情漩涡(多线程中的错误同步)1.1 Bug 背景1.2 Bug 分析1.3 Bug 解决 二、心形积分之恋(心形面积计算中的数值积分误差)1.1 Bug 背景1.1.1 背景1.1.2 数学模型 1.2 Bug 分析1.2.1 初始代码1.2.2 代码工作流…...

数据结构双向链表

Hello,好久不见,今天我们讲链表的双向链表,这是一个很厉害的链表,带头双向且循环,学了这个链表,你会发现顺序表的头插头删不再是一个麻烦问题,单链表的尾插尾删也变得简单起来了,那废…...

解决政务审计大数据传输难题!镭速传输为政务行业提供解决方案

政务行业是国家治理的重要组成部分,涉及到国家安全、社会稳定、民生福祉等方面。随着信息技术的快速发展和革新,政务信息化也迎来了新一轮的升级浪潮。国家相继出台了《国家信息化发展战略纲要》《“十三五”国家信息化规划》《“十四五”推进国家政务信…...

redis 7高级篇1 redis的单线程与多线程

一 redis单线程与多线程 1.1 redis单线程&多线程 1.redis的单线程 redis单线程主要是指Redis的网络IO和键值对读写是由一个线程来完成的,Redis在处理客户端的请求时包括获取 (socket 读)、解析、执行、内容返回 (socket 写) 等都由一个顺序串行的主线程处理…...

GO语言:Worker Pools线程池、Select语句、Metex互斥锁详细示例教程

目录标题 一、Buffered Channels and Worker Pools1. Goroutine and Channel Example 线程和通道示例2. Deadlock 死锁3. Closing buffered channels 关闭通道4. Length vs Capacity 长度和容量5. WaitGroup6. Worker Pool Implementation 线程池 二、Select1. Example2. Defau…...

vue ui 创建项目没有反应

问题 cmd中输入 vue ui 没有反应 解决办法 vue ui命令需要vue3.0以上的版本才可以 1、查看当前版本 vue --version vue版本在3.0以下是没有ui命令的 2、查看版本所拥有的命令 vue -h 3、卸载之前版本的vue npm uninstall vue-cli -g 卸载完成,检查是否已经…...

go语言中channel类型

目录 一、什么是channel 二、为什么要有channel 三、channel操作使用 初始化 操作 单向channel 双向channel,可读可写 四、close下什么场景会出现panic 五、总结 一、什么是channel Channels are a typed conduit through which you can send and receive …...

基于STM32F1的电子罗盘HMC5883L角度测量

基于STM32F1的电子罗盘HMC5883L角度测量 参考 1. HMC5883L模块 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Axqqv48y-1692885921487)(…\img\HMC5883L.png)] 型号:GY-271使用芯片:HMCL5883L供电电源:3-5V通…...

Oracle解锁表、包、用户、杀会话、停job

Oracle解锁表、包、用户、杀会话、停job 一、创建包tzq_server_pkg二、授权给需要使用的用户log三、解锁表:执行存过unlock_table(schema_name, table_name)四、解锁包:执行存过unlock_package(schema_name, pkg_name)五、解锁用户:执行存过u…...

智能电网RAG优化:闭环协同与精准检索

RAG论文原理解析、公式含义与错误点对点修正方案 一、论文核心原理详细解析(含场景举例) 本文针对通用RAG框架在术语密集、强监管垂直领域(智能电网)的三大原生适配瓶颈,提出了** RAG领域原生闭环协同RAG范式**,核心是将智能电网领域知识嵌入检索-生成-评估全生命周期,…...

PrivLLM 协变混淆:隐私保护的 LLM 推理高效实现

用户接入云上大模型(LLM)时,通常面临端-云数据交互如提示词上传等隐私泄露风险。常规脱敏和加密手段难以同时保障数据安全隐私和推理高效准确,陷入“安全”与“智能”不可兼得的困局。为此,字节跳动安全研究团队提出了…...

国之重器 openKylin 入驻 AtomGit:打造全球领先的智能操作系统开源根社区

操作系统是数字基础设施的核心基石,传统 Linux 操作系统用户和开发者经常面临系统软件更新不稳定、存量软件不兼容、开发适配成本高、显示渲染效率低等问题。在 AI 浪潮席卷全球的当下,将 AI 能力与操作系统已成紧密结合,打造智能交互新范式已…...

别再手动数了!用Apache POI和iText,5行代码搞定Java批量统计文档页数

5行代码实现Java批量文档页数统计:Apache POI与iText的高效实践 当你在整理年度报告、审计文档或准备印刷材料时,是否曾被成百上千份文档的页数统计折磨得焦头烂额?手动打开每个文件查看页数不仅效率低下,还容易出错。今天&#x…...

2026年中国企业AI应用场景报告

当多模态技术突破模态壁垒,当超级智能体成为业务重构的核心执行者,AI 正从实验室走向产业深水区,成为企业降本增效、创新增长的关键引擎。但与此同时,“AI 应用停留在工具层面”“落地效果不及预期”“行业场景适配难” 等痛点&am…...

记录一次 反射引起的Metaspace OOM 的完整排查

一、问题背景线上某个 Spring Boot 服务偶发出现:java.lang.OutOfMemoryError: MetaspaceJVM 参数中已经限制:-XX:MetaspaceSize512m -XX:MaxMetaspaceSize512m但监控显示:Metaspace used ≈ 370MB Metaspace committed ≈ 508MB看起来仍…...

faster-whisper-GUI架构设计与性能优化:构建高效语音识别工作流的技术实践

faster-whisper-GUI架构设计与性能优化:构建高效语音识别工作流的技术实践 【免费下载链接】faster-whisper-GUI faster_whisper GUI with PySide6 项目地址: https://gitcode.com/gh_mirrors/fa/faster-whisper-GUI 在语音识别技术快速发展的今天&#xff0…...

PHP-JWT:PHP 中 JSON Web Tokens 的完整实现指南

PHP-JWT:PHP 中 JSON Web Tokens 的完整实现指南 【免费下载链接】php-jwt 项目地址: https://gitcode.com/gh_mirrors/ph/php-jwt Firebase PHP-JWT 是一个遵循 RFC 7519 标准的 PHP JSON Web Tokens 实现库,提供安全、高效的 JWT 编码和解码功…...

N8N不只是工作流工具:手把手教你把它变成双向MCP网关,连接百度地图和AI Agent

N8N架构实战:构建双向MCP网关连接百度地图与AI Agent生态 在AI Agent技术栈中,协议桥接能力正成为系统设计的核心挑战。当Claude需要调用地图服务、Cursor尝试接入CRM数据时,传统API集成方式往往需要编写大量适配代码。而N8N通过独特的双向MC…...

HorizonCalendar与Airbnb设计系统的完美融合:打造iOS应用中的顶级日历体验

HorizonCalendar与Airbnb设计系统的完美融合:打造iOS应用中的顶级日历体验 【免费下载链接】HorizonCalendar A declarative, performant, iOS calendar UI component that supports use cases ranging from simple date pickers all the way up to fully-featured …...