組込み開発におけるLinuxシステムについて

携帯電話を代表として、組み込みシステム開発では様々なオペレーティングシステム(以後OS)が利用されています。
それぞれの特徴、製品のシステム要件と併せてOSを選定することが重要です。
このコラムでは、昨今組み込みシステムの開発においても多く採用されているLinuxに関して触れたいと思います。

組込み開発におけるLinuxシステムについて

組込でLinuxが使われるようになった経緯

Linuxと聞くとなんだか難しい、複雑だと考えられる方が多いと思います。恐らくその理由というのは、「コマンドでいちいち命令しなくては動かない」「Windowsのようなアイコンでクリック操作できない」など、あのMS-DOS(マイクロソフト社が販売・開発していた16ビットのオペレーティングシステム)のような黒い画面のイメージが強いからではないでしょうか。
筆者が10年ほど前、新入社員として入社した時、マイコンを使った組み込みシステム開発のソフトウェア開発環境としてLinuxを利用していました。「理解できない…私にはとうてい使いこなすことなんてできないな…」そう思っていました。
そのような思いをお持ちのみなさん、

  • 「Ubuntu(ウブントゥ/コミュニティによって開発されているOS)
  • 「Debian(デビアン/ボランティアによるフリーでオープンソースなOSを作ろうというプロジェクト、またはそれによって作成されたOS)

などのキーワードで、Googleで画像検索してみてください。Windows PCのようなデスクトップ画面が表示されたでしょうか。あの時のような黒い画面は跡形なく、非常に使いやすいデスクトップ環境が様々なハードウェア向けに提供されており、インストールも非常に簡単です。

さて本題に入りましょう。昨今、エンベデッドシステムのソフトウェア開発を行うと、どこもかしこもプラットフォーム候補としてLinuxという言葉が聞かれます。スマートフォンやタブレットなどのモバイル機器で利用される、今や携帯向けOSシェアトップを誇るAndroid(アンドロイド)、じつはこちらもAndroidの下でプラットフォームとしてLinuxが動いているのです。
なぜ組込でLinuxがここまで使用されるようになったのでしょうか?Linuxは元々PC向けに開発されたOSで、デスクトップPCやサーバー機器で利用されてきました。ご存じのとおり、Linuxはフリー(無償)かつオープンソースなソフトウェアであり、世界中のsw(ソフトウェア)開発エンジニアが性能改善・改変、機能追加、バグFixなど日々手を加えることで進化しリリースされ続けてきました。

組み込みシステムにLinuxを搭載しようと検討がなされた当初は、多くのマイコンはMMU(メモリ管理ユニット)を持たないCPUアーキテクチャであり、元々PC向けに開発されたOSであるLinuxを使用することはできませんでした。MMUとはメモリー空間を制御するハードウェアーで、仮想アドレスと物理アドレスを変換する機能と特定のメモリへの書き込み禁止などのアクセス保護の機能を有し安全なシステム環境を構成する事ができますが、当時組み込みシステム用途となると価格が高く、よほどハイエンドの製品でないとMMUを利用することができませんでした。
このような状況の中、MMU無しでも動くμClinux(マイクロシーリナックス)が開発され、組み込み製品・組込み機器でもLinuxが使われ始めて行きました。

その側面で組み込み製品・組み込み機器の高機能化が進みμiTron(マイクロアイトロン/組み込みシステム用リアルタイムOSの仕様)などの従来の組込OSでは機能不足であることが顕著になってきました。
このような時流の中でネットワーク機能やファイルシステム、デバイスドライバなど豊富なソフトウェアが初めから付属するOSが無償でつかえるとなれば、組み込み機器でもLinuxを利用しようと動きがでてくるのは必然だったでしょう。またハードウェアも高機能化と低価格化が進み、マイコンも性能が向上しMMU搭載の製品も多く登場してきました。ようやく組み込みシステムの開発目的でLinuxが使用できる環境になったのです。
もちろんこの流れに合わせてLinux自体も組み込みシステム構築向けに性能改善しており、ROM、RAMなどのリソースの削減や、比較的低いスペックのCPUでも動作できるように、起動時間の高速化や最適化などの機能改善がなされていったのです。

今日では爆発的に普及したARMマイコンをはじめとして、MIPS、PowerPC(Motorola社とIBM社が共同で開発したパソコン向けのマイクロプロセッサ)、SuperH、インテル社のATOMなどの様々なCPUアーキテクチャで動作するようにLinuxがポーティングされています。それぞれのCPUアーキテクチャやボードに応じて、周辺ペリフェラルのデバイスドライバ、ブートローダーであるu-bootなども一緒に提供されているケースが殆どです。(※1)

