Archive for 2011/02

Windows Embedded Compact 7 のアプリケーションデバッガ修正

VS 2008 のスマートデバイスプロジェクトで、Windows Embedded Compact 7 (WEC 7) の SDK を使ってアプリケーションを作り、デバッグ実行する際、ステップ実行ができないという問題がありました。その問題(不具合)の修正パッチが、2/11 にリリースされています:
 http://www.microsoft.com/downloads/en/details.aspx?FamilyID=5f4fd3a1-92fa-4ebb-8d65-7777bf7a1808&displaylang=en

僕自身は、普段はアプリケーションのデバッグにもカーネルデバッガを使っているので、VS 2008 のスマートデバイスプロジェクトのお世話になることは、ほとんどありません。しかし、WinCE/WEC のカーネル移植や、デバイスドライバの開発に携わらない人にとっては、スマートデバイスプロジェクトによるアプリケーションの開発が主になると思います。そういった方にとっては、WEC 7 での開発を始めるにあたり、朗報ですね。

Add comment 2011/02/27 koga

レジストリ変更内容の永続化(2/2)

今回は、前回提示したレジストリの設定内容を、レジストリが永続化される仕組みとともに説明します。弊社が提供している WinCE 6.0 の BSP(Lilas-am440-6; Armadillo-440 用の BSP)以外の BSP をお使いの方は、今回の説明を参考にして下さい。

・基本原理
レジストリを永続化する仕組みの基本原理は、次の通りです:

 ブートの初期フェーズにおいて、レジストリが初期化される前に、レジストリのファイル(hive)を配置する永続記憶域用のデバイスドライバとファイルシステムをロードして初期化する。その後、レジストリのファイル(hive)が永続記憶域からロードされて、レジストリの初期化が完了する。

これは、前回示したリファレンスのページにも書かれています:
 http://msdn.microsoft.com/en-us/library/ee490032.aspx (Implementing the Hive-Based Registry)

以下では、この仕組みを、詳しく見ていきます。

・三つのレジストリファイル
WinCE は、レジストリの配置形式として、RAM-Based と Hive-Based の二種類をサポートしています:
 http://msdn.microsoft.com/en-us/library/ee490801.aspx (Registry Types)

前回示した手順では、OS Design で Hive-Based のレジストリを指定しました(カタログ項目の「Hive ベースのレジストリ」を選択)。上のページに書かれているように、WinCE 6.0 では、Hive-Based のレジストリがデフォルトです。上のページの末尾の方にある表で示されていますが、Hive-Based のレジストリでは、レジストリは、次の三つのファイルで構成されます:

 - Boot.hv
  このファイルは、必ず OS イメージの中にのみ配置され、永続記憶域に配置することは、できません。

 - System.hv
 - User.hv
  これら二つのファイルは、Boot.hv 内での設定により、指定した永続記憶域、つまり OS イメージの外に配置できます。

Boot.hv の内容は、ブートの初期フェーズにのみ参照されます。bootable なファイルシステムがマウントされて、そのファイルシステム上に System.hv (および User.hv)が構築された時点で、破棄されます。その際、Boot.hv の内容に変更が加わっていれば、その変更は、System.hv に引き継がれます。Boot.hv は、ブートの初期フェーズにのみ参照されますので、初期フェーズで必要となる内容だけが収録されます。

Boot.hv の内容と、他の二つのファイルの初期状態の内容は、OS イメージのファイルを Platform Builder で開いてみれば分かります。Platform Builder の [ファイル] → [開く] → [ファイル...] メニューでオープンダイアログを開き、OS イメージのファイル(.bin ファイル)を指定してオープンしてみて下さい。OS イメージの内容を示すツリービューが表示されて、次の階層に、レジストリ内容が表示されます:

 <OS イメージのファイル名>(※デフォルトは NK.bin)
  NK
*  ブートレジストリ
*  レジストリ
   (すべてのファイル)

