Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
riscv-isa-sim — 功能性RISC-V ISA模拟器,支持多种扩展(RV32/64、V、密码学),具有交互式调试模式、GDB集成和指令级建模,用于硬件-软件协同开发与架构探索。 | Kitploit
工具/GitHubGitHub/riscv-software-src/riscv-isa-sim
嵌入式系统安全逆向工程调试器硬件安全学习与教育固件分析
GitHubriscv-software-src/riscv-isa-sim

riscv-isa-sim

功能性RISC-V ISA模拟器,支持多种扩展(RV32/64、V、密码学),具有交互式调试模式、GDB集成和指令级建模,用于硬件-软件协同开发与架构探索。

查看仓库
3.2k1.1k2天前Kitploit 审核通过

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享
网站

Spike RISC-V ISA 模拟器

关于

Spike,即 RISC-V ISA 模拟器,实现了一个或多个 RISC-V 硬件线程的功能模型。其命名源于庆祝美国横贯大陆铁路竣工时使用的金质道钉。

Spike 支持以下 RISC-V ISA 特性:

  • RV32I 和 RV64I 基础 ISA,v2.1
  • RV32E 和 RV64E 基础 ISA,v1.9
  • Zifencei 扩展,v2.0
  • Zicsr 扩展,v2.0
  • Zicntr 扩展,v2.0
  • M 扩展,v2.0
  • A 扩展,v2.1
  • B 扩展,v1.0
  • F 扩展,v2.2
  • D 扩展,v2.2
  • Q 扩展,v2.2
  • C 扩展,v2.0
  • Zbkb、Zbkc、Zbkx、Zknd、Zkne、Zknh、Zksed、Zksh 标量加密扩展(Zk、Zkn 和 Zks 组),v1.0
  • Zkr 虚拟熵源仿真,v1.0
  • V 扩展,v1.0(需要 64 位主机)
  • P 扩展,v0.9.2
  • Zba 扩展,v1.0
  • Zbb 扩展,v1.0
  • Zbc 扩展,v1.0
  • Zbs 扩展,v1.0
  • Zfh 和 Zfhmin 半精度浮点扩展,v1.0
  • Zfa 扩展,v1.0
  • Zfinx 扩展,v1.0
  • Zmmul 整数乘法扩展,v1.0
  • Zicbom、Zicbop、Zicboz 缓存块维护扩展,v1.0
  • 符合 RVWMO 和 RVTSO(Spike 是顺序一致的)
  • 机器、监管者和用户模式,v1.11
  • 虚拟机监视器扩展,v1.0
  • Svnapot 扩展,v1.0
  • Svpbmt 扩展,v1.0
  • Svinval 扩展,v1.0
  • Svadu 扩展,v1.0
  • Svade 扩展,v1.0
  • Sdext 扩展,v1.0-STABLE
  • Sdtrig 扩展,v1.0-STABLE
  • Smepmp 扩展 v1.0
  • Smstateen 扩展,v1.0
  • Smdbltrp 扩展,v1.0
  • Sscofpmf v0.5.2
  • Ssdbltrp 扩展,v1.0
  • Ssqosid 扩展,v1.0
  • Zaamo 扩展,v1.0
  • Zalrsc 扩展,v1.0
  • Zabha 扩展,v1.0
  • Zacas 扩展,v1.0
  • Zawrs 扩展,v1.0
  • Za64rs、Za128rs 扩展,v1.0
  • Zicfiss 扩展,v1.0
  • Zicfilp 扩展,v1.0
  • Zca 扩展,v1.0
  • Zcb 扩展,v1.0
  • Zcf 扩展,v1.0
  • Zcd 扩展,v1.0
  • Zcmp 扩展,v1.0
  • Zcmt 扩展,v1.0
  • Zfbfmin 扩展,v0.6
  • Zvfbfmin 扩展,v0.6
  • Zvfbfwma 扩展,v0.6
  • Zvabd 扩展,v0.7
  • Zvbb 扩展,v1.0
  • Zvbc 扩展,v1.0
  • Zvkg 扩展,v1.0
  • Zvkned 扩展,v1.0
  • Zvknha、Zvknhb 扩展,v1.0
  • Zvksed 扩展,v1.0
  • Zvksh 扩展,v1.0
  • Zvkt 扩展,v1.0
  • Zvkn、Zvknc、Zvkng 扩展,v1.0
  • Zvks、Zvksc、Zvksg 扩展,v1.0
  • Zvzip 扩展,v0.1
  • Zicond 扩展,v1.0
  • Zilsd 扩展,v1.0
  • Zclsd 扩展,v1.0
  • Zimop 扩展,v1.0

版本号与 API

项目进行版本控制主要是为了表明 API 何时进行了扩展或变得不兼容。本着这一精神,Spike 旨在遵循 SemVer 版本控制方案,其中主版本号在不兼容的 API 变更发生时递增;次版本号在新增 API 时递增;补丁版本号在向后兼容的错误修复时递增。

Spike 的主要公共 API 是 RISC-V ISA。目前,Spike 内部机制的 C++ 接口 不被视为公共 API,并且对此接口的向后不兼容更改 将 在不增加主版本号的情况下进行。

构建步骤

我们假设 RISCV 环境变量设置为 RISC-V 工具安装路径。

root@kitploit:~
$ apt-get install device-tree-compiler libboost-regex-dev libboost-system-dev
$ mkdir build
$ cd build
$ ../configure --prefix=$RISCV
$ make
$ [sudo] make install

如果您的系统使用 yum 包管理器,您可以将第一步替换为 yum install dtc。

在 OpenBSD 上的构建步骤

安装 bash、gmake、dtc,并使用 clang。