※1 これまでLinuxと一括りにしてきましたが、厳密に定義を分けるとLinuxとはOSとしての機能をつかさどるLinuxカーネルと、デバイスドライバやミドルウェアなどのソフトウェア群を指すLinuxディストリビューションの2つに分かれます。これらを総称してLinuxシステムと言います。また、これとは別にアプリケーションが搭載されるユーザーランド、Linuxを起動するためのブートプログラムであるu-bootが存在します。

Linuxを利用するメリット、デメリット

冒頭でも触れましたが、組み込みシステム開発の際にLinuxを利用するメリットは豊富なソフトウェアを無償で利用できることです。しかしながらデメリットも存在することは確かです。もう少し詳しくメリットとデメリットに触れてみましょう。

[メリット]

オープンソースであり無償である
オープンソースとしてのライセンス規定(GPLやLGPLなど)に準ずれば無償で商用利用可能です。

ミドルウェアが豊富
ネットワークスタックとして標準的なTCP/IP、UDP、HTTPなどはもちろん、USB、WiFi、Bluetoothといったプロファイルやクラスに相当するスタックも用意されています。
またファイルシステムも複数用意されていますので用途に応じて選択することができます。

デバイスドライバが豊富
様々なCPUアーキテクチャに対応した周辺のデバイスドライバが付属されています。たとえそのデバイスに応じたドライバが付属していなくても、他CPUアーキテクチャのドライバをベースにして、ハードウェア依存部をカスタマイズすることで一からドライバを作るよりもはるかに効率的に開発することが可能です。

組み込みシステム開発に必要な環境がそろっている
コンパイラやリンカなどの開発環境も無償で提供されているものが殆どです。開発の多くはPC上のLinuxに開発環境を構築して実際の開発に臨むことが多いです。

デバッグツールが用意されている
GDBやDDDといったツールを利用してデバッグすることが可能です。またLinuxカーネル自体にトレースやログなどの機能を保有しているので、その機能と組み合わせることで詳細で効率的なデバッグを実施することが可能です。

WEBや書籍など豊富な情報が公開されている
世界中の開発者・プログラマ・エンジニア・組込み技術者がオープンソースのLinuxに携わっています。デバイスドライバの開発の仕方や、アプリケーションプログラムの開発の仕方、Linuxカーネルとは何か、その仕組みなどWEBや書籍にそれらを解説する開発入門系情報がたくさん掲載されています(Linuxカーネルとは、実践、基礎、入門編から解説がなされています)。またメーリングリストやコミュニティも活用することで行き詰った時、問題が起こった時も誰かがすぐに助けてくれる環境にあるのです。

[デメリット]

リアルタイム性
iTronを代表とする組み込み向けOSのμsecオーダーのリアルタイム性と比べ、msecオーダーのリアルタイム性となります。
Linuxは元々PC向けに開発されたOSであるためこの点を考慮できていませんが、現在ではリアルタイム性の追求をおこない機能改善されれつつあります。

ハードウェアのリソース消費量の多さ
組み込み向けに省資源化されているとはいえども他組み込みOSよりははるかにROM、RAMの使用率が大きくなっています。リッチなハードウェアを利用する関係上、消費電力も従来の組み込みOSと比較すると省電力ではありません。

起動時間
他の組み込み向けOSが1秒程度で立ち上がるのに対して、Linuxは早くても6秒、遅い場合には30秒ほど掛かってしまいます。逆に突然の電源断の対応も他の組み込みOSと違い考慮されておりません。

組込Linuxの種類

組込Linuxにはカーネルのバージョンとは別にディストリビューターと呼ばれる企業が提供する有償のパッケージと、有志やコミュニティが提供している無償のパッケージが各種あります。ではこの2つの違いはなんでしょうか。 これまで説明してきました通り、組み込みLinuxは誰でも使用することができる反面、動作不具合やバグなどがあった場合は自己で責任を負う必要があります。組み込みLinuxは非常に膨大なソースコードを持つOSです。製品を世の中に出した後に何かしらの不具合があったら自分たちで対応できるだろうか…、Linuxカーネルのコアの部分で不具合があったらだれが保障するのだろうか…と心配される方も多いでしょう。

このユーザーの不安を取り除くサービスメニューとしてディストリビュータが有償のパッケージとして提供しているのです。機能追加、リアルタイム性の付加やハードウェアリソース消費量の削減などの性能向上、使いやすさの向上などオープンソースの組み込みLinuxをベースに独自のカスタマイズを加えてユーザーに提供しています。またオリジナル性という部分に付加して製品開発や製品出荷後のアフターフォローまでディストリビューターが技術サポートを実施するというサポート契約サービスを合わせて提供しており、組み込みLinuxを使用するユーザーの不安や障壁を取り除いているのです。

