ネットワーク経由で組み込みソフトのバグを修正する ――後からモジュールを追加できるITRON仕様OSの開発
●モジュール内のシンボルをエクスポートして参照させる
ロード・モジュールは,すべてのシンボル参照関係を解決したリンク単位のオブジェクト・モジュールです.ほかのロード・モジュールの変数や関数を直接参照することはできません.そこで,ロード・モジュール間で変数や関数を共有するしくみとして,モジュール内のシンボルをエクスポートするための静的API(EXPORT)を用意しました.
開発者は,モジュール・コンフィグレーション・ファイルに内部のシンボルをEXPORTで記述(EXPORT宣言)することにより,外部のロード・モジュールに公開することができます(リスト2).
このシンボルのエクスポート情報はロード・モジュールの付加情報として機器のローダ機能内に出力されます.機器の内部では,システムの中で唯一のグローバル参照テーブルにシンボルのアドレス情報が設定されます(図8).
ほかのロード・モジュールがEXPORT宣言されたシンボルを参照する際には,このテーブルからアドレスを引いて間接参照します.モジュール・コンフィグレータはEXPORT宣言されたシンボルを参照するための手順をC言語マクロ記述でグローバル参照ヘッダ・ファイル(global_ref.h)に自動生成します.アプリケーションは,このヘッダ・ファイルをインクルードすることにより,シームレスにほかのロード・モジュールのシンボルを参照できるものとしました(リスト3).
またベース・モジュールも,ロード・モジュールから見れば別のリンク単位であり,シンボルを直接参照することはできません.このことはカーネルのサービス・コールもC言語の関数として直接呼び出すことができないことを意味します.これを解決するため,ベース・モジュールもロード・モジュールと同じように,公開するシンボルをエクスポート記述するという方法を採りました.ロード・モジュール間のシンボル参照と異なる点は,ベース・モジュール内のシンボルは機器ごとに配置アドレスが変わることはなく,シンボルに対応するアドレス情報が存在すれば直接参照できることです.ベース・モジュールにはカーネルのサービス・コールを含む使用頻度の高い基幹機能が存在するため,間接参照によるオーバヘッドはなくしたいと考えました.そこで,ベース・モジュールのエクスポート処理ではシンボルのアドレス情報をリンク・スクリプト形式で出力します.ロード・モジュールは,リンク処理時にこのリンク・スクリプトを読み込むことにより,ベース・モジュールのエクスポート・シンボルを参照できるようになります.
〔リスト2〕シンボルをエクスポートする静的API
モジュール内のシンボルをエクスポートするための静的APIとして,EXPORTを用意した.この静的APIを使ってEXPORT宣言することにより,シンボルを外部のロード・モジュールに公開することができる.
〔リスト3〕global_ref.h内に自動生成されたエクスポート・シンボルの参照マクロ
このようなマクロが記述されたglobal_ref.hをインクルードすることにより,ほかのロード・モジュールのシンボルを参照できる.
〔図8〕モジュール間のシンボル参照のしくみ
ロード・モジュール内部のシンボルをほかのロード・モジュールに公開したい場合,モジュール・コンフィグレーション・ファイルにEXPORT宣言を記述する.記述したシンボルのアドレス情報は,システムのグローバル参照テーブルに設定される.