「ブートレジストリ」配下が Boot.hv の内容、そして、「レジストリ」配下が System.hv と User.hv の内容です。注意深くみると、「ブートレジストリ」配下の内容と同じ項目が、「レジストリ」配下にもあることに気づくでしょう。これは、OS イメージがビルドされる際に、Boot.hv の内容が System.hv にマージされることによるものです。つまり、Boot.hv の内容は、System.hv の内容のうち、ブートの初期フェーズにだけ必要なサブセットになっているのです。

前回示したレジストリの設定内容は、先頭行が ‘; HIVE BOOT SECTION’ で、末尾行が ‘; END HIVE BOOT SECTION’ でした。.reg ファイルに、この二つの行で囲った記述があると、囲われた部分の内容は、OS イメージがビルドされる際に、Boot.hv に収録されます(結果として、System.hv にも収録されます)。WinCE は、ブートの初期フェーズにおいて Boot.hv を参照し、bootable なファイルシステムをマウントした後、そのファイルシステム上に System.hv を構築します。この時、ファイルシステム上に System.hv が存在していない場合(または、存在していても、その内容が有効でないと判定された場合)は、OS イメージ中の System.hv を、ファイルシステム上の指定されたディレクトリへコピーします。

デフォルトの設定では、RAMFS (Object Store) が bootable なファイルシステムとしてマウントされます。初期状態の RAMFS には、System.hv と User.hv は存在しませんので、コールドブートのたびに、OS イメージ内のものが RAMFS に展開される、というわけです。これが、前回の冒頭で述べた動作です。

参考:Platform Builder の、OS イメージの内容を閲覧する機能は、リファレンスの次のページで説明されています:
 http://msdn.microsoft.com/en-us/library/ee482393.aspx (Run-Time Image Viewer)

注意:この節の冒頭で、WinCE は RAM-Based と Hive-Based の二種類のレジストリ配置形式をサポートしていると述べました。RAM-Based のレジストリに関するリファレンスを読むと分かりますが、実は、RAM-Based のレジストリも、永続化することが可能です。ただし、そのためには、BSP のカーネル移植レイヤ(OAL)での対応が必要となります:
 http://msdn.microsoft.com/en-us/library/ee489958.aspx (Persisting Data with the RAM-Based Registry)
 http://msdn.microsoft.com/en-us/library/ee490769.aspx (Data Persistence with the RAM-based Registry Using the OAL)
弊社が提供している WinCE 6.0 の BSP (Lilas-am440-6) の無償評価版では、現状、RAM-Based のレジストリの永続化には対応していません。

・Storage Manager と Device Manager の起動タイミング
これまでの説明で、「ブートの初期フェーズ」という表現を使いましたが、より正確には、「ブートの第1フェーズ」です。ブートのフェーズには、0, 1, 2 の三つがあります:
 http://msdn.microsoft.com/en-us/library/ee490010.aspx (Boot Phases)

フェーズ0は、Boot.hv の内容がロードされる前の状態、フェーズ1は、Boot.hv の内容がロードされて、System.hv と User.hv が構築される前の状態です。System.hv と User.hv が構築されて、レジストリの初期化が完了した後、ブートが完了するまでの間がフェーズ2となります。

さて、前回示したレジストリの設定内容では、先頭の ‘Boot Phases’ 行の直後に、以下の行がありました:

[HKEY_LOCAL_MACHINE\init\BootVars]
    "SystemHive"="REG\\system.hv"
    "ProfileDir"="REG"
    "Flags"=dword:3
    "RegistryFlags"=dword:1


この BootVars キーの Flags の値の意味は、前回示したリファレンスのページで説明されています:
 http://msdn.microsoft.com/en-us/library/ee490554.aspx (Hive-based Registry Setup)

Flags の値が3というのは、このページの後半にある表で、ビット 0×00000001 と 0×00000002 を共にセットした状態、つまり、Storage Manager と Device Manager を共に、ブートのフェーズ1で起動するという指定です。

BootVars キーの他のレジストリ値についても、上のページで説明されています。SystemHive は、System.hv のファイルパスであり(※この値で、System.hv 以外の名前に設定することが可能です)、ProfileDir は、User.hv を配置するディレクトリです。
(これを書いている時点では、上のページの ProfileDir の説明は、Systgem.hv の配置先と書かれており、正しくないように思われます。)

