Windows CE (.NET) とか IoTとか

組込みWindows と IoTの話を扱います

Windows CE 6 Beta (その1)

さて、Windows CE 6 "Yamazaki" Betaです。

Windows CE 6はWindows CE 5.0以前と比べて以下の2点で大きく変わりました。

- メモリレイアウトの変更

プロセス空間が プロセスあたり2GBに、プロセス数が最大32767までに拡張。

- ツールの変更

Platform Builder 6 が Visual Studio 2005のプラグインに。

メモリレイアウトの変更はこれまでにない大幅なCEサブシステム(カーネルファイルシステム、GWES、デバイスマネージャ、ネットワーク)の変更につながります。CE6ではこれらのサブシステムがすべて2GB以上のカーネル空間に置かれます。一方、通常のユーザープロセスは0 - 2GBの空間に置かれ、プロセスごとにスイッチされることになります。デバイスドライバカーネル空間で動作するものとユーザー空間で動作するものの2種類サポートされます。ユーザー空間ではユーザーモードデバイスドライバをサポートするUDevice.exeとサービスをサポートする Service.exeがユーザーモードのシステムモジュールとして残されました。

=================================================

CE 6ではカーネルの自体の構成も

- カーネルプロセスがnk.exeの単一カーネルから、OAL.exe、kernel.dll、kitl.dll、kcoredll.dll、device.dllなどのMultiple DLL モデルへ

と変更されます。

カーネルは実際にはカーネル内で最初に実行されるコード - OAL - のプロセスとして動作し、MS提供のカーネルファンクションはKernel.dllという単一のDLLにまとめられます。OAL から Kernel.DLLへの呼び出しはNKGLOBALテーブル(nkstub.lib)を経由して行われ、逆にkernel.DLL、Kitl.DLLからのOAL呼び出しはOEMGLOBALテーブル(oemstub.lib)経由の呼び出しとなります。(カーネル空間で動作するカーネルDLLは通常のDLL Import/Exportを使用することができません)

このようにカーネルを構成するモジュールが分離されたことにより、カーネル本体、OAL、KITLを、カーネルモジュールを再リンクすること無しにそれぞれ単独にアップデートすることができるようになります。その代わり、これまでOAL内から自由に呼び出すことのできたカーネル内ファンクションが、NKGLOBALテーブル経由でしか呼び出せなくなります。これはMSの外で開発されたOALにおいては呼び出すエントリがテーブル(nkstub.lib)に用意されていないという問題になる可能性があります。もしこのような事態に遭遇したら、すぐにレポートをMicrosoftに送ることが推奨されています。

Kernel本体、OAL、Kitlが分離された結果、これまでkern.exe、kernkitl.exe、kernkitlprof.exeと、用途に応じて3種類ビルドする必要のあったカーネルモジュールが、OAL,exe、Kitl.dllをそれぞれ独立してビルドするだけでよいことになります。Profilingについては、(Profile用の別Kernel.DLLに入れ替えるだけでよいため?)OALが単に2つのProfiler関数を実装すすればよい、とされています。

参考:MEDC2006参加者へ

EMB210 - Windows CE 6 Overview

EMB321 - Porting a Windows CE 5.0 BSP to the Next Release of Windows CE

================================================

デバイスドライバについては...

デバイスドライバカーネルモードで動作するカーネルモードドライバとユーザーモード(Udevice.exeプロセス内)で動作するユーザーモードドライバに分かれます。カーネルモードドライバはメモリマップされたハードウエアレジスタに煩雑にアクセスするようなものが想定されます。これに対してユーザーモードドライバは(直接レジスタにはアクセスせず)バスドライバにさえアクセスすればよいPCMCIA、USB、SDIOなどが想定されます。ユーザーモードドライバではこれまでどおりユーザーメモリ空間にハードウエアレジスタをVirtualAllocしてアクセスする方法ももちろんサポートされます。

ちなみにNativeドライバ、Streamドライバのドライバエントリ構造はカーネルモードドライバ、ユーザーモードドライバともにこれまでと同一です。

ただし、以下の相違点があります。

- ドライバ内でSetKModeを使用することができない

- カーネルモードドライバはMapCallerPtrやSetProcPermissionsを使う代わりにCeOpenCallerBuffer/CeCloseCallerBufferを使う必要がある

- カーネルモードドライバで非同期バッファを使用するとき(例: IST)、CeAllocAsynchronousBufferでバッファをカーネル空間内にマップして使用する

また、CE 5 以前のドライバではドライバ内に直接UIコード(MessageBoxや設定画面等)を記述することが可能でしたが、これはユーザーモードドライバのみサポートされます。カーネルモードドライバはCeCallUserProcを使用してユーザーモードDLLを呼び出すことができます。

CE 5 以前には、ユーザープログラムからのカーネル呼び出し、デバイスドライバ呼び出しは、ともにPSL(Protected Server Library)を経由して必ずプロセススイッチを伴うオペレーションでした。それがCE6ではユーザープロセスが現在のプロセスとして居座ったままカーネルサービスを呼び出せるようになり、これらの場面でプロセススイッチが不要になります。その代わり、プログラムサイズ、メモリフットプリントの増大となる可能性もありますが、開発チームはCE 5の5%増し以内に抑えることを目標にしているそうです。

参考:MEDC2006参加者へ

EMB405 - Porting Drivers to the Next Version of Windows CE