これまで私が書いてきたmrubyには二種類あります。一つはZRouterというツールを使ってビルドしてFreeBSD/mips上で動くもの、もう一つはブートローダーから直接起動されてベアメタルモジュールで動くものです。
始まりはZRouterでした。
ZRouter.orgはウクライナのOleksandr Rybalko(ray)が始めたプロジェクトで始まって15年くらいたちます。私がいじりはじめて10年くらいでしょうか。
MIPS SOCをターゲットにしてOpenWRTのようなものを目指していたようです。
rayはluaを使って作り込もうとしていたようですが、私はmrubyを使うことにしました。
私のやっていることは当初の方向性からかなり外れているのですが、rayは嫌な顔せず(会ったことはないのですが)対応してくれます。
FreeBSD/mipsは12リリースで終わってしまいましたが、githubにforkしたブランチを作りいろいろ手を加えています。
ZRouterができたのはFreeBSDにたまたま実現できる技術があり、それをrayがうまくまとめたからだと考えています。
ルーターのようなMIPS SOCを使ったモジュールでFreeBSDを動かすにはFlashが8M以上でメモリが32M以上ないと実用になりません。
メモリが16M以下だったりするターゲットに、ブートローダーから直接起動するmrubyを実装しました。これをmruby on YABMといってます。
YABMはYet Another Bare Metalで「ちょっと変わったベアメタル」です。
ブートローダーの扱いなどのノウハウはZRouterが大変参考になりました。
まず最初に手を付けたのはRealTek(蟹さん)でした。
蟹さんはMIPSなのですがLexraという亜種になり、専用のgccが必要になります。
蟹さんにはLexraの二種のアーキテクチャがあります。Lexraは古いアーキテクチャなのですが、なんだか疑いたくなるほど早いです。やっぱり蟹さんはねじ切れてます。
ライブラリはnewlib,lwip,bearsslを使っています。
newlibのビルドで感心したのですが、gccのコンフィグレーションを読み取って、自動的に対応してるアーキテクチャそれぞれのライブラリを作ってくれます。蟹さんのgccでは二つのライブラリができます。
同じようにしてBroadcomやADMtekのMIPS 4K/SOCやARMの古いSOCの対応なども行いました。
HTTPSやIPV6のサポートも入ってます。
使い分けはI2Cセンサーからデータ拾って処理するとかはYABMの方を使っています。これはI2Cのような低速なバスの処理をOSが動いているような早いCPUで実行すると無駄が生じるからです。
TFT液晶の表示のような複雑な処理はZRouterで行っています。mini_httpdのCGIでSQLite3へのデータの出し入れにも利用しています。
ZRouterとYABMに共通していることでflashをtftpで書き換えて簡単に何度も試せるようになったことが大きいと思います。
すべてはZRouter.orgがなければ始まらなかったと思います。ウクライナに一日も早い平穏が訪れることを祈ります。💙💛