杉本 拓也 松井 俊訓 杉本 拓也(すぎもと たくや/左)
松井 俊訓(まつい としのり/右)
株式会社富士通ソフトウェアテクノロジーズ


 組み込み開発が情報システム開発と大きく違う点の1つは、OSの構築作業です。情報システム開発は既に完成品として提供されたOSを使用しますが、組み込み開発では、機器に合わせて開発者がOSを構築しなければなりません。

 そのため、組み込み開発者にはOSの機能や構成に関する詳細な知識が不可欠です。今回は、組み込みOS「Windows Embedded CE 6.0」の中がどのような構成になっているかを説明します。

コンポーネント形式のOSアーキテクチャ

 Windows Embedded CE 6.0 の大きな特徴は、コンポーネント形式のアーキテクチャで設計されていることです。図1は、Windows Embedded CE 6.0 を構成するコンポーネントの全体像です。

図1●Windows Embedded CE 6.0 を構成するコンポーネント
図1●Windows Embedded CE 6.0 を構成するコンポーネント
[画像のクリックで拡大表示]

 各コンポーネントは、図の上部の「ユーザースペース」と下部の「カーネルスペース」の2つに大きく分けて配置されます。ユーザースペースにはアプリケーション、シェル、サービス、ユーザーモードドライバなどが配置され、カーネルスペースには、OAL(OEM Adaptation Layer:OEMアダプテーション層)、カーネル、デバイスマネージャ、カーネルモードドライバ、GWES(Graphics,Windowing,and Event Subsystem:グラフィックス、ウィンドウ、イベントサブシステム)など、OSの中核をなす機能が配置されます。

 Windows Embedded CE 6.0 のOS構築作業では、これから開発しようとする組み込み機器(ターゲットデバイス)に合わせてこれらのコンポーネントを実装し、その機器に合ったOSイメージを作成します。では、これらの各コンポーネントの機能について順番に解説しましょう。

ブートローダ

 多くの組み込み機器では、起動時にまずOSがそのデバイスにロードされ、それからOSが起動されます。ブートローダとは、OSを起動するときに、まずOSイメージをターゲットデバイスのRAM上にロードする役割を持つモジュールです。図1に示すように、ブートローダはOSとは別のモジュールとして存在します。通常の組み込み機器では、ブートローダがRAM上にOSイメージをロードしますが、OSイメージが格納されているROM領域自体をブートアップできるハードウェアの場合には、必ずしもブートローダを必要としません。

 ブートローダがOSイメージをロードする方法には、大きく分けて次の2通りあります。

  • フラッシュメモリなどのROM領域に格納されているOSイメージをロードする方法
  • イーサネット、USB、シリアルなどを介してターゲットデバイスと接続した開発用パソコンOSイメージをロードする方法

 このうち、後者の(開発用パソコンからOSイメージをロードする)方法は、主に開発時に利用されます。開発中は頻繁にOSイメージを変更するので、前者の方法ではROMを毎回更新しなければならず、効率が悪いためです。

 開発用パソコンからOSイメージをロードする場合は、ターゲットデバイスからブロードキャストされるBOOTMEと呼ばれるパケットを利用します。このBOOTMEパケットが開発PC上の開発環境Visual Studio によって認識され、ターゲットデバイスと紐付けされます。そして、TFTP(Trivial FTP)というプロトコルによってOS イメージが転送され、ターゲットデバイスにロードされます

OAL(OEM Adaptation Layer)

 OALとは、図1に示すようにハードウェアとカーネルの中間に位置し、カーネルに対してハードウェアの違いを抽象化する働きを持つレイヤです。パソコンのアーキテクチャでいうとBIOSの働きをする部分に相当します。Windows Embedded CE 6.0 のOS構築では、このOALの開発が最初の作業となります。

 OALは、OSの起動時にターゲットとなるハードウェアに対して、OSの基本的な機能であるCPU、メモリ、割り込み、タイマなどに関係する処理を行います。このときに、MMU(Memory Management Unit :メモリ管理ユニット)の有効化と、システムの仮想メモリへの切り替えが行われ、これによってWindows Embedded CE 6.0 のカーネルが仮想メモリ空間で動作できるようになります。

 OALには多くの実装が必要です。OALを開発する場合は、OALの「共通ライブラリ」と呼ばれるソースコードがPlatform Builderに用意されているので、この共通ライブラリを上手に利用してOALの開発工数の軽減を図ります。

KITL(Kernel Independent Transport Layer)

 KITLは、カーネルデバッガ、リモートツール、デバッグメッセージ、デバッグシェル(ターゲットコントロール)といったWindows Embedded CE 6.0 のリモートサービスによって利用される通信レイヤです。ターゲットデバイスによっては不要ですが、OSの開発時に開発用パソコンからリモート制御を利用するときは必要です。KITLはKITL.DLL として実装され、次のインターフェイスが利用できます。

  • イーサネット
  • USB(リモートNDIS:Network Driver Interface Specification)
  • シリアル通信

カーネル

 カーネルは、Windows Embedded CE 6.0の中核をなすコアモジュールです。OSの基本機能であるメモリ管理やタスク管理は、このカーネルで行われます。カーネルはKERNEL.DLLというDLLとしてOSイメージに含まれ、NK.EXE(OAL.EXE)(※)にロードされます。

 カーネルのコードは、そのほとんどがC言語で実装されており、OSがサポートするARM、MIPS、SH、x86 の各プラットフォームに対してクロスコンパイルできます。そのため、異なるプラットフォームにもスムーズに移行できます。

(※)NK.EXEとは、カーネルプロセスの実行ファイルのこと。OSイメージには必ずこの実行ファイルが必要となる。NK.EXEプロセス内でカーネルやカーネルモードドライバ等が動作する。