「monami-ya.mrb」(もなみ や えむあーるびー)は、軽量Ruby言語処理系である mruby に対して,機器組込み向けの拡張を行ったディストリビューションパッケージです。

機器組み込みに最適化された軽量Rubyを低コストで実現

monami-ya.mrb は bitbucket.org 上のホスティングサービスを用いて公開されており、どなたでもダウンロード可能です。 また、オープンソースライセンスに基づく再配布条件の範囲で,自由な再配布や機器組込みが可能です。

https://bitbucket.org/monami_ya_mrb/monami-ya.mrb/

monami-ya.mrb の特徴

monami-ya.mrb では、github.com 上のホスティングサービスで開発が行われている公式リリースのmruby(以下,mrubyと略記)に対して,下記のような,機器組込み向けの拡張を行なっております。

拡張は、RiteVM (mruby のバイトコード処理系),Rakefile (mruby のビルドスクリプト),RTOS との統合など,多岐にわたります。 それぞれについて、概略を示します。

機器組み込みを想定した、独自のエラー処理

mruby では、メモリ枯渇に対する処理が甘く,不定動作に対して厳しい機器組み込み開発での応用は難しいと,弊社では考えました。 そこで、独自のエラー処理フレームワークを追加しています。 エラー処理に関する、主な拡張機能は,下記のとおりです。

  • 設計時想定以上のスタック使用に対する早期の例外送出
  • 副作用が予想される極度のメモリ枯渇時の実行停止
  • エラー時のログ出力先のカスタマイズ
  • C言語API用のテストフレームワークによる、テスト環境の利便性向上

メモリアロケータの改善による省メモリ環境対応

mruby では、メモリアロケータは libc が提供する malloc を用いることが想定されています。 libc が提供する malloc をそのまま mruby で使う場合は、下記のような問題が指摘されています。

  • 実装毎の性能差が大きい
  • 少量のメモリチャンクを頻繁に取得するため、メモリフラグメントを起こしやすく性能低下を招きやすい
  • ジャイアントロックがかかる実装があり、複数の RiteVM 実行環境を持てる mruby のメリットを発揮しづらい
  • 特定の RiteVM 実行環境がメモリを大量に取得することにより、システムに存在する全ての RiteVM がメモリ枯渇を起こす

monami-ya.mrb では、メモリアロケータの改善により,機器組み込みシステムの特徴である省メモリ環境に対応させました。 メモリアロケータに関する、主な拡張機能は,下記のとおりです。

  • メモリフラグメントを起こしづらい TLSF メモリアロケータを、処理系に統合しました。
  • システム上に複数存在しうる RiteVM 実行環境毎に、使用可能なヒープメモリを設定可能としました。
  • RiteVM 実行環境自身の生成を除き、malloc 時のロックが起きない実装となっています。

また、mruby との下位互換性確保のため,libc が提供する malloc との併用も可能となっています。

安定性能に定評のある baisoku.org 版 TLSF の採用

TLSF メモリアロケータの実装として、baisoku.org 版を採用しています。 u-boot ブートローダなどベアメタルでの動作を行うオープンソースでの採用実績が豊富で、安定性能に定評があります。

パブリックドメインライセンス

TLSF メモリアロケータは、ブリックドメインライセンスでの再配布が認められています。 mruby のコードとのライセンス矛盾はなく、機器組み込み時のソースコード開示義務もありません。

mrbgems の sandbox 内実行

mrbgems は、mruby の機能拡張を容易にする,優れたプラグインシステムです。 しかしながら、同一システム上の,全ての RiteVM の実行環境で同じ mrbgems が使用可能になるため,メモリ効率やセキュリティ面で設計が難しいものとなっていました。

monami-ya.mrb では、RiteVM 実行環境毎に,sandbox (砂箱)を設定できます。 sandbox の指定は、ビルドスクリプト中で静的に行います。 実行時に sandbox の設定を変更することはできないため、セキュリティリスクの低減が望めます。

sandbox の使用例

例えば、ハードウェアにアクセスする処理を 特定の RiteVM 実行環境にのみ許可することで, ユーザアプリケーションからの予期せぬハードウェアアクセスというリスクを軽減することができます。

static thread binding による RTOS サポート

mruby が動作する規模の組み込みソフトウェアでは、ベアメタルの場合でも RTOS のサポートがあり, マルチスレッド実行や、割り込みハンドラの記述等ができるものが多いと思われます。

しかしながら、mruby は,言語レベルでのマルチスレッドのサポートを行っていません。

monami-ya.mrb では、RTOS のスレッドと RiteVM 実行環境とを 1対1 に対応させるために, static thread binding という機構を用意しています。

static thread binding に対応した RTOS では、RTOS 固有の設定ファイルや初期化ルーチンを, monami-ya.mrb のビルドスクリプトが自動生成します。 RTOS に依存するコードに悩まされることが無くなります。

サポート

monami-ya.mrb の導入をお考えのお客様に、技術サポートを提供いたします。

2014年6月21日以降、monami-ya.mrb は,TOPPERS/JSP カーネルの拡張コンポーネントとしてサポートされます。 詳細につきましては、TOPPERS/JSP カーネルのオープンソースサポートサービス のページをご参照ください。

2014年6月20日以前に monami-ya.mrb のオープンソースサポートサービスを締結された方は、自動的に TOPPERS/JSP カーネルのオープンソースサポートサービスが追加されます。

また、上記オープンソースサポートサービスの範囲を超えた,お客様の環境に合わせたカスタマイズの受託も可能です。 (特定ボードへの移植、GCC以外のCコンパイラへの対応等) 詳細につきましては、弊社ヘルプデスク inquiry@helpdesk.monami-ya.com までお問い合わせください。