そんなときはBusyBoxを拡張して、自由にアプレットを追加しよう。});連載第1〜5回では、BusyBoxにすでにある機能を使ってシステムを構築する方法を紹介しました。「BusyBoxにある機能だけでは、想定しているシステムを構築できない!」といったことも起こり得ます。フラッシュメモリやファイルシステムを取り扱う必要がある場合、BusyBoxにはこれらに関する「アプレット」はあらかじめ用意されていません。いうわけで今回は、BusyBoxを拡張して機能(アプレット)を追加する方法を紹介します。自由にアプレットの追加ができるようになれば、開発の幅も広がるはずです。BusyBoxのソースコードを眺めるアプレットを追加するには、まずBusyBoxのソースコードの構成を知っておく必要があります。「組み込みLinuxで際立つ『BusyBox』の魅力」で説明したとおり、BusyBoxはアプレットの集合体ですので、ソースコードのほとんどは登録されているアプレットに関するものです。menuconfig」で出てくるカテゴリごとに、ディレクトリが作られており、その中にアプレットのソースコードが格納されています。「editors」というディレクトリには、「Editors」カテゴリのアプレットのソースコードが格納されています(「Editors」カテゴリのアプレット「vi」の場合、「editors/vi.c」のようにソースコードが格納されています)。アプレットのほかに知っておく必要のあるものは、「libbb」です。libbbとは、アプレット間で共通して使う関数を集めたもの(定義したもの)で、各アプレットは、libbbで定義された関数をできるだけ使うように実装されており、BusyBoxのサイズ削減に効果を発揮しています。libbbのソースコードは「libbb」ディレクトリ以下に格納されています。組み込みLinuxで際立つ「BusyBox」の魅力アプレットが起動する仕組みアプレットのソースコードを理解するには、どのようにしてアプレットが起動するのかを理解しておく必要があります。「/bin/busyboxへのシンボリックリンクである/bin/lsを実行すると、lsアプレットが起動する」ようになっています。その鍵となるソースコードが、「libbb/appletlib.c」にあります。アプレットを呼び出すためのソースコードの抜粋(1)BusyBoxのmain関数です。(2)0番目の引数argv[0]が、applet_nameにセットされます。applet_nameには、実行したシンボリックリンクの名前が入ります。「/bin/ls」と実行したならば、「/bin/ls」がapplet_nameに入ります。(3)(2)のapplet_nameからディレクトリ名を除去する関数です。applet_nameが、「/bin/ls」ならば、処理後はアプレット名である「ls」となります。(4)applet_nameに格納されたアプレット名に対応したアプレットを呼ぶ関数です。最終的にはこの関数から、<アプレット名>_mainという関数に処理が渡ります。applet_nameが「ls」ならば、ls_mainという関数になります。<アプレット名>_mainという関数は、各アプレットのソースコードで必ず定義されているものです。ように、確かにls_mainという関数が定義されています。これらの関数の中でアプレット特有の処理を行うわけです。アプレットを追加するそれでは、「BusyBoxにアプレットを追加」してみましょう!!ちなみに今回と次回で、「mtd-utils」の中の「mtd_debug」コマンドを移植する作業を紹介しながら、具体的なアプレットの追加方法を解説していきます。「mtd-utils」は、フラッシュメモリを扱うコマンド群で、組み込み開発で使うことが多いものですが、通常BusyBoxには格納されていません。この中にある「mtd_debug」コマンドは、フラッシュメモリの情報を閲覧したり、データを書き込んだりするために使うコマンドです。以下に、新規アプレットを追加するために必要な5つの作業を示します。(1)コンパイルメニューへの追加(2)アプレットのひな型の作成(3)「Makefile」の修正(4)アプレットの中身の記述・移植(5)アプレットのチューニング今回は(1)〜(3)について触れ、必要最低限のアプレットを追加し、動作確認を行います。(4)(5)については次回、実際のアプレットの機能を実装するとともに、チューニングについても解説します。SNSfacebooktwitterITmediaはアイティメディア株式会社の登録商標です。