(2023/10/10)
[連載17] ローダー機能ー1
ここ何回か、SOLID-IDEの持つデバッグ機能に着目してご紹介してきました。
今回はSOLID-OSの持つ機能を一つご紹介します。
一言で「ロードする」といっても、いろんな意味がありますよね。
組み込みエンジニアがパッと思いつくのは、ある程度のサイズがあるバイナリデータをメモリに書きこむこと、ではないでしょうか。(筆者だけ?)
ベアメタルの場合は、そうですよね。
そして多くの場合、ベアメタルで作るローダーとは、ブートローダーの場合が多いですね。
組み込みOSの世界では?
例えばLinux。
Linuxローダーと言えば、アレです。LILO。(Linux Loader)Linuxを起動するための、ブートローダーです。
このように、組み込みの世界では、ローダーというと、なんだかブートローダーがイメージされませんか?(これも筆者だけ?)
ではもう一つ、WindowsPCの世界では?
Windows PCのアプリを見ると、やたらと****.dllというファイルを目にする事が多いかと思います。
これは、動的リンクライブラリ(Dynamic Link Library)、と言って、実行可能ファイル(***.exe)が実行されるときに必要に応じてロードされるものです。
***.exeは、****.dllを読み込むときにdll内各関数のポインタ―を取得することにより、以降は各関数をコールすることができるという仕組みです。
あ、Dynamic Link LibraryならLinuxでも、共有ライブラリという名前で存在しますね。
(筆者には、あまり「ローダー」という言葉とは結びつきませんでしたが。)
組み込みでも、動的リンクライブラリ、ありますね。
さてここまで、何行も費やして、何が言いたかったかと言うと。。。
「一言でローダーと言ってもいろいろありますね。」
です。
SOLID-OSのローダ―機能、とだけ聞いて、筆者は最初普通にブートローダーだと思いましたよ。
でも違いましたね。
「動的リンクライブラリのローダー機能」です。
以下URLを元にご紹介します。
https://solid.kmckk.com/SOLID/doc/latest/introduction/features.html#elf
最初に、図を拝借させていただきます。
起動直後は、一番上のように、OSやアプリケーションが動作しています。
その状態で、アプリ1をロードすると、既存のOSやアプリケーションとアプリ1との相互呼び出しが可能になります。
さらに、アプリ2をロードすると、既存のOSやアプリケーション、アプリ1とアプリ2の相互呼び出しが可能になります。
これを実現するのが、SOLID-OSのローダー機能です。
アプリ1や2のロードアプリケーション形式として、2種類があります。
・固定アドレスで実行される軽量動作のSOLID形式
・DLL形式
これらの形式については、後ほど触れます。
ローダー機能を使うことによる一番大きなメリットは、分散開発です。
小さなシステムならともかく、現在この複雑化した組み込みソフトウェアの世界においては、開発が一拠点で閉じることはあまりありません。なんなら違う国になっている場合もあります。
このような場合、大抵、
「ソフトウェアの階層等で区切り、APIを定義してモジュール(ライブラリ)を独立させる」
ですよね。
そして、最終的に一つのバイナリファイルを作成するため、各拠点で作成したライブラリを誰かが静的リンクします。
各拠点は、自分の担当部分をデバッグするためには、他拠点のソースコードに似たテスト用コードが必要だったりします。
GitHub等でソースコードを一括管理する事が必要な場合もあります。
このような場合、各拠点で分散して開発しているというよりは、各拠点に散らばってはいるがワンチームで取り組んでいる、という意識の方が近いです。
それに、そのシステムの亜種が必要な場合、同じようないくつものワークスペースやバイナリファイルが出来上がってきます。
図で表してみると、こんな感じですね。
ここで、ローダーを取り入れてみるとどのようになるでしょうか。
例えば上の図で、基幹部のbinaryファイル内のOSがローダーを持っているのであれば、アプリA、B、Cはローダブルモジュールとして作ることができます。
アプリA、B、Cは、例えばSDカード等のファイルシステム上に格納され、必要に応じてローダーによりメモリ空間にロードされます。
この時、シンボル情報も取り込む仕組みになっているため、相互に関数コール等を行う事ができるようになります。
この仕組みの場合、各社はz.binのみあれば自社アプリを開発できますし、その場合に他社部分のソースコードは必要ありません。
それに、アプリの数だけバイナリファイルができあがることがなく、管理が容易になります。
加えて、シンボリック情報も取り入れているためアドレス情報等も解決し、デバッグもできてしまいます。(担当以外の部分をデバッグする場合はソースコードがある方が良い)
このように、ローダー機能を取り入れると、システム開発をうまく分散させる事が可能です。
自分の担当分のソースコードを出さなくてよければ、たとえば秘匿性の高いソースコードもアプリに組み込む事ができますね。
それに、自分の担当部分はあらかじめボードのROMに焼いたうえで、他部分担当チームに渡すこともできます。渡された方も、自分たちの仕事に専念できるわけです。
自分達の担当部分以外の、開発以前の雑多で面倒な事が不要になります。
例えば、全体ビルドが通らない、リンクがない、等のトラブルが回避できますし、そもそもビルド・リンク時間が短くもなりますよね。
また、自分達が担当していない部分について、自分でROMに焼く必要もないわけです。(もう焼かれている)
ボードをもらったら、自分達の担当部分に集中できるので、開発作業全体において開発期間短縮にもつながります。
分散開発という意味をもう少し広げると、「アプリケーションを動かすプラットフォーム」を提供して、ユーザにはローダブルアプリとして自前のアプリケーションを実装してもらうというユースケースも可能になります。
いろいろと書きましたが、考えれば沢山メリットがでてきます。
ご参考に、以下も見てみてください。
ローダーを使った分散開発の流れや、各担当作業について記載されています。
https://solid.kmckk.com/SOLID/doc/latest/tutorial/create_loadable_app_project.html#id5
ここからは、それぞれにおいて、特徴をご紹介します。
以下URLを元にご紹介します。
https://solid.kmckk.com/SOLID/doc/latest/tutorial/create_loadable_app_project.html#id4
先にDLL形式のローダブルアプリケーションの特徴は、
・PIC (位置独立コード)でビルドするためロード時にアドレスが確定する
です。
ビルド時には確定しません。
従って、実行効率、シンボル参照の効率は、SOLID独自形式に比べて少し劣りますが、一般的なDLLと同じような感じで使用することができます。
こちらについての特徴は、
・ビルド時にロードアドレスを決める
です。
このため、一般のDLLとは少し使い勝手が異なってきますが、ビルド時にアドレスを決めますので、静的ライブラリに近い動作を行います。
したがって、実行効率は通常の組み込みファームウェアと同じです、
ローダー機能を使いたいけれども実行効率は落としたくない、という場合に有効な形式です。
ロードするバイナリは、ファイル化して外部記憶装置に置いておくことができます。
ローダーは、SOLIDファイルシステムのレイヤのAPIを使ってロードします。
SOLIDファイルシステムについては以下URLで解説されています。
https://solid.kmckk.com/SOLID/doc/latest/os/filesystem.html
今知っておかないといけない部分のみ抜粋します。
-----------------
SOLIDには、基本構成としてFATファイルシステム、簡易的なメモリファイルシステム、デバッガ接続時のみ 使用可能なVLINKファイルシステムが存在します。 どのファイルシステムへのアクセスかは、パス名の先頭にて区別されます。 例えば、VLINKファイルシステムへのアクセスは、\VLINK\ を先頭につけます。
-----------------
すなわち、こういう事です。
特に真ん中の緑線に囲まれた部分に注目してください。
「簡易的なメモリファイルシステム」となっていますね。
SOLIDでは、わざわざファイルシステムを導入しなくても、¥ROM¥<アドレス><サイズ>と指定すると、そのメモリ領域を簡易的にファイルとして扱う事ができます。
すなわち、ローダー機能を使うために、ファイルシステムを準備する必要がありません。
その他、ユーザがSOLIDファイルシステムに自前のファイルシステムドライバを登録することにより、FATやその他のファイルシステムにフォーマットされたSDカードやUSBメモリといったものからローダブルアプリをロードできるようにすることも可能です。
例えば、Raspberry PI4 SOLID-OSでは、OSCOM_FSというファイルシステムがLinuxファイルシステムにマップされています。
パス名の先頭として、” OSCOM_FS”を指定すると、Linuxにあるファイルシステムからローダブルモジュールをロードすることが可能です。
詳細はこちらを参照してください。
https://solid.kmckk.com/SOLID/doc/latest/tutorial/create_loadable_app_project.html#id14
https://solid.kmckk.com/SOLID/doc/latest/os/filesystem.html
今回は、ローダー機能をご紹介しました。
組み込みソフトウェアで今までDLLというのはあまり見ないので、最初はあまりピンと来なかったのですが、確かに良く考えると分散チームで開発をするにはうってつけの機能ですね。
実際の開発現場では、自社で開発したアプリのソースコードは、同じシステムといえどもあまり渡したくないというケースは意外と頻繁にありました。
次回は、ローダー機能を実際に使ってみる予定です。
まずはDLL方式を見ていきます。