ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

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

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

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-compiler(dtc)用于生成设备树,是构建的硬依赖;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 build

Spike 的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 交叉编译工具链,以及pk(proxy 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()函数:

参数作用
-p<n>模拟 n 个核心(hart),默认 1
-m<n>目标内存大小,单位 MiB,默认 2048
-m<a:m,b:n,...>自定义内存布局,指定基址与大小
-d进入交互式调试模式
-l输出执行日志,配--log=<name>指定文件
-g统计 PC 访问直方图
--isa=<name>覆盖默认 ISA 字符串
--priv=<m\|mu\|msu>指定启用的特权级
--pc=<address>覆盖 ELF 入口点
--kernel=<path>加载内核镜像(配--dtb、--initrd、--bootargs)
--instructions=<n>执行 n 条指令后自动停止
--rbb-port=<port>监听 remote bitbang 端口,供 OpenOCD 连接

举几个典型场景:

spike -m 512 pk hello # 只给 512 MiB 内存 spike --isa=rv64imafdc_v pk hello # 指定支持的扩展 spike --instructions=1000 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也能切入调试模式。如果习惯 gdb,Spike 也支持完整的 GDB 工作流——用spike --rbb-port=9824监听 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-dasm
  • customext/:RoCC 自定义扩展的示例实现(如 cflush)
  • softfloat/:IEEE 754 浮点运算的 C 实现,Spike 不依赖宿主浮点硬件

如果你研究新扩展,想在模拟器里加一条自定义指令,流程是四步:

  1. 在riscv/insns/下新建<指令名>.h,仿照邻近指令写出功能行为;
  2. 在 riscv/opcodes.h 中登记指令的 opcode 和掩码;
  3. 把新文件加入 riscv/riscv.mk.in 的编译清单——漏掉这一步,构建时不会包含它,运行时会报非法指令;
  4. 回到构建目录重新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),仅供参考

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进