II-27-9. OSと応用ソフトウェアの組み合わせ方

組み込みシステムを最適化する際に、要求される機能を満たし、拡張性や信頼性を確保し、開発コストを削減するために、OSと応用ソフトウェアをどのように組み合わせればよいかについて説明する。技術的な観点からの説明に加え、いずれかもしくは両者にOSSを利用する際の留意点も示す。

【学習の要点】

* 組み込みシステムの制限を満たしつつ様々な要求を実現するためには、OSの機能を利用するか、自前で実装するかといった検討も必要となる。

* アプリケーションとして処理を実装するか、デバイスドライバとして処理を実装するかといった観点でも異なる。

* OSSとして提供されるソフトウェアを部分的に利用して実現する際には、ライセンスにも配慮する必要がある。

図II-27-9. 実装方法の違いによるトレードオフ

【解説】

1) OSが提供するサービスの利用と自分で実装するケースの使い分け

組み込みシステムにおいて必要な処理を行う際に、OSが提供するサービスを利用できる場合とそうでない場合がある。OSが提供するサービスを利用できる場合でも、自前で実装したほうがよい場合もある。

* メモリ確保の例

通常、C言語で動的にメモリを確保する方法はmalloc() 関数の利用が一般的である。しかしこの場合、malloc() の内部動作はブラックボックス化[1]されており、確実な最適化を行うことは難しい。メモリの利用方法が限定的であれば、sbrk() やmmap() 等のシステムコールを利用して一定のメモリ領域を確保しておき、その中でアプリケーションがメモリブロックの管理を行うことで、より最適なメモリ確保を実現することが可能である。

2) 実装方法の違いによるメリット・デメリット

また入出力や機器制御に近いところの処理においては、アプリケーションとして処理を実装するか、あるいはデバイスドライバとして実装するかといった、実装方法の違いによる得失も十分に検討する価値がある。

* アプリケーションとして実装する場合のメリット・デメリット

アプリケーションとして実装した処理は、ユーザプロセスとして動作する。そのためプログラムに不具合が存在したとしても、アプリケーションが強制終了するだけに留まりシステム全体の動作は保護される。またアプリケーションレベルの開発は比較的容易である。

* デバイスドライバとして実装する場合のメリット・デメリット

デバイスドライバとして処理を実装した場合、その部分はカーネルモードで動作するため速度的に有利な場合がある。パケットフィルタリングなど低レベル処理を実装しやすいという利点もある。また割り込みを優先させるモードもあり、準リアルタイム性を確保しやすいという利点もある。ただしその開発はアプリケーション開発と比較すると難しく、また実装に不具合があった場合にはシステム全体を暴走させる危険がある。

3) ライセンスの配慮

OSSとして提供されているオペレーティングシステムに、デバイスドライバとして実装した自前のソフトウェアを組み込む場合は、ライセンスの取り扱いに注意しなければならない場合があることに気をつける。

* Linuxへ組み込む場合

LinuxカーネルはGPLでライセンスされている。FSFの見解によれば、カーネルと一体となり動作するカーネルモジュールやデバイスドライバはGPLでなければならない。現状では、デバイスの情報を秘匿したいベンダがソースコードを公開せずにバイナリ配布しているデバイスドライバも流通している。このようなデバイスドライバをLinuxへ組み込むことについては議論があり、十分に留意する必要がある。

OSS Course Naviのコンテンツは IPA OSS モデルカリキュラムを基としています。