Skip to content
KitploitKITPLOIT
도구익스플로잇블로그
Log in
제출
도구익스플로잇블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

피드문의개인정보© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
riscv-isa-sim — 기능적 RISC-V ISA 시뮬레이터로, 다양한 확장(RV32/64, V, 암호화)을 지원하며 대화형 디버그 모드, GDB 통합, 명령어 수준 모델링을 제공하여 하드웨어-소프트웨어 공동 개발 및 아키텍처 탐색에 사용됩니다. | Kitploit
도구/GitHubGitHub/riscv-software-src/riscv-isa-sim
Embedded Systems SecurityReverse EngineeringDebuggersHardware SecurityLearning & EducationFirmware Analysis
GitHubriscv-software-src/riscv-isa-sim

riscv-isa-sim

기능적 RISC-V ISA 시뮬레이터로, 다양한 확장(RV32/64, V, 암호화)을 지원하며 대화형 디버그 모드, GDB 통합, 명령어 수준 모델링을 제공하여 하드웨어-소프트웨어 공동 개발 및 아키텍처 탐색에 사용됩니다.

저장소 보기
3.2k1.1k383일 전Kitploit 검토 완료

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유
웹사이트

Spike RISC-V ISA 시뮬레이터

소개

RISC-V ISA 시뮬레이터인 Spike는 하나 이상의 RISC-V 하트에 대한 기능적 모델을 구현합니다. 이 이름은 미국 대륙횡단 철도의 완공을 기념하기 위해 사용된 황금 못(golden spike)에서 유래했습니다.

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는 순차 일관성)
  • Machine, Supervisor, User 모드, v1.11
  • Hypervisor 확장, 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.9
  • 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
  • Zilx 확장, v0.1
  • Zimop 확장, v1.0

버전 관리 및 API

프로젝트의 버전은 주로 API가 확장되거나 호환되지 않게 변경된 시점을 나타내기 위해 관리됩니다. 이러한 취지에서 Spike는 SemVer 버전 관리 체계를 따르는 것을 목표로 합니다. 이 체계에서는 하위 호환되지 않는 API 변경이 있을 때 주 버전 번호가 증가하고, 새로운 API가 추가될 때 부 버전 번호가 증가하며, 하위 호환되는 방식으로 버그가 수정될 때 패치 버전 번호가 증가합니다.

Spike의 주요 공개 API는 RISC-V ISA입니다. Spike 내부에 대한 C++ 인터페이스는 현재 공개 API로 간주되지 않으며, 이 인터페이스에 대한 하위 호환되지 않는 변경은 주 버전 번호를 증가시키지 않고 이루어질 것입니다.

빌드 단계

RISCV 환경 변수가 RISC-V 도구 설치 경로로 설정되어 있다고 가정합니다.

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

시스템에서 yum 패키지 관리자를 사용하는 경우 첫 번째 단계를 yum install dtc로 대체할 수 있습니다.

대화형 디버그 모드에서 소켓을 통한 명령 I/O를 사용할 필요가 없다면 두 번째 단계를 건너뛸 수 있습니다.

OpenBSD에서의 빌드 단계

bash, gmake, dtc를 설치하고 clang을 사용하십시오.

$ 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라고 이름을 지정하십시오. 그런 다음 hello라는 이름의 RISC-V ELF 바이너리로 컴파일하십시오:

$ riscv64-unknown-elf-gcc -o hello hello.c

이제 프록시 커널 위에서 프로그램을 시뮬레이션할 수 있습니다:

$ spike pk hello

새 명령어 시뮬레이션

시뮬레이터에 명령어를 추가하려면 두 단계가 필요합니다:

  1. 명령어의 기능적 동작을 riscv/insns/<new_instruction_name>.h 파일에 기술하십시오. 해당 디렉터리의 다른 명령어들을 시작점으로 참고하십시오.

  2. opcode와 opcode mask를 riscv/opcodes.h에 추가하십시오. 또는 riscv-opcodes 패키지에 추가하면 자동으로 처리됩니다:

     $ cd ../riscv-opcodes
     $ vi opcodes       // 새 명령어에 대한 줄 추가
     $ make install
    
  3. 명령어를 riscv/riscv.mk.in에 추가하십시오. 그렇지 않으면 명령어가 빌드에 포함되지 않고 불법 명령어로 처리됩니다.

  4. 시뮬레이터를 다시 빌드하십시오.

대화형 디버그 모드

대화형 디버그 모드를 호출하려면 -d 옵션으로 spike를 실행하십시오:

$ spike -d pk hello

정수 레지스터의 내용을 보려면 (0은 코어 0을 의미):

: reg 0 a0

부동소수점 레지스터의 내용을 보려면:

: fregs 0 ft0

또는:

: fregd 0 ft0

레지스터를 단정밀도 또는 배정밀도로 출력할지 여부에 따라 다릅니다.

메모리 위치의 내용을 보려면 (16진수 물리 주소):

: mem 2020

가상 주소로 메모리 내용을 보려면 (0은 코어 0을 의미):

: mem 0 2020

엔터 키를 눌러 한 명령어씩 진행할 수 있습니다. 또한 원하는 동등 조건에 도달할 때까지 실행할 수도 있습니다:

: until pc 0 2020                   (pc=2020일 때 중지)
: until reg 0 mie a                 (레지스터 mie=0xa일 때 중지)
: until mem 2020 50a9907311096993   (mem[2020]=50a9907311096993일 때 중지)

또는 동등 조건이 참인 동안 계속 실행할 수도 있습니다:

: while mem 2020 50a9907311096993

다음과 같이 무한히 실행을 계속할 수 있습니다:

: r

실행 중 언제든지 (-d 없이도) <control>-<c>로 대화형 디버그 모드에 진입할 수 있습니다.

디버그 프롬프트에서 시뮬레이션을 종료하려면 <control>-<c>를 누르거나:

: q

Gdb로 디버깅

대화형 디버그 모드의 대안은 gdb를 사용하여 연결하는 것입니다. spike는 실제 하드웨어처럼 동작하려고 하므로 이를 위해서는 OpenOCD도 필요합니다. 다음 테스트 프로그램을 사용하겠습니다:

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

// Don't use the stack, because sp isn't set up.
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

이 프로그램을 디버깅하려면 먼저 OpenOCD를 수신하도록 spike를 실행하십시오:

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

별도의 셸에서 적절한 구성 파일과 함께 OpenOCD를 실행하십시오:

$ 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

또 다른 셸에서 gdb 디버그 세션을 시작하십시오:

$ 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 터미널에서는 다음과 같이 표시됩니다:

...
decoded text: Instruction sets want to be free!
semihosting: *** application exited with 0 ***
riscv.cpu halted due to breakpoint. Semihosting is active.
도구 다운로드