Blog posts by @retrage

mirror of https://retrage.github.io/

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をインストールしており、手元にハードウェアがなくても簡単に動作確認とデバッグが できる点で非常に導入がしやすかった。

参考

https://www.zephyrproject.org/

https://www.zephyrproject.org/doc/

https://ja.wikipedia.org/wiki/Hello_world%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%AE%E4%B8%80%E8%A6%A7#Brainfuck