Onikiri2をビルドして試す
Onikiri2 というプロセッサシミュレータがあります。
このプロセッサシミュレータを触る機会があったため、ビルドから動作確認までの手順をまとめました。
とは言っても、基本的には README.md や Wiki に従うだけです。
ビルド(Linuxを仮定)
git clone git@github.com:onikiri/onikiri2.git --recursive
cd onikiri2
2024/09/18 以下は修正されたようです
project/gcc/onikiri2
ディレクトリには Makefile
が置いてあるのですが、この中の CXXFLAGS
に -Wno-deprecated-declarations
を追加します。
これは、コード中で deprecated な std::unary_function
が使われており、新しい g++(手元は 13.2.0)だとエラーになってしまうためです。
...
# Platform: linux
ifneq (,$(findstring Linux,$(HOST_TYPE)))
WORK_DIR = WorkLinux/
CXX = g++
- CXXFLAGS = -Wall -Werror -O2 -g -std=c++11 -DONIKIRI_DEBUG \
+ CXXFLAGS = -Wall -Werror -O2 -g -std=c++11 -DONIKIRI_DEBUG -Wno-deprecated-declarations \
-I../../../src \
-I../../../src/pch \
...
あとは make
するだけです。project/gcc/onikiri2/a.out
が生成されます。
(cd project/gcc && make -j$(nproc))
動作確認
benchmark/HelloWorld
ディレクトリには "hello, world" を出力するための main.c
および param.xml
が置いてあります。
どうやら、onikiri2 のバイナリに param.xml
を渡すことでシミュレーションを実行できるようです。
main.c
のコンパイルには riscv64-unknown-linux-gnu-gcc
が使われるため、パスが通っていることを確認しましょう。
(cd benchmark/HelloWorld && make && ../../project/gcc/onikiri2/a.out param.xml)
これで "hello, world" できるはずなのですが、RISC-V GCC(か glibc)のバージョンが当時と異なるせいか unknown syscall と言われてしまいました。
ひとまず src/Emu/RISCV64Linux/RISCV64LinuxSyscallConv.cpp
に不足していた syscall (99, 278) を追加することで対処しました。
# ../../project/gcc/onikiri2/a.out param.xml
Onikiri Version 2.9000
Emulator ... initialized.
Resources ... initialized.
214 brk(0x0) = 89678
214 brk(0x8a170) = 8a170
96 set_tid_address(0x89750) = 3e8
99 = error 0
261 prlimit64(0, 3, 0x0, 0x7ffffffffeb0) = 0
78 readlinkat(-100, 0x64540="/proc/self/exe", 0x7fffffffee20="", 4096) = 0
278 = error 0
113 clock_gettime(1, 0x7ffffffffdb0) = 0
113 clock_gettime(1, 0x7ffffffffdb0) = 0
214 brk(0x0) = 8a170
214 brk(0xab170) = ab170
214 brk(0xac000) = ac000
226 mprotect(0x7f000, 0x3000, 0x1) = 0
79 fstatat(1, 0x64028="", 0x7ffffffffc40, 4096) = 0
64 write(1, 0x8a530, 13)hello, world
= d
94 exit_group() = error 0
きちんと "hello, world" が出力されていますね。
Discussion