SpikeでLinux向けにコンパイルしたバイナリをどうにかして動かせないかということを試している。
手順としてはこうだ:
- ユーザプログラムを
riscv64-unknown-linux-gnu-gxxでコンパイルする。 - Linuxのイメージと、
fw_jump.elfを用意し、Linuxをブートさせる準備をする。 - rootfs.cpio を作成し、このなかの
rootfs/initに ユーザプログラムを呼び出す支持を挿入しておく。 - Spike を立ち上げる。
まず、以下の hello_world.c を riscv64-unknown-linux-gnu-gcc でコンパイルしておこう。
#include <stdio.h> int main(int argc, char **argv) { printf("Hello World\n"); if (argc > 1) { printf("%s\n", argv[1]); } return 0; }
rootfs.cpioを作成する。
SYSROOT=$(riscv64-unknown-linux-gnu-gcc -print-sysroot) mkdir -p rootfs/lib cp $SYSROOT/lib/ld-linux-riscv64-lp64d.so.1 rootfs/lib/ cp $SYSROOT/lib/libc.so.6 rootfs/lib/\ncp $SYSROOT/lib/libm.so.6 rootfs/lib/ mkdir -p rootfs/bin cp hello_world rootfs/bin
rootfs/init を作成する。
#!/bin/sh /bin/hello_world
find . | cpio -o --format=newc > ../rootfs.cpio
これで、Spikeを立ち上げてみる。
spike --kernel=Image --initrd=rootfs.cpio fw_jump.elf
OpenSBI v0.9
____ _____ ____ _____
/ __ \ / ____| _ \_ _|
| | | |_ __ ___ _ __ | (___ | |_) || |
| | | | '_ \ / _ \ '_ \ \___ \| _ < | |
| |__| | |_) | __/ | | |____) | |_) || |_
\____/| .__/ \___|_| |_|_____/|____/_____|
| |
|_|
Platform Name : ucbbar,spike-bare
Platform Features : timer,mfdeleg
Platform HART Count : 1
Firmware Base : 0x80000000
Firmware Size : 100 KB
Runtime SBI Version : 0.2
Domain0 Name : root
Domain0 Boot HART : 0
Domain0 HARTs : 0*
Domain0 Region00 : 0x0000000080000000-0x000000008001ffff ()
Domain0 Region01 : 0x0000000000000000-0xffffffffffffffff (R,W,X)
Domain0 Next Address : 0x0000000080200000
Domain0 Next Arg1 : 0x0000000082200000
Domain0 Next Mode : S-mode
Domain0 SysReset : yes
Boot HART ID : 0
Boot HART Domain : root
Boot HART ISA : rv64imafdcsu
Boot HART Features : scounteren,mcounteren,time
Boot HART PMP Count : 64
Boot HART PMP Granularity : 4
Boot HART PMP Address Bits: 54
Boot HART MHPM Count : 0
Boot HART MHPM Count : 0
Boot HART MIDELEG : 0x0000000000000222
Boot HART MEDELEG : 0x000000000000b109
うむ、たちあがらんな。要デバッグだ。