SOLID概要

(前ページへ)

インテリジェントローダーの仕組み

コアサービスという縁の下の力持ち

SOLIDでは「コアサービス」と名付けた一連のランタイムがIDEと密接に連携することで、特長的な機能の多くを実現しています。インテリジェントローダーもコアサービスに実装されている機能のひとつです。
コアサービスには、ローダーの他にターゲットのリソース(メモリ/MMU, 割り込み, タイマ等)の管理と、ユーザーへの補助(デバッグ)といった機能があります。
コアサービスはターゲットシステムの一部に常駐しており、システムセットアップや動的解析機能を使ったデバッグ時など、必要に応じてIDEとも連携して動作するソフトウエアです。 少し古いですが「BIOSのようなもの」と言えばイメージがわきやすいかと思います。ソフトウエアの構造としては、第二回目の「ローダーの使い方」でもご紹介したようにシンプルなAPI群を使ってリソースを操作するものとなっています。
またコアサービスでは、ブート時のMMUの仮想アドレスへの移行といった、ユーザーが操作するのが面倒な処理も受け持っています。
このようなSOLIDコアサービスの機能には、従来の開発環境やデバッグツールにおいては、PC側で処理を行っていたものもあります。「使いやすさ」「リアルタイム」「コンパクト」を追求していく中で、ユーザーが「スマート」に開発できるよう「シンプル」な仕様として出来上がったのがランタイムという形でのコアサービスです。
ちなみに、コアサービスは、京都マイクロコンピュータの造語です。縁の下の力持ちという役割であり、SOLIDには無くてはならない重要な存在です。

ロード対象ファイルに含まれる情報は?

SOLIDではツールチェーン(Clang/GCC)でビルド操作を行い実行バイナリのオブジェクトフォーマットであるELFフォーマットでアプリケーションの実行モジュールを生成します。
このELFフォーマットの実行モジュールには、リロケータブル可能なプログラム本体と、ELF情報としてロード処理に必要なシンボル情報および再配置情報が含まれています。SOLIDで分割ロードをする場合は、図3-3のようにコアサービス内にあるELF解析機構がロード対象の実行モジュール内のELF情報を参照しながら、シンボル解決を行います。
なお、この実行モジュールには、ソースコードのあるファイルのルートパス情報や、ソースコード内の行番号情報といったソース情報は含まれていません。
シンボル情報に相当するELF情報を含むSOLID実行モジュールは、それを含まないモジュールに比べて一般的に約10~20%程度ファイルサイズが大きくなります。

図3-3 ロード対象ファイルはELF情報を含む

ローダーが行っている処理

インテリジェントローダー本体はSOLIDで本体アプリをビルドする際に本体アプリ内にコアサービスとして生成されます。
第二回目で紹介した以下の2つのAPIによりインテリジェントローダーが動作します。
ローディングAPI [SOLID_LDR_LoadFile()]:
実行可能チェックAPI [SOLID_LDR_CanExec()]
これらのAPIがコールされるとコアサービスに制御が移り、ファイルシステム経由で実行モジュールを読み込み、シンボル情報を解析してアドレス配置を決定し(MMUの設定を含む)、物理メモリにプログラムをロードします。
SOLIDでは、コアサービスを含む本体アプリは必ず1つ必要です。またサブアプリは0~N個とその数に制限はありません。
シンボルの相互参照はサブアプリ間であっても有効であり、ローディングAPIや実行可能チェックAPIを実行した際に、コアサービスはサブアプリ間のシンボルの相互参照についても解決処理を行います。
なお、インテリジェントローダーでは実行プログラムをRAM上に配置することを前提としているため、ROM上やファイルシステム内のプログラムを直接実行することは前提としていません(なぜなら、シンボル解決によるアドレスの再配置ができないからです)。

MMUによるメモリ管理と密接に連携するインテリジェントローダー

上記では、分割ロードをするためにはアプリ相互の共有シンボルや変数などのシンボル解決をランタイム内で処理することをしていることを説明しました。ファイルシステム上にあるデータ(実行モジュール)を解析し、アドレス解決をしながら実メモリ(物理アドレス)にプログラムをロードする際には、MMUを有効活用することでメモリを効率よく利用できるようになります。
SOLIDのもう一つの特徴である「MMUの管理を簡単に行う」では、開発環境上のシンプルなGUIで論理・物理アドレスの設定を行うだけでMMU設定処理をSOLIDが生成する、という機能があります。Arm Cortex-Aプロセッサでは比較的設定が複雑とされているMMUの処理をSOLIDが代わりに行うというものです。
インテリジェントローダーにおいても複雑なシンボル解決とプログラムの配置に関わる一連の処理はSOLIDがコアサービスの中で行っており、その過程ではMMUによるメモリ空間の管理を同時に処理しています。
インテリジェントローダー行う実行時のアプリ間アドレス解決は広義の論物変換であり、MMUの仕事ともいえるでしょう。

(次ページ ツール屋として、できる事をとことん考えた)