Zephyr上でBrainfuckを(一部)動かしてみる
ZephyrはLinux Foundationが発表したのRTOSである。 ただ触ってみただけでは面白くないので、 ここではZephyr上で動作するBrainfuckインタプリタを(一部)実装して動作させてみる。
準備
ホストとしてGentoo Linux上のVMware Player 7.1.2で動作させたUbuntu 14.04 LTSを用いた。
Zephyr公式ドキュメントにある通りにインストールする。
Zephyrリポジトリは以下に公開されている。
https://gerrit.zephyrproject.org/r/zephyr
ここでは
bf2c827dcf1389d5d92ab1d58e0a305db0dd5026
を用いた。
ただし、
$ make menuconfig
を行う場合に、libncurses5-dev
が必要であることに注意したい。
コードについて
Zephyrリポジトリにあるsample/shellをベースにBrainfuckインタプリタを実装した。 今回はホストで適当に作成したBrainfuckインタプリタを移植する形をとった。 コードは以下に置いてある。
https://github.com/retrage/zephyr_brainfuck.git
しかしながら、Zephyrはまだ開発初期のため、libcが完全に移植されておらず、scanfなどが実装されていない。
そのため、今回の実装では,
命令(標準入力から1文字取得)には対応していない。
現時点ではZephyrのlibc実装は独自のminimalしかないが、newlibを移植する予定があるようである。
また、スタックの制限から配列の要素数は正規の30000未満の500とした。
実行結果
以下に実行結果を示す。ここでは簡単なHello, world!プログラムをqemu_x86上で実行させてみる。
$ make qemu
...省略...
LINK zephyr.lnk
SIDT staticIdt.o
LINK zephyr.elf
BIN zephyr.bin
To exit from QEMU enter: 'CTRL+a, x'
[QEMU] CPU: qemu32
qemu-system-i386: pci_add_option_rom: failed to find romfile "vgabios-cirrus.bin"
> bf +++++++++[>++++++++>+++++++++++>+++++<<<-]>.>++.+++++++..+++.>-.------------.<++++++++.--------.+++.------.--------.>+.
Hello, world!> QEMU: Terminated
確かに動作していることが確認できる。
まとめ
今回はちょっとしたインタプリタを移植してみた。 Zephyrは公開された時点で公式ドキュメントが充実しているので、比較的簡単に動作させることができた。 また、インストールの過程でQEMUをインストールしており、手元にハードウェアがなくても簡単に動作確認とデバッグが できる点で非常に導入がしやすかった。 Linux Foundationが関わっているためか、kernel configやディレクトリの構造がLinux似であるように感じた。