RegistryFlags については、上のページでは説明されていませんが、この値を1にすると、RegCloseKey() が呼ばれるたびに、レジストリの更新内容が保存されます:
 http://msdn.microsoft.com/en-us/library/ee489941.aspx (Flush-On-Close Registry Flushing)

もし、パフォーマンスが問題となる場合には、RegistryFlags を1に設定せず(※デフォルトでは0になります)、必要な時点で、アプリケーションから RegFlushKey() を呼ぶようにすればよいでしょう。

・ストレージ用のデバイスドライバ
冒頭の「基本原理」の節で、”ブートの初期フェーズにおいて、レジストリが初期化される前に、レジストリのファイル(hive)を配置する永続記憶域用のデバイスドライバとファイルシステムをロードして初期化する。”と述べました。前回提示したレジストリ設定内容で、これに対応するのが、’[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\SDBusDriver]‘ 以降の部分です。そこでは、以下の設定を行っています:

 - レジストリのファイルを配置する永続記憶域用のデバイスドライバのレジストリ設定を Boot.hv に収録し、かつ、ブートの第1フェーズでロードするよう指定。
 - レジストリのファイルを配置するファイルシステムのレジストリ設定を Boot.hv に収録し、かつ、それを bootable に指定。

レジストリ設定を Boot.hv に収録する指定は、設定内容を ‘; HIVE BOOT SECTION’ と ‘; END HIVE BOOT SECTION’ で囲むことによって達成されます。通常、デバイスドライバのレジストリ設定は、System.hv のみに収録されますが、同じ設定内容を ‘; HIVE BOOT SECTION’ と ‘; END HIVE BOOT SECTION’ で囲って追記することにより、Boot.hv にも収録できます。

永続記憶域用のデバイスドライバを、ブートの第1フェーズでロードするのは、各デバイスドライバに対するレジストリの Flags の値で指定しています。具体的には、次の二つのキーの Flags の値に、dword:1000 を指定しています。

[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\SDBusDriver]
    ...
    "Flags"=dword:1000
    ...
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\ESDHC1_MX25]
    ...
    "Flags"=dword:1000
    ...

これらは、それぞれ WinCE の SD バスドライバと、Armadillo-440 の SD ホストコントローラのドライバに対するキーです。Flags の値の意味は、リファレンスの次のページで説明されています:
 http://msdn.microsoft.com/en-us/library/ee484469.aspx (ActivateDeviceEx)

dword:1000 は、DEVFLAGS_BOOTPHASE_1 であり、そのドライバをブートの第1フェーズでロードするという指定です。デフォルト(DEVFLAGS_BOOTPHASE_1 が指定されていない場合)では、たとえそのレジストリキーが Boot.hv に収録されていても、デバイスドライバは、ブートの第2フェーズ、つまり System.hv の構築が完了した後でロードされます。その逆に、Flags に DEVFLAGS_BOOTPHASE_1 が指定されていても、その設定内容が Boot.hv に収録されていなければ、ブートの第2フェーズでロードされます。

さて、前回示したレジストリ設定内容は、Armadillo-440 に装着した microSD カードを永続記憶域として使う設定でしたが、microSD のメモリカード用のドライバは、SD バスドライバと SD ホストコントローラのドライバに加え、SD メモリカードのドライバがあります。このドライバのキーは、
[HKEY_LOCAL_MACHINE\Drivers\SDCARD\ClientDrivers\Class\SDMemory_Class]
ですが、このキーには、Flags が指定されていません。指定してはいけないのです。SD メモリカードのドライバに対して、”Flags”=dword:1000 を指定すると、指定どおり、ブートの第1フェーズで順にロードされますが、それだとエラーが発生し、microSD のメモリカードを認識できなくなります。SD メモリカードのドライバは、SD カードのクライアントドライバ(クラスドライバ)であり、SD ホストコントローラを通じて microSD のメモリカードが認識された後、SD バスドライバによってロードされます。その際、SD メモリカードのドライバに対して “Flags”=dword:1000 が指定されていると、SD バスドライバがロードする時点で、既に Device Manager によって、SD メモリカードのドライバがロードされてしまっているため、ロードに失敗してしまうのです。バスドライバとクライアントドライバの関係は、他のバス、たとえば USB メモリの場合も、同様です。

