没有什么比写个模拟器更费神的事情了
作为risc-v官方的模拟器,spike自然具备运行linux的强大功能 (即使很慢很慢),虽然发行版还没有相关的消息,能够运行内核拿到shell也是十分让人觉得激动了。
本文,我们将简单的对整个框架进行描述
从关系的角度看,可以将几个组件之间的关系表述如下
Emulation Environment
+-----------------------------------+
| Software +------------------+ |
| | | |
| +---------+ | Linux | |
| | BBL | | | |
| +---------+ +------------------+ |
+-----------------------------------+
| Hardware |
| Spike |
| |
+-----------------------------------+
注意,在编译的时候,vmlinux以及作为payload作为 BBL 的一部分了,其中BBL, Linux vmlinux 是以risc-v64
作为架构的,bbl除了可以运行在spike上,同时也可以直接交由qemu进行运行(这可以说是相当酷了)
如下
riscv-pk ➤ file bbl
bbl: ELF 64-bit LSB executable, UCB RISC-V, version 1 (SYSV), statically linked, not stripped
...
linux ➤ file vmlinux
vmlinux: ELF 64-bit LSB executable, UCB RISC-V, version 1 (SYSV), statically linked, BuildID[sha1]=53b49230f9ffd2c716f34f0f388112d973b3216d, not stripped
但 spike 是在运行在本机架构的程序。对于模拟而言,它是硬件底层,而实际上,它是运行在被模拟程序和本地机器之间的一个接口
riscv-isa-sim ➤ file spike
spike: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/l, for GNU/Linux 3.2.0, BuildID[sha1]=59b05d12e8a5ad067ac7c4dabacf02e5b88824fc, with debug_info, not stripped
我们简单开了个头,描述了一下几个组件之间的关系,这里进行概括
- 通过risc-v toolchain编译得到的vmlinux,这个是我们要模拟的操作系统内核
- 通过risc-v toolchain编译得到的bbl,其编译过程中会将vmlinux作为payload进行绑定,自身boot完成设置后即跳入linux内核
- 通过本地toolchain编译得到的spike,其是硬件的模拟实现,由这个host程序来完成对以上目标的模拟