ネットワーク経由で組み込みソフトのバグを修正する ――後からモジュールを追加できるITRON仕様OSの開発

原田雅章

tag: 組み込み

技術解説 2003年7月28日

●モジュール内のシンボルをエクスポートして参照させる

 ロード・モジュールは,すべてのシンボル参照関係を解決したリンク単位のオブジェクト・モジュールです.ほかのロード・モジュールの変数や関数を直接参照することはできません.そこで,ロード・モジュール間で変数や関数を共有するしくみとして,モジュール内のシンボルをエクスポートするための静的API(EXPORT)を用意しました.

 開発者は,モジュール・コンフィグレーション・ファイルに内部のシンボルをEXPORTで記述(EXPORT宣言)することにより,外部のロード・モジュールに公開することができます(リスト2)

 このシンボルのエクスポート情報はロード・モジュールの付加情報として機器のローダ機能内に出力されます.機器の内部では,システムの中で唯一のグローバル参照テーブルにシンボルのアドレス情報が設定されます(図8)

 ほかのロード・モジュールがEXPORT宣言されたシンボルを参照する際には,このテーブルからアドレスを引いて間接参照します.モジュール・コンフィグレータはEXPORT宣言されたシンボルを参照するための手順をC言語マクロ記述でグローバル参照ヘッダ・ファイル(global_ref.h)に自動生成します.アプリケーションは,このヘッダ・ファイルをインクルードすることにより,シームレスにほかのロード・モジュールのシンボルを参照できるものとしました(リスト3)

 またベース・モジュールも,ロード・モジュールから見れば別のリンク単位であり,シンボルを直接参照することはできません.このことはカーネルのサービス・コールもC言語の関数として直接呼び出すことができないことを意味します.これを解決するため,ベース・モジュールもロード・モジュールと同じように,公開するシンボルをエクスポート記述するという方法を採りました.ロード・モジュール間のシンボル参照と異なる点は,ベース・モジュール内のシンボルは機器ごとに配置アドレスが変わることはなく,シンボルに対応するアドレス情報が存在すれば直接参照できることです.ベース・モジュールにはカーネルのサービス・コールを含む使用頻度の高い基幹機能が存在するため,間接参照によるオーバヘッドはなくしたいと考えました.そこで,ベース・モジュールのエクスポート処理ではシンボルのアドレス情報をリンク・スクリプト形式で出力します.ロード・モジュールは,リンク処理時にこのリンク・スクリプトを読み込むことにより,ベース・モジュールのエクスポート・シンボルを参照できるようになります.

t02_01.gif
〔リスト2〕シンボルをエクスポートする静的API
モジュール内のシンボルをエクスポートするための静的APIとして,EXPORTを用意した.この静的APIを使ってEXPORT宣言することにより,シンボルを外部のロード・モジュールに公開することができる.

t03_01.gif
〔リスト3〕global_ref.h内に自動生成されたエクスポート・シンボルの参照マクロ
このようなマクロが記述されたglobal_ref.hをインクルードすることにより,ほかのロード・モジュールのシンボルを参照できる.

f08_01.gif
〔図8〕モジュール間のシンボル参照のしくみ
ロード・モジュール内部のシンボルをほかのロード・モジュールに公開したい場合,モジュール・コンフィグレーション・ファイルにEXPORT宣言を記述する.記述したシンボルのアドレス情報は,システムのグローバル参照テーブルに設定される.

組み込みキャッチアップ

お知らせ 一覧を見る

電子書籍の最新刊! FPGAマガジン No.12『ARMコアFPGA×Linux初体験』好評発売中

FPGAマガジン No.11『性能UP! アルゴリズム×手仕上げHDL』好評発売中! PDF版もあります

PICK UP用語

EV(電気自動車)

関連記事

EnOcean

関連記事

Android

関連記事

ニュース 一覧を見る
Tech Villageブログ

渡辺のぼるのロボコン・プロモータ日記

2年ぶりのブログ更新w

2016年10月 9日

Hamana Project

Hamana-8最終打ち上げ報告(その2)

2012年6月26日