Device Manager による、ブートの第1フェーズと第2フェーズでのドライバのロードの詳細に興味のある方は、WinCE のカーネルのソースツリーにある、Device Manager のソースをご覧になってみて下さい。以下が、関連するソースファイルです。

 - <WINCE600_Root>/PRIVATE/WINCEOS/COREOS/DEVICE/DEVCORE/devcore.c
 - <WINCE600_Root>/PRIVATE/WINCEOS/COREOS/DEVICE/DEVCORE/devload.c

devcore.c にある StartDeviceManager() で、ブートの第1フェーズと第2フェーズの各々での、ドライバのロード処理を行っています。devload.c には、第1フェーズでのロードを行う DevloadInit() と、第2フェーズでのロードに使われる InitDevices() の実装があります。また、ActivateDeviceEx() の実体である I_ActivateDeviceEx() も、devload.c で実装されています。

永続記憶域用のデバイスドライバを、ブートの第1フェーズでロードするよう指定する設定についての説明は、以上です。次に、ファイルシステムに対する設定です。ファイルシステムに対する設定は、Storage Manager に対する設定であり、前回示したレジストリ設定内容では、次の二つのキーです。

[HKEY_LOCAL_MACHINE\SYSTEM\StorageManager\Profiles\SDMemory]
    "Folder"="SDMemory"
    "Name"="SD Memory Card"
    "AutoMount"=dword:1
    "DefaultFileSystem"="FATFS"
    "PartitionDriver"="mspart.dll"
[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\SDMemory\FATFS]
    "MountPermanent"=dword:1
    "MountAsBootable"=dword:1

このうち、一番目の SDMemory キーの内容は、もともと System.hv だけに収録される設定になっている内容を、コピーしたものです。Platform Builder で OS イメージのファイルを開き、「レジストリ」の配下からコピーしたいキーのパスを辿り、そのキーを右クリックして、ポップアップメニューの [テキストで表示] を選択すると、テキストエディタ(メモ帳)が開いて、キーの内容が表示されます。その機能を使ってコピーするのが便利でしょう。

二番目の SDMemory\FATFS キーの内容は、ここでは、必要となる追加の設定のみ行っています。これらのキーに対する説明は、リファレンスの次のページをご覧ください:
 http://msdn.microsoft.com/en-us/library/ee490773.aspx (Mount Settings)

MountPermanent は、指定しなくても動作します。これは、マウントする際に、リムーバブルかどうかを指定するフラグ値ですが、レジストリファイルを配置しますので、リムーバブルではないことを示す1を指定しています。MountAsBootable は、bootable であることを示す1を指定しています。MountAsBootable については、次の節で、もう少し詳しく述べます。

・MountAsBootable
このフラグ値は、当該ファイルシステムが bootable かどうかを示す値ですが、レジストリファイルを配置するファイルシステム(今回の設定例では、FATFS)に対して、このフラグ値に1を指定するだけでは、期待通りに動作しません。その理由は、デフォルトでは、bootable と指定されたファイルシステムが他にあり、そちらが先にマウントされるためです。レジストリファイルが配置されるファイルシステムは、bootable と指定されたもののうち、最初にマウントされたものになります。

さて、注意深い方は、ここまでの説明の中で、前回示したレジストリ設定のうち、まだ説明されていない行があることにお気づきだと思います。設定内容のうち、二番目に書かれている次のキーです。

[HKEY_LOCAL_MACHINE\System\StorageManager\AutoLoad\ObjectStore]
    "MountAsBootable"=dword:0


このキーが、レジストリファイルを配置するファイルシステムに対するキーに加えて、追加で必要な設定です。「三つのレジストリファイル」の節の末尾の方で、”デフォルトの設定では、RAMFS (Object Store) が bootable なファイルシステムとしてマウントされます。”と述べました。その設定を無効にするのが、上の ObjectStore キーに対する設定なのです。この設定により、RAMFS (Object Store) が bootable でないファイルシステムとしてマウントされますので、レジストリファイルを配置したいファイルシステム(今回の設定例では、FATFS)が、bootable なファイルシステムとしてマウントされる最初のものとなり、無事に、レジストリファイルの配置先として選択される、というわけです。