ソフトウェアライセンスの取り扱いに関して

Linuxシステムのソフトウェアには様々なライセンスがあり、そのライセンスに対しての理解を十分にした上での利用をしないと、製品化後の訴訟やソース公開などのリスクがあります。代表的なものを2つほどご紹介します。

[GPL]

  • -コピーレフトのライセンス
    ※GPLライセンスが適用されたソースコードから派生したものすべてがGPLライセンスに帰属する。関連するソースコードや、リンクされるライブラリも同様。
  • -ソースコードの公開が原則、配布をする際に必要
  • -自由に複製して良い
  • -自由に配布して良い
  • -商用利用して良い

[LGPL]

  • -コピーレフトのライセンス
    LGPLライセンスが適用されたソースコードから派生したものすべてがLGPLライセンスに帰属するが、関連するソースコードや、リンクされるライブラリに例外がある。
  • -LGPLライセンスが規定されるソースコードに関連する、新規や独自のソースコードはLGPLライセンスが規定されない。
    ただし公開されたLGPLソースコード自体を改版した場合にはソースコードの公開が必要
  • -自由に複製して良い
  • -自由に配布して良い
  • -商用利用して良い

ここではコピーレフトという部分をよく理解することが重要です。比較をもう少し噛み砕いて説明しますと、GPLライセンスの場合は「自分で一から作ったアプリケーションのソースコードがあります。このソースコードはGPLライセンスに適用されるソース、ライブラリを使用しています」この場合GPLライセンスが自分で作ったアプリケーションもGPLライセンスに従う必要があります。
LGPLライセンスの場合は「自分で一から作ったアプリケーションのソースコードがあります。このソースコードはGPLライセンスに適用されるソース、ライブラリを使用しています」この場合自分で作ったアプリケーションはLGPLライセンスに従う義務はありません。これがベーシックな考え方です。

このようにGPLライセンスの方が規定としては厳しくなっています。GPLライセンスでの話ですが、よく動的ライブラリでのリンクはGPLライセンスに伝搬されない(=ソースコード公開しなくても良い)との話を見かけますが、これらの見解は限りなくグレーに位置するものです。現在のところ、どれが正しいのかをはっきりと規定できる人間は世界中どこを探しても存在しません。このコラムで述べたこともライセンス条項やWEBなどの意見から筆者が判断したものであり、この内容が完全に正しいかは断言できませんし、責任を負うことはできません。ライセンスに対してどう向かい合うかは、自分もしくは自社のライセンスに対するスタンスを過去の判例からしっかりと定め、製品開発に臨むことが重要です。

開発環境と開発ツールに関して

開発環境はPC上のLinuxシステムに構築することになります。こちらに関してはDebian、Ubuntu、SUSEなどのPC向けLinuxのインストーラーがWEBに公開されていますのでダウンロードすることによって無償で利用できます。PC上のWindows環境を壊したくないという方は、VMware PlayerやVirtual Boxなどといった仮想デスクトップ環境上にLinux環境を構築するのが良いかと思います。クロスコンパイラやリンカなどの開発ツールはデバイスメーカから無償で提供されているものが殆どです。この開発ツール類を開発環境であるPC上のLinuxシステムにインストールすることで、Linuxのクロスコンパイル環境が完成します。

開発環境が完成したら、いよいよLinuxソースコードのコンパイルとなります。せっかくの機会なので簡単に開発手順をご紹介しましょう。
まずは初めにやる事、それは使用するソースコードの選択、つまりコンフィグレーションです。どのCPUアーキテクチャ・ボード用の設定を使用するか、どのデバイスドライバ、ミドルウェアを使用するかなどをソースコードのコンパイルをする前に設定する必要があります。組み込みLinuxにはmenuconfigというすぐれたツールがあります。menuconfigを実行すると、これら設定を画面上で選択することができるのでいちいちMakefileといった設定ファイルを手書きで直さなくても大丈夫です。
このコンフィグレーションを終えると自分で選択したLinux設定になっていますのでコンパイルを実行します。通常、所定のディレクトリでMakeとするだけで膨大なソースコードの深い海の底から設定したソースコードを引っ張り出してきてコンパイルを実行していくのです。

簡単にではありますが開発環境とツール、そして開発手順についてご説明しました。何はともあれ評価用のLinuxボードを購入して、開発環境の構築から組み込みLinuxの動作確認までトライしてみるのが早道だと思います。最近はARMマイコンの搭載した評価ボードも1万円程度で入手できるもの出てきていますし、ARMマイコン搭載のFPGAボードも5万円以下という状況で、安価に開発環境が手に入れられます。マイコンボードさえ購入すればあとはもうやるだけです!この機会に組み込みLinuxにトライしてみましょう!