Yocto Projectではじめる 組み込みLinux開発入門
最近はハードウェアの性能が上がり,以前よりも組 み込みシステムが多様化/複雑化してきました.その ため全ての機能を自前で実装することはもはや現実的 ではなく,オペレーティング・システム(OS)を搭載 することが当たり前になってきました.その中でも PCやサーバで使われるLinuxを組み込み用途で使う ケースをよく見かけます(図1).


Linuxを使えばさまざまな機能が最初から使えて,自前で実装する手間が省ける
組み込みソフトウェアの開発を行うときに使われるプラットフォームの選択肢には,おおまかに次のようなものが挙げられます.
・OSレス
・RTOS
・組み込みLinux
実際には,もっと多様多種な選択肢があると思いますが,ここでは筆者が思う代表的なものを列挙しました.
OSを使わずに機器を制御するプログラムを開発するケースです.MCU(マイクロコントローラ・ユニット)と比較的小さなメモリ,ストレージで動作する組み込み機器で採用されることが多いと思います.
基本的にはマルチタスクが不要で,リソースがごく 限られた環境でソフトウェアを開発することになります.マルチタスクが必要であれば,自分でスケジューリングやリソース管理を実装することもできますが, 全てを自前で実装する必要があるので,OSを使う場合に比べてハードルが高くなります.
OSとしてRTOS(Real Time Operating System)を 使うケースです.
MCUと比較的小さなメモリ,ストレージで動作する組み込み機器で採用されることが多いですが,メモリやストレージが潤沢な環境でも採用されることがあります.
RTOSは基本的にマルチタスクの機能を提供するためのタスク・スケジューリングやリソース管理の機能を提供します.RTOSと言っても,タスク・スケジューリングやリソース管理について最低限のAPIを用意しただけの簡素なものから,NuttXのように高機能シェルを持っていてPOSIX互換のソフトウェアが比較的容易に移植できるようなリッチなものまで,さまざまなものがあります.実際に開発で使っている人の間でも,それぞれ想像するものが異なるでしょう.
組み込み機器向けにカスタマイズされたLinuxを使うケースです.
主に,MPU(マイクロプロセッサ・ユニット)を搭載したSoCと,組み込み機器としては潤沢なメモリ,ストレージが使える環境で採用されます.本配信で紹介するのも,この組み込みLinuxです.
組み込み用途でLinuxを使うメリットとしては,次のようなものが挙げられます.
・高機能なカーネル
・情報入手の容易さ
・豊富なデバイス・ドライバ
・OSS(Open Source Software)資源の活用
組み込みシステムとしてLinuxを使う場合は,ターゲットとなるハードウェアに向けてLinuxをビルドする必要があり,そのためには何らかのビルド・システムを使う必要があります.ビルド・システムは幾つかありますが,その中でもよく目にするものとして Yocto Projectが挙げられます.
実際にシングル・ボード・コンピュータのメーカが,Yocto Projectを使ってBSP(Board Support Package)を提供しています.組み込みLinuxを扱うシステム・ インテグレータやソフトウェア関連の企業でもよく使われているようです.
PC向けに作成されたLinuxと組み込みLinuxは何 が違うのでしょうか.主に次の違いがあります.
・CPUアーキテクチャ
・メモリやストレージなどの制限
PC向けのCPUはほとんどの場合,インテルx86系アーキテクチャで動作しますが,組み込み向けではArm,MIPS,RISC-Vなどさまざまなアーキテクチャで動作させることが想定されます.最近では,IoT(Internet of Things)の普及に伴い,x86アーキテクチャで動作する組み込みボードも登場しています.
メモリやストレージに関しては,PCと比較して容量が小さいので,PC向けLinuxのように実際は使わないかもしれない汎用アプリケーションまで全てインストールすると容量が足りなくなってしまいます.そのため,組み込み向けLinuxではボードが持つメモリ やストレージの容量に応じて,必要な機能を選択してOSを構成する必要があります(図2).


組み込み Linuxを採用するシステムのハードウェアは,メモリやストレージの容量が小さいので必要な機能に絞ってOSを構成する必要がある
組み込みLinuxを作成するためには,次のようなものが必要です.
・ツールチェーン(クロス・コンパイラ)
・ブートローダ
・Linuxカーネル
・ルート・ファイル・システム
通常,プログラムは,ソースコードをコンパイルし,CPUが理解できるコードに変換します.
PC上でPC向けのプログラムをコンパイルする場合は問題なく動作するプログラムが生成されます.組み込みボード上で,そのボード向けのプログラムをコンパイルする場合も問題なく動作するプログラムが生成されます.しかし,コンパイルはCPUやメモリなど のリソースをたくさん使うので,組み込みボード上で直接コンパイルすると時間がかかります.小さいアプリケーションなどであればそこまで時間はかかりませんが,組み込みLinuxをまるごと作成しようとすると,非常に長い時間がかかります.
このような場合,コンパイル時間の短縮を図るために,PC上で組み込みボード向けのプログラムをコンパイルします.これをクロス・コンパイルと呼びます.コンパイルには,異なるアーキテクチャのコードを変換できるクロス・コンパイラを使います(図3).クロス・コンパイラをインストールする方法は,次に示すように幾つかあります.
・Ubuntuなどディストリビューションで提供されるパッケージをインストールする
・ソースコードから自前でコンパイルする
・crosstool-ng(2) などのツールチェーン・ジェネレータを使ってコンパイルする
・linaro(3) やCode Sourcery(4) などサードパーティが提供するツールチェーンをインストールする
実際にソースコードからCPUが理解できるコード を生成するには,コンパイル,リンクなど複数の手順 が必要です.この複数の手順をまとめてビルドと呼び ます.ビルド時に使われるコンパイラ,リンカ,アセンブラなどの複数ツールをまとめてツールチェーンと呼びます.