前節で述べた、Device Manager によるブートの第1フェーズでのドライバのロード処理の後、第2フェーズへ遷移する前に、bootable なファイルシステムがマウントされて、レジストリの初期化が完了するのを、Event オブジェクトを用いて待ち合わせる仕組みになっています。このため、第1フェーズから第2フェーズへの遷移は、次のようになります:

 0.) Boot.hv での設定により(BootVars キー)、Device Manager と Storage Manager がブートの第1フェーズで(つまり、Boot.hv の内容のロード後に)起動される。

 1.) Device Manager が、ブートの第2フェーズへ遷移する前に、Boot.hv で Flags の値の DEVFLAGS_BOOTPHASE_1 ビットが設定されているドライバをロードする。
  →今回の設定例では、SD バスドライバと SD ホストコントローラが、ロードされる。

 2.) Device Manager は、ブートの第1フェースでのロードを指定されたドライバ群をロードし終えた後、レジストリの初期化が完了するのを待つ。

 3.) SD ホストコントローラが microSD カードを検出し、SD バスドライバへ通知することにより、SD バスドライバが(Boot.hv の設定内容により)SD メモリカードのドライバをロードする。
  (※もし、デフォルト設定のまま、ObjectStore が bootable に指定されていると、microSD カードが検出される前に、RAMFS (Object Store) がマウントされるので、RAMFS 上に System.hv と User.hv が構築されて、以降の動作を待たずに、Device Manager が第2フェーズへ遷移してしまう。)

 4.) SD メモリカードのドライバが、microSD メモリカードのパーティションを検出して、Storage Manager へ通知することにより、microSD メモリカードのファイルシステムがマウントされる。

 5.) Storage Manager が(Boot.hv の設定内容により)microSD カードのファイルシステムを bootable としてマウントし、それがレジストリ機能に通知される結果、microSD カード上に System.hv と Use.hv が構築されて、レジストリの初期化が完了する。

 6.) レジストリの初期化完了が、Event オブジェクトを通じて、(2) で待ち動作を行っている DeviceManager に通知されて、待ち動作が解除される。

 7.) Device Manager は、ブートの第2フェーズへ遷移して、System.hv にレジストリ設定内容が収録されている、残りのデバイスドライバ(※起動時の自動ロードが指定されているもの)をロードする。

bootable なファイルシステムのうち、最初にマウントされたものだけが bootable として記録される様子は、WinCE のカーネルのソースツリーにある、File System Disk Manager (FSDMGR) のソースを見ると分かります。興味のある方は、次のソースをご覧になってみて下さい。
 <WINCE600_Root>/PRIVATE/WINCEOS/COREOS/STORAGE/FSDMGR/mounttable.cpp

mounttable.cpp にある MountTable_t::RegisterVolume() で、MountAsBootable の指定により bootable と設定されたファイルシステムのうち、最初にマウントされたものだけを bootable なボリュームとして記録するようになっています。

・まとめ
以上で、Hive ベースのレジストリを永続化する手順の説明は終わりです。まとめとして、以下に、手順をおさらいしてみます。

 1.) OS Design に、「Hive ベースのレジストリ」を追加する。
   デフォルトでは「Hive ベースのレジストリ」が選択されますが、念のために指定しておくのがよいでしょう。

 2.) <WINCE600_Root>/PLATFORM/AM440/FILES/platform.reg の末尾に、’; HIVE BOOT SECTION’ と ‘; END HIVE BOOT SECTION’ の2行を追加して、追加した2行の間に、以下で述べる内容を挿入する。

 3.) [HKEY_LOCAL_MACHINE\init\BootVars] キーの設定。
   レジストリファイルのパスと、Flags、および、RegistryFlags の設定を追加する。

 4.) [HKEY_LOCAL_MACHINE\System\StorageManager\AutoLoad\ObjectStore] キーの設定。
   RAMFS (Object Store) が bootable としてマウントされないように、MountAsBootable に0を指定する。

 5.) レジストリを配置する永続記憶域のデバイスドライバ(バスドライバとホストコントローラのドライバ、およびクラスドライバ)の設定。
   各々、System.hv に収録されている内容をコピーする。バスドライバとホストコントローラのドライバに対しては、ブートの第1フェーズでロードされるように、Flags の値に 0×1000 (DEVFLAGS_BOOTPHASE_1) を指定する。

 6.) レジストリを配置する永続記憶域のデバイスに対する StorageManager の Profiles 配下のキーを設定する。
   <プロファイル名> キーの内容は、System.hv に収録されている内容をコピーする。<プロファイル名>\<ファイルシステム名> キー(または、<プロファイル名>\<ファイルシステム名>\<パーティション名> キー)に対しては、MountAsBootable を1に設定する(他は省略可能)。

