最近想研究一下体系结构,准备基于模拟器来进行性能、面积、功耗的分析,首先想到的是RISC-V官方发布的模拟器Spike,可选的还有TinyEmu、GEM-5、SimpleScalar等,一个个来吧,估计后面的主力还是GEM-5,但那玩意儿太笨重了,慢慢来吧。
【1】VMWare虚拟机(版本16pro),发行版选Ubuntu 22.04 LTS
上述工具基本上都是在Linux下使用的,所以首先选择平台,我用虚拟机VMWare安装了Ubuntu22.04 LTS版,内存选了8GB,硬盘配了80GB,暂时应该是够了。安装虚拟机及操作系统的过程无难点,就不详述了。
【2】安装riscv-gnu-toolchain
Spike安装运行需要很多依赖,包括运行的程序需要用RISC-V的交叉编译链工具,所以先安装riscv-gnu-toolchain比较好。
实在没想到,这一步是最麻烦的。首先按照网上的攻略,采用源码安装的方式:
①更新软件包列表
sudo apt update
②安装编译所需的依赖包
sudo apt install autoconf automake autotools-dev curl python3 libmpc-dev libmpfr-dev libgmp-dev gawk build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev libexpat-dev libnewlib-dev device-tree-compiler
③下载riscv-gnu-toolchain源码
mkdir -p ~/riscv-gnu-toolchain
git clone https://github.com/riscv/riscv-gnu-toolchain.git
cd riscv-gnu-toolchain
git submodule update --init --recursive
这里噩梦开始了,首先是git clone这一步,由于国内网络访问github.com网速问题,这一步无法顺利进行,好在可以换个源,于是改成
git clone https://githubfast.com/riscv/riscv-gnu-toolchain.git
下载之后,git submodule update这一步,同样需要自动从网上下载子仓库的代码,包括gcc、gdb、glibc、newlib等等,相关信息可以在代码目录的.gitmodules文件里看到。我尝试更换源,不成功。手动下载子仓库编译不成功。而且即使开VPN,虚拟机也不能享用,几乎要绝望了。后来在GQ同志的帮助下,意外发现WSL下可以享用windows的VPN通道,这下终于柳暗花明,成功把所有的代码都下载成功了,下载后的代码总共有11.37GB。拷贝到虚拟机里去,就可以进行下一步了(我放在了~/packages下并解压)。
【2】编译与安装riscv-gnu-toolchain
在编译之前,创建一个专门的构建目录来避免污染源码目录:
mkdir build
配置
cd build
../configure --prefix=/opt/riscv64
sudo make linux -j$(nproc)
要真按这个编译,后面就发现有问题了,因为make linux这个命令会导致生成的工具链是riscv64-unkown-linux-gnu-gcc,这是用来编译用户程序的,也就是说在某64位RISC-V处理器上运行linux,我有个程序要在这个linux下运行,那么就用riscv64-unkown-linux-gnu-gcc即可,但是后面要用到的pk本质上是个裸机程序,因此只能用riscv64-unknown-elf-gcc来编译,所以这里需要改成下面的命令:
cd build
../configure --prefix=/opt/riscv --with-newlib --without-headers --disable-shared --disable-threads --enable-languages=c,c++
sudo make -j$(nproc)
我的电脑上编译大概两三个小时(i5-7500 CPU @ 3.40GHz ,16GB DDR4 2400,虚拟机配置2核CPU,8GB内存)。
编译完成后,使用make install命令将riscv-gnu-toolchain安装到之前指定的目录:
sudo make install
bin目录加入环境变量$PATH:
在~/.bashrc文件里加入一行:
export PATH="$PATH:/opt/riscv/bin"
更新环境变量:
source ~/.bashrc
【3】编译与安装Spike
上一步下载的riscv-gnu-toolchain里有spike源码,可以用来编译安装:
cd ~/packages/riscv-gnu-toolchain/spike
mkdir build
cd build
../configure --prefix=/opt/riscv
make -j$(nproc)
sudo make install
由于spike安装到了与riscv-gnu-toolchain同一目录,可执行的spike程序位于bin目录下,已在上一步加入$PATH,因此不用更新。
【4】编译与安装pk
riscv-gnu-toolchain包里同样有pk源码,可以用来编译安装:
cd ~/packages/riscv-gnu-toolchain/pk
mkdir build
cd build
../configure --prefix=/opt/riscv --host=riscv64-unknown-elf
make -j$(nproc)
sudo make install
bin目录加入环境变量$PATH:
在~/.bashrc文件里加入一行:
export PATH="$PATH:/opt/riscv/riscv64-unknown-elf/bin"
更新环境变量:
source ~/.bashrc
【5】用hello程序验证
首先编写hello.c程序:
#include <stdio.h>
int main() {
printf("Hello, RISC-V!/n");
return 0;
}
编译:
riscv64-unknown-elf-gcc -o hello hello.c
使用spike执行:
spike pk hello
预期结果为:
Hello, RISC-V!