ブートローダは,カーネルを起動するためのプログラムです.OS起動時に,一番最初に動作するプログラムになります.カーネルを起動するために使う最小限のハードウェアを初期化し,カーネルをメモリに読み込んで実行します.
PC向けのLinuxでは,GRUB(GRand Unified Bootloader)が広く使われていますが,組み込み向けのLinuxではCPUやメモリ,ストレージなどのハードウェア構成がボードごとに異なる場合が多いので, そのままGRUBを使えません.組み込みボードの場合,CPU1つとってもアーキテクチャやSoCごとに初期化が必要な機能や手順に差がでてきます.そのため,それぞれのボード向けにブートローダを用意する必要があります.
Linuxカーネルは,Linux OSの本体となるプログラムで,タスクのスケジューリングやメモリの管理,デバイスの制御などを行います.これらの処理には割り込み処理も含まれます.Linuxカーネルとしての基本的なロジックは同じように動作するように設計されていますが,アーキテクチャやハードウェアに依存する部分はそれぞれに適合するように移植する必要があります.デバイス・ドライバの移植などもこの部分で行われます.
ルート・ファイル・システムは,ユーザランドと呼ばれる,ユーザから見えるところにあるファイルの集合です.サービスやアプリケーション,設定ファイル,RPMやaptなどのパッケージ管理システムもこの部分に含まれます.
さまざまなLinuxディストリビューションの違いは,この部分の構成の違いがほとんどだと思ってよいでしょう.
*
組み込みシステムでは,ユーザがデバイスを操作するとき,Linuxとして意識することはありません.しかし,それぞれのデバイスの機能を実現するために必要な構成にする必要があります.ユーザランドのアプリケーションのソースコードは,基本的にどのアーキテクチャでも共通ですが,それぞれのCPUで解釈できるコード形式が異なります.そのため,ターゲットとなるCPUに合うツールチェーンでビルドする必要があります.
Yocto Projectは,さまざまなハードウェアに組み込みLinuxを構築するときに必要なビルド・システム を提供するプロジェクトです.提供しているものは, 大まかに分類すると次の3つです.
・メタデータ
リファレンスとなるディストリビューションであるPokyをビルドするために必要な情報を記載
・ビルド・システムと各種ツール
メタデータを処理してLinuxイメージを構築する
・ドキュメント
ビルド・システムの核となるBitBakeは,もともと OpenEmbeddedプロジェクトが開発していたビルド 用のツールで,現在ではYocto Projectと共同で開発 やメンテナンスを行っています.また,コアのメタ データとなるOpenEmbedded-Core(OE-Core)も同様 に共同でメンテナンスしています.
Yocto Projectは,レイヤ・モデルを採用しているという特徴があります.ビルドに必要な情報を含むメタデータをグループ化しておいて,層(レイヤ)を積むように組み合わせて,さまざまなハードウェアに向けたソフトウェアを提供できるようにしています. (図4)にPokyの全体構成を示します.Yocto Projectを使う上でよく目にする用語を(表1)に示します.



(1)GETTING STARTED:THE YOCTO PROJECT OVERVIEW,Software-Yocto Project,Yocto Project.
https://www.yoctoproject.org/softwareoverview/
(2)crosstool-NG,crosstool-NG community.
https://crosstool-ng.github.io/
(3)Accelerating deployment of Arm-based solutions,Linaro.
https://www.linaro.org/
(4)Sourcery CodeBench Lite Downloads | Siemens Software,Siemens.
https://www.plm.automation.siemens.com/global/en/products/embedded-software/sourcery-codebench-lite-downloads.html
・組み込みマイコン入門講座
-- https://interface.cqpub.co.jp/mcu-hands-on/
・登録内容の変更,メール・マガジン配信中止はこちらからお願いします.
-- https://cc.cqpub.co.jp/system/auth/
Yocto Project入門&ハードウェア拡張
・開催日 :2025年11月12日 10:00-17:00
・受講料 :10,000円(ボード付き,税込み)
・使用ボード:MaaXBoard 8ULP(アヴネット)
・講師 :三ツ木 祐介氏(Interface誌連載「YoctoProjectではじめる組み込みLinux開発入門」を執筆中)
※セミナ受講時に使用したMaaXBoard 8ULPはそのままお持ち帰り頂けます.
申し込みページはこちら








