「同じLinuxだから動いて当たり前と思っていても,意外に動かないものが多い」。9月7日に開催されたソフト開発者向けのイベント「X-over Development Conference 2007」で,アックスの竹岡尚三氏(写真)はこう語った。
アックスは,携帯電話やデジタルカメラなどに搭載されるOSや,組み込みLinux向けソフトウエアを開発/提供するソフトハウス。その代表取締役を務める竹岡氏は,組み込み開発の経験,実績が豊富だ。講演では,Linuxの技術者が組み込みLinuxに取り組むときに注意すべき点,間違いやすい点についてわかりやすく説明した。
まず,通常のLinuxと組み込みLinuxのソフトウエアの互換性に関して,いくつか誤解があると言う。例えば,デバイスドライバはハードウエアに依存するところが多いので,そのままでは動かないという認識は正しい。しかし,「ハードに関係しないアプリケーションは,そのまま動くと思っている人が多いが,それは誤解だ」(竹岡氏)。
なぜ動かないのか。同じLinuxでも,プラットフォームに大きな相違点があるからだ。簡単に言えば,採用するCPUによって,細かなアーキテクチャの違いがあり,それがソフトウエアの動作に影響を与えている。例えば,2バイトのデータをメモリーに格納するとき,上位バイトと下位バイトの実際の格納位置はCPUによって異なる。開発者は,このバイト・オーダの違いを知っておく必要がある。「バイト単位で置いたデータを,ワード(32ビット)命令でアクセスするようなトリッキーなプログラムは移植性が低い」(竹岡氏)というわけだ。
また,データ・アライメントの違いも大きい。x86系CPUでは,32ビットのデータがどのようにメモリー上に並んでいても,ワード命令でアクセスできる。しかし,RISC系CPUでは,きりのいいメモリー番地からしかワード・アクセスできない。したがって,アライメントに依存しているプログラムは問題が発生する。
竹岡氏によると,浮動小数点をメモリーにストアするといったケースで,バイト・オーダーやアライメントの問題が起きやすいと言う。組み込み開発で,浮動小数点を使う用途はなさそうに思えるが,ソフトウエア音源など,用途によっては浮動小数点を使用する場合があるそうだ。
そのほか,MIPS系CPUには,加算の桁上がり情報を保持するキャリー・フラグがないといった違いがある。多倍長演算を行うアセンブラ・ルーチンは,通常キャリー・フラグを参照する。このルーチンをどう書き直すかといったテクニックも披露した。
最後に竹岡氏は,ハードウエアなどの情報の不足を補う方法として,Linuxのソースコードをよく見ようとアドバイスした。Linuxは,米国製のチップやカードをサポートしている。そのソースコードはフリーで公開されていることがあるので,それをよく見ることがためになると結んだ。