PHS経由でネットに接続できるEthernetアダプタのファームウェアをハック・前編 ―― 無線インターネット・アクセスを組み込みシステム開発の手駒に
● スタックやファイル・システムを備えるOSを開発
TCP/IPを利用したネットワーク関連のプログラミングでは,通信用のプロトコル・スタックを独自に用意するのが難しいという問題があります.そのため,一般にはLinuxやμITRONなどのOSを利用する場合が多いようです.
一方,本機は,ネットワーク・プロトコル・スタックをはじめとして,スレッド管理やメモリ管理,ファイル・システム,レジストリ管理や入出力などのサービスを提供する独自OSを搭載しています.筆者らはこのOSをSilent Moon(サイレントムーン)と呼んでいます.
ユーザは,SilentMoonのシステム・コールを呼び出すことで,本機のすべての機能を利用できます.
ネットワーク・プロトコル・スタックは一般的なソケット・ライブラリの仕様を踏襲しています.そのため,一般的なOSの上に作られたネットワーク用プログラムを比較的容易に移植できると思います.例えばサーバとして動作させる場合には,CreateSocketで作成したソケットにBindを用いてポート番号を割り当て,Acceptで接続を待ちます.相手とセッションが確立するとAcceptから戻るので,新しいソケットのハンドルを引き数にCreateThreadでスレッドを生成してパケットを処理します.これは,ネットワーク用プログラムの作成ではごく一般的な方法です.
なお,ユーザがファームウェアを書き換えても,リカバリ操作を行うことで,ユーザからアクセスできない隠し領域に記録されている工場出荷時の状態に復帰できます.思いり中身を書き換えても心配ありません.心置きなく,カスタマイズの実験を行えます.
● セルフ環境でソフトウェア開発が可能
プログラムを作成するためには,SilentC(サイレント・シー)という独自言語を利用します.SilentCは一般的なC言語のサブセットで,対話型のインタープリタ言語です.20年ほど前のマイコンには,必ずBASICという対話型言語が内蔵されていました.SilentCは,まさにその時代のBASIC言語を現代流のC言語に直したものだと考えてください.
従来までの小型ネットワーク機器上のユーザ・プログラムの開発では,ほとんどの場合,クロスCコンパイラが利用されていました.パソコン上で製作したプログラムをターゲットに送り込んでデバッグする,というスタイルで開発していました.そのため,デバッグにはICE(In-circuit Emulator)やJTAG(Joint Test Action Group)デバッガが必要で,C言語のランタイム・ライブラリのサイズもかなり大きくなってしまいます.Linuxなどの汎用OSのカーネルのサイズも大きく,結果的にフラッシュROMやSDRAMなどのメモリ・デバイスのサイズが大きくなってしまい,高価になりがちでした.また,プログラムを変更するためにユーザランド(ユーザ用データの格納領域)の再構成が必要になったりと,必ずしも使い勝手が良いとは言えなかったと思います.
考えてみると,ちょっとした開発であれば,20年前のBASICを利用した時代の方が短時間で作業が終了していたものです.これは,ポートや変数などの状態を確認しながら対話的にプログラミングを進められるインタープリタ型の言語だったからだと思います.現代においても,ポートやA-D変換の値を監視して,ある条件になったらネットワーク経由でデータを送ったり,携帯電話にメールを送信するという程度の簡単な動作であれば,SilentCのようなインタープリタ言語で十分記述できると考えました.
さすがに昔ながらのBASICにはローカル変数やポインタがサポートされていないので,現代のネットワーク用プログラムを記述するには無理があります.「やはり21世紀のインタープリタはC言語であるべきだ」と考えて,SilentCの処理系を開発・搭載しました.
このように,プログラム開発に必要な機材は本機本体とtelnetで接続できるパソコンだけです.パソコンは,Windowsに標準で内蔵されているハイパーターミナルやtelnetコマンドを利用できれば,それでOKです.