root@kitploit:~
$ pkg_add bash gmake dtc
$ exec bash
$ export CC=cc; export CXX=c++
$ mkdir build
$ cd build
$ ../configure --prefix=$RISCV
$ gmake
$ [doas] make install

编译并运行一个简单的 C 程序

安装 spike(参见构建步骤)、riscv-gnu-toolchain 和 riscv-pk。

编写一个简短的 C 程序并命名为 hello.c。然后,将其编译为 RISC-V ELF 二进制文件 hello:

root@kitploit:~
$ riscv64-unknown-elf-gcc -o hello hello.c

现在,您可以在代理内核上模拟该程序:

root@kitploit:~
$ spike pk hello

模拟一条新指令

向模拟器添加一条指令需要两个步骤:

  1. 在文件 riscv/insns/<新指令名称>.h 中描述指令的功能行为。请参考该目录中的其他指令作为起点。

  2. 将操作码和操作码掩码添加到 riscv/opcodes.h 中。或者,将其添加到 riscv-opcodes 包中,它会自动为您完成:

    root@kitploit:~
     $ cd ../riscv-opcodes
     $ vi opcodes       // 为新指令添加一行
     $ make install
    
  3. 将指令添加到 riscv/riscv.mk.in 中。否则,该指令将不会包含在构建中,并且会被视为非法指令。

  4. 重新构建模拟器。

交互式调试模式

要调用交互式调试模式,请使用 -d 参数启动 spike:

root@kitploit:~
$ spike -d pk hello

要查看整数寄存器的内容(0 表示核心 0):

root@kitploit:~
: reg 0 a0

要查看浮点寄存器的内容:

root@kitploit:~
: fregs 0 ft0

或:

root@kitploit:~
: fregd 0 ft0

取决于您希望以单精度还是双精度打印寄存器。

要查看内存位置的内容(物理地址,十六进制):

root@kitploit:~
: mem 2020

要使用虚拟地址查看内存内容(0 表示核心 0):

root@kitploit:~
: mem 0 2020

您可以通过按回车键前进一条指令。您也可以一直执行,直到达到所需的相等条件:

root@kitploit:~
: until pc 0 2020                   (当 pc=2020 时停止)
: until reg 0 mie a                 (当寄存器 mie=0xa 时停止)
: until mem 2020 50a9907311096993   (当 mem[2020]=50a9907311096993 时停止)

或者,您可以在某个相等条件为真期间一直执行:

root@kitploit:~
: while mem 2020 50a9907311096993

您可以通过以下命令无限期地继续执行:

root@kitploit:~
: r

在执行过程中的任何时候(即使没有使用 -d),您都可以通过 <control>-<c> 进入交互式调试模式。

要从调试提示符结束模拟,请按 <control>-<c> 或键入:

root@kitploit:~
: q

使用 GDB 调试

交互式调试模式的另一种方法是使用 gdb 进行附加。由于 spike 试图模拟真实硬件,因此您还需要 OpenOCD 来实现这一点。 我们将使用以下测试程序:

root@kitploit:~
$ cat rot13.c
#include <stdio.h>
char text[] = "Vafgehpgvba frgf jnag gb or serr!";

// 不要使用堆栈,因为 sp 没有设置。
volatile int wait = 1;

int main()
{
    int i = 0;
    while (text[i]) {
        char lower = text[i] | 32;
        if (lower >= 'a' && lower <= 'm')
            text[i] += 13;
        else if (lower > 'm' && lower <= 'z')
            text[i] -= 13;
        i++;
    }
done:
    printf("decoded text: %s\n", text);
}
$ riscv64-unknown-elf-gcc -g -Og --specs=semihost.specs -o rot13 rot13.c

要调试此程序,首先运行 spike 并告知其监听 OpenOCD:

root@kitploit:~
$ spike --rbb-port=9824 -m0x10000:0x20000 rot13
Listening for remote bitbang connection on port 9824.
...

在另一个 shell 中,使用适当的配置文件运行 OpenOCD:

root@kitploit:~
$ cat spike.cfg 
adapter driver remote_bitbang
remote_bitbang host localhost
remote_bitbang port 9824

set _CHIPNAME riscv
jtag newtap $_CHIPNAME cpu -irlen 5 -expected-id 0xdeadbeef

set _TARGETNAME $_CHIPNAME.cpu
target create $_TARGETNAME riscv -chain-position $_TARGETNAME

gdb report_data_abort enable

init
arm semihosting enable
halt
$ openocd -f spike.cfg
Open On-Chip Debugger 0.12.0
...
Info : starting gdb server for riscv.cpu on 3333
Info : Listening on port 3333 for gdb connections
riscv.cpu halted due to debug-request. Semihosting is active.
...
riscv.cpu: target state: halted

在又一个 shell 中,启动您的 gdb 调试会话:

root@kitploit:~
$ riscv64-unknown-elf-gdb rot13
...
Reading symbols from rot13...
(gdb) target extended-remote localhost:3333
...
(gdb) load
...
(gdb) set $sp=0x2fff0
(gdb) b main
Breakpoint 1 at 0x10202: file rot13.c, line 5.
(gdb) c
Continuing.
Disabling abstract command writes to CSRs.

Breakpoint 1, main () at rot13.c:5
5       {
(gdb) print text
$1 = "Vafgehpgvba frgf jnag gb or serr!"
(gdb) until done
[riscv.cpu] Found 4 triggers
main () at rot13.c:16
16          printf("decoded text: %s\n", text);
(gdb) c
Continuing.

Program received signal SIGTRAP, Trace/breakpoint trap.
0x00019ff8 in _exit ()
(gdb) 
...

在 OpenOCD 终端上,您将看到:

root@kitploit:~
...
decoded text: Instruction sets want to be free!
semihosting: *** application exited with 0 ***
riscv.cpu halted due to breakpoint. Semihosting is active.
下载工具