后文,可参考 《SPIKE源码编译与使用(二)》。
1 SPIKE介绍
一个专门为RISC-V设计的指令集模拟器,由RISC-V基金会开发,其主要聚焦于RISC-V ISA的完整性测试,是golden model simulator,可用来检查RISCV的规范一致性。
它实现了一个较为简洁的模拟环境,通常用来运行和调试RISC-V汇编程序或C程序。相比qemu,spike的实现相对简单,它的主要目的是提供一个轻量级的RISC-V核心模拟,通常不包括周边设备的模拟。在进行系统集成时,可能需要额外的工具来模拟外围设备。
SPIKE仓库:https://github.com/riscv-software-src/riscv-isa-sim/tree/master
2 编译SPIKE
安装依赖
apt-get install device-tree-compiler libboost-regex-dev
创建目录
mkdir build
进入目录
cd build
配置
../configure --prefix=$RISCV
执行编译
make -j32
如果报错: error_code.hpp:686: undefined reference to boost::system::generic_category()
解决办法:
sudo apt-get install libboost-all-dev
vim ../Makefile
- 链接选项末尾,添加
-lboost_system
,如下:
LIBS := -lpthread -ldl -lboost_regex -lpthread -lboost_regex -lboost_system
编译成功,在riscv-isa-sim-master/build目录下,生成了可执行文件spike。
执行./spike -h
,查看模拟器帮助信息。
安装(可选)
make install
3 SPIKE运行应用程序hello world
目前所知的SPIKE模拟器,可以有,如下2种运行方式:
- spike+pk+应用程序
pk为代理内核,可以理解为OS,因此可以直接在pk上,运行应用程序(用户态)。 - spike+bbl
bbl包装了linux kernel,因此,spike可以运行linux kernel。
无论是pk还是bbl,都是由riscv-pk编译生成的。
RISC-V Proxy Kernel(riscv-pk)是RISC-V的一个轻量级应用程序执行环境,可以托管静态链接的RISC-V ELF二进制文件。
riscv-pk仓库:https://github.com/riscv/riscv-pk
我们这里,以spike+pk+hello为例,进行说明。
接下来,我们要编译riscv-pk和hello.c。
3.1 编译riscv-pk
下载源码
git clone https://github.com/riscv-software-src/riscv-pk.git
进入目录
cd riscv-pk
创建目录
mkdir build
进入目录
cd build
配置交叉编译器
../configure --prefix=$RISCV --host=riscv64-unknown-elf
这里下载riscv64-unknown-elf交叉编译器。
安装过程,可参考《TinyEMU之Linux Kernel编译》。
执行编译
make
在riscv-pk/build目录下,生成了bbl和pk可执行文件,但是我们这里只关心pk
。
把pk拷贝至spike可执行程序,所在目录
cp pk ../../riscv-isa-sim-master/build/
3.2 编译hello.c
hello.c代码,如下:
#include <stdio.h>
int main()
{
printf("hello world\n");
}
编译hello.c
riscv64-unknown-elf-gcc -o hello hello.c
注意:
在pk上运行的应用程序,必须是静态编译,也就是说,必须使用elf版本的交叉编译器,来编译hello.c。
将hello拷贝至spike可执行程序,所在目录
cp hello ../riscv-isa-sim-master/build/
3.3 运行hello
我们运行应用程序hello
./spike pk hello
运行结果:
打印出“hello world”。
参考链接: