首页 / 资讯中心 / 文章详情

Spike RISC-V模拟器完整安装教程:从源码编译到运行你的第一个程序

Spike RISC-V模拟器完整安装教程:从源码编译到运行你的第一个程序 ★ FEATURED ARTICLE
Spike RISC-V模拟器完整安装教程从源码编译到运行你的第一个程序【免费下载链接】riscv-isa-simSpike, a RISC-V ISA Simulator项目地址: https://gitcode.com/GitHub_Trending/ri/riscv-isa-sim如果你在学 RISC-V 指令集但手头没有开发板也没有目标硬件可以烧录那么 Spike 是一个合适的替代方案。它是 RISC-V 官方的开源指令集模拟器当前仓库版本为 1.1.1-dev用纯软件方式模拟一个或多个 RISC-V hart核心支持 RV32I/RV64I 基线以及 M、A、B、C、F、D、Q、V、Zk 系列密码学扩展、Hypervisor 等大量扩展机器/监管者/用户三级特权模式一应俱全。本文按装好 → 跑起来 → 会用参数 → 会调试 → 看得懂源码的顺序带你完整走一遍 RISC-V 模拟器使用教程。Spike 源码编译依赖安装与配置构建Spike 基于 autotools 构建Linux、macOS 和 WSL 都可以。需要的基础工具是 GCC、GNU Make、Autoconf/Automake另外有两个系统包必须装sudo apt-get install device-tree-compiler sudo apt-get install libboost-regex-dev libboost-system-dev其中device-tree-compilerdtc用于生成设备树是构建的硬依赖Boost 的两个库只在你要用-s通过 socket 做交互式调试时才需要用yum的系统可换成yum install dtc。获取源码并进入独立构建目录git clone https://gitcode.com/GitHub_Trending/ri/riscv-isa-sim cd riscv-isa-sim mkdir build cd buildSpike 的configure脚本约定RISCV环境变量指向工具链安装路径如果已设置可以直接用../configure --prefix$RISCV # 也可以换成 --prefix/usr/local/riscv make -j$(nproc) sudo make install-j$(nproc)按核数开并行编译能明显缩短等待时间。提示装完后终端里找不到spike命令通常是 PATH 没包含安装目录的 bin。执行echo export PATH$PATH:/usr/local/riscv/bin ~/.bashrc source ~/.bashrc即可。想确认当前版本运行spike --help输出的第一行就是版本号。spike pk 运行你的第一个 RISC-V 程序编译好模拟器只完成了一半。跑用户程序还需要两样东西RISC-V 交叉编译工具链以及pkproxy kernel代理内核。spike pk hello这条命令里pk负责处理 printf 这类系统调用让普通程序无需操作系统也能在裸机环境下运行。写一个最小的汇编程序hello.s用ecall触发退出系统调用.section .text .globl _start _start: li a0, 42 # 退出码 li a7, 93 # syscall 93 exit ecall交叉编译并运行riscv64-unknown-elf-gcc -nostartfiles -o hello hello.s spike pk hello echo $? # 应输出 42退出码是 42说明模拟器和工具链这条链路完全打通了。C 程序同理用riscv64-unknown-elf-gcc -o hello hello.c编译后再喂给spike pk即可。提示如果提示hello: Permission denied是宿主机文件权限问题chmod x hello处理一下如果报缺库、符号找不到多半是编译时没链接对工具链检查riscv64-unknown-elf-gcc是否可用。spike 命令行参数内存、核心数与 ISA 怎么配Spike 的启动语法是spike [host options] target program [target options]常用开关如下完整列表见 spike_main/spike.cc 中的help()函数参数作用-pn模拟 n 个核心hart默认 1-mn目标内存大小单位 MiB默认 2048-ma:m,b:n,...自定义内存布局指定基址与大小-d进入交互式调试模式-l输出执行日志配--logname指定文件-g统计 PC 访问直方图--isaname覆盖默认 ISA 字符串--privm\|mu\|msu指定启用的特权级--pcaddress覆盖 ELF 入口点--kernelpath加载内核镜像配--dtb、--initrd、--bootargs--instructionsn执行 n 条指令后自动停止--rbb-portport监听 remote bitbang 端口供 OpenOCD 连接举几个典型场景spike -m 512 pk hello # 只给 512 MiB 内存 spike --isarv64imafdc_v pk hello # 指定支持的扩展 spike --instructions1000 pk hello # 跑满 1000 条指令就停 time spike pk hello # 用 time 粗测模拟耗时Spike 交互式调试单步、看寄存器、等条件命中加-d启动后Spike 在每条指令处停下等你输入命令冒号开头spike -d pk hello常用调试命令回车单步执行一条指令: reg 0 a0查看 0 号核心的整数寄存器 a0: fregs 0 ft0/: fregd 0 ft0按单/双精度查看浮点寄存器: mem 2020按物理地址读内存: mem 0 2020按虚拟地址读: until pc 0 2020跑到 PC 命中 0x2020 为止: until reg 0 mie a跑到 mie 等于 0xa 为止: while mem 2020 50a9907311096993在内存值保持期间持续执行: r恢复连续执行: q退出调试还有一个隐藏技巧即使没用-d启动运行中随时按Ctrl-C也能切入调试模式。如果习惯 gdbSpike 也支持完整的 GDB 工作流——用spike --rbb-port9824监听 remote bitbang 连接中间接一层 OpenOCD 转发 JTAG 语义gdb 再通过target extended-remote挂上去断点、单步、看变量都按常规 gdb 用法来。调试相关的固件和模块代码在 debug_rom/ 与 riscv/debug_module.cc 中。读懂 Spike 源码结构想加自定义指令改哪里Spike 的目录划分比较直观读源码前先看这张地图riscv/insns/每条指令一个.h文件是整个仓库里文件最多的目录riscv/processor.cc单核心执行逻辑取指、译码、执行的主体riscv/sim.cc模拟器顶层多核心调度、内存与外设装配fesvr/前端服务syscall、I/O、ELF 加载、pk都在这一层fdt/设备树device tree的解析与生成spike_main/spike主程序入口与命令行解析spike_dasm/独立的反汇编工具 spike-dasmcustomext/RoCC 自定义扩展的示例实现如 cflushsoftfloat/IEEE 754 浮点运算的 C 实现Spike 不依赖宿主浮点硬件如果你研究新扩展想在模拟器里加一条自定义指令流程是四步在riscv/insns/下新建指令名.h仿照邻近指令写出功能行为在 riscv/opcodes.h 中登记指令的 opcode 和掩码把新文件加入 riscv/riscv.mk.in 的编译清单——漏掉这一步构建时不会包含它运行时会报非法指令回到构建目录重新make。另一种路线是通过 RoCC 接口挂载共享库扩展--extlib加--extension参数在运行时加载customext/ 里的cflush就是可运行的参考样例。模拟器把真实硬件抽象成了代码里可单步、可打断的东西。装好 Spike 之后建议从 riscv/insns/ 里挑几条自己常用的指令读起再配合-l的日志观察一次完整启动过程——理解指令集最快的方式就是看它被逐条执行的样子。【免费下载链接】riscv-isa-simSpike, a RISC-V ISA Simulator项目地址: https://gitcode.com/GitHub_Trending/ri/riscv-isa-sim创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?
咨询建站