前回の設定例で対象にした、弊社提供の WinCE 6.0 BSP 以外の BSP をお使いの場合や、また、弊社提供の WinCE 6.0 BSP で、microSD カード以外の永続記憶域(USB メモリ)をお使いの場合には、上のまとめを参考にして下さい。永続記憶域のデバイスドライバに対するレジストリキーが分からない場合は、BSP の提供元に問い合わせしてみるのがよいでしょう。

・おまけ
今回の説明で、「ブートの初期フェーズ」という表現を使いましたが、それは主に、ブートのフェーズ1でした。フェーズ0、つまり、Boot.hv がロードされる前の処理、特にカーネル本体の初期化が完了するまでのブートシーケンスについては、全く触れていません。カーネル本体の初期化が完了するまでのシーケンスに興味のある方は、リファレンスの次のページが、取っ掛かりとして参考になるでしょう:
 http://msdn.microsoft.com/en-us/library/ee482950.aspx (Nk.exe Boot Process)

ところで、Windows CE 5.0 までは、WinCE はマイクロカーネル構造を採用しており、マイクロカーネル本体と、Device Manager や Storage Manager は、それぞれ異なるプロセスとして動作する仕組みでした(Device Manager は Device.exe のプロセスに所属、Storage Manager は Filesys.exe のプロセスに所属)。Windows Embedded CE 6.0 において、それらは、カーネルにロードされる DLL となりました(Device Manager は Device.dll に所属、Storage Manager は Filesys.dll に所属)。つまり、純粋なマイクロカーネル構造から、モノリシックカーネルに近い構造に変わったのですが、モジュール分割の構造は、大きくは変わっていません。上のページで説明されているのは、Windows Embedded CE 6.0 のカーネル本体の初期化シーケンスですが、これは、Windows CE 5.0 までのマイクロカーネル本体のブートシーケンスに該当するものとなります。

Windows CE 5.0 と Windows Embedded CE 6.0 の違いは、@IT MONOist の次の記事が参考になるでしょう:
 http://monoist.atmarkit.co.jp/fembedded/winembedded/ce6_01/ce02.html (「Windows CE 6で刷新されたアーキテクチャ」)

1 comment 2011/02/21 koga

レジストリ変更内容の永続化(1/2)

・はじめに
IP アドレスの設定など、各種設定項目は、WinCE の OS イメージを生成する際に、レジストリに格納されます。デフォルトでは、レジストリは OS イメージ内に配置され、起動時に RAMFS (ObjectStore) に展開されます。このため、コントロールパネルで IP アドレスなどの設定を変更しても、その変更内容は、電源を切った時点で失われてしまいます。つまり、コールドブートに対して、レジストリの変更内容は永続的(persistent)ではありません。なお、WinCE の RAMFS (ObjectStore) について興味のある方は、リファレンスページをご覧ください:
 http://msdn.microsoft.com/en-us/library/ee490183.aspx (RAM (Object Store) File System)

さて、レジストリの変更内容を永続的にすることは可能です。レジストリを永続化するには、ハードディスクなどの永続記憶域にファイルとして配置すればよいのです。この手順については、以下のリファレンスページが参考になるでしょう。ただし、以下のページに書かれていることだけでは詳細な手順が分からないため、この後で、具体的な手順を述べます。
 http://msdn.microsoft.com/en-us/library/ee490554.aspx (Hive-based Registry Setup)
 http://msdn.microsoft.com/en-us/library/ee490032.aspx (Implementing the Hive-Based Registry)

・具体的な手順
レジストリを永続化するための手順の例として、弊社が提供している WinCE 6.0 の BSP(Lilas-am440-6; Armadillo-440 用の BSP)の場合の手順を述べます。BSP に固有な点は明記しますので、他の BSP をお使いの場合でも、参考にして頂けるのではないかと思います。以下が、その手順です。ここでは、永続記憶域として、Armadillo-440 に microSD カードを装着して使います。

1.) OS Design に、「Hive ベースのレジストリ」を追加する。
  PlatformBuilder のカタログ項目ビューで、次のカタログ項目を選択して下さい
  
   コア OS
    CEBASE
     ファイルシステムおよびデータストア
      レジストリ記憶域(1つ選択)
*       Hive ベースのレジストリ

2.) <WINCE600_Root>/PLATFORM/AM440/FILES/platform.reg の末尾に、次の行を追加する。
  以下の内容は、最初の二つのレジストリキーが共通な設定で、残りは、BSP に固有な設定です。BSP に固有な設定は、レジストリのファイル(hive)を配置する永続記憶域として何を使うか、および、使用する永続記憶域のデバイスドライバのレジストリ設定によって変わります。

; HIVE BOOT SECTION
[HKEY_LOCAL_MACHINE\init\BootVars]
    "SystemHive"="REG\\system.hv"
    "ProfileDir"="REG"
    "Flags"=dword:3
    "RegistryFlags"=dword:1

[HKEY_LOCAL_MACHINE\System\StorageManager\AutoLoad\ObjectStore]
    "MountAsBootable"=dword:0

[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\SDBusDriver]
    "Dll"="SDBus.dll"
    "Flags"=dword:1000
    "IClass"=multi_sz:"{20FA98A8-B298-4b32-8D72-C716AEE2FA84}=%b","{6F40791D-300E-44E4-BC38-E0E63CA8375C}=%b"
    "Order"=dword:15
    "Prefix"="SDC"
    "RequestListDepth"=dword:30
    "ThreadPriority"=dword:64
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\ESDHC1_MX25]
    "DisableDMA"=dword:0
    "Dll"="esdhc.dll"
    "Flags"=dword:1000
    "Index"=dword:1
    "MaximumClockFrequency"=dword:3197500
    "Order"=dword:21
    "Prefix"="SHC"
[HKEY_LOCAL_MACHINE\Drivers\SDCARD\ClientDrivers\Class\SDMemory_Class]
    "BlockTransferSize"=dword:40
    "Dll"="SDMemory.dll"
    "IClass"=multi_sz:"{A4E7EDDA-E575-4252-9D6B-4195D48BB865}","{8DD679CE-8AB4-43c8-A14A-EA4963FAA715}"
    "Prefix"="DSK"
    "Profile"="SDMemory"

[HKEY_LOCAL_MACHINE\SYSTEM\StorageManager\Profiles\SDMemory]
    "Folder"="SDMemory"
    "Name"="SD Memory Card"
    "AutoMount"=dword:1
    "DefaultFileSystem"="FATFS"
    "PartitionDriver"="mspart.dll"
[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\SDMemory\FATFS]
    "MountPermanent"=dword:1
    "MountAsBootable"=dword:1
; END HIVE BOOT SECTION

3.) OS イメージを作りなおす。
  OS Design のソリューションを、再ビルドして下さい。

以上で、レジストリを永続化した OS イメージが出来上がります。実際に動かしてみて、コントロールパネルで IP アドレスの設定を変更してみて下さい。変更した後、電源を入れ直してコールドブートしても、設定内容が失われず、永続化されているはずです。

上で示した、platform.reg で設定する内容については、次回、レジストリが永続化される仕組みとともに説明します。

Add comment 2011/02/15 koga


Categories

Links

Posts by Authors

Recent Posts

Calendar

2011年2月
« 9月   8月 »
 12345
6789101112
13141516171819
20212223242526
2728  

Posts by Month

Posts by Category

Meta