次の方法で共有


Microsoft Windows CEのメモリ使用

John Murray著
1997年9月

はじめに

Microsoft(r) Windows(r) CEは、様々なターゲット デバイス、すなわち「プラットフォーム」向けにカスタマイズできるコンポーネント化されたオペレーティング システムです。相手先商標製品製造(OEM)業者、または組み込みシステム デベロッパーは、ターゲット プラットフォームのオペレーティング システムに提供するシステム モジュールとコンポーネントを選択できます。メモリの要件は、選択したモジュールとコンポーネントによって決まります。

「モジュール」は、機能を完全に果たす完結した領域であり、システム ソフトウェアに組み込まれているかいないかのどちらかです。その機能が必要でない場合は、モジュール全体が除外されます。たとえば、すべてのシリアル ポート機能が「serial」という名前の単一のモジュールとして提供され、組み込まれているかいないかのどちらかです。

いくつかの大きいモジュールは、さらに「コンポーネント」に分割されます。これにより、OEMはOEMデバイスで必要なコンポーネントだけを含めることによって、これらのモジュールの小さいバージョンをカスタム構築できます。たとえば、ファイル システム モジュールには、RAMファイル システム、ROMファイル システム、レジストリ、データベース用のコンポーネントが含まれています。OEMは、(いくつかの制限はありますが)これらのファイル システム コンポーネントを組み合わせて、ターゲット プラットフォームのニーズを満たすことができます。

OEMや組み込みシステム デベロッパーが設計を決めるに当たって、それぞれのモジュールやコンポーネントのメモリ消費量が分かっていると便利です。この記事では、Windows CE 2.0オペレーティング システムがメモリをどのように使用し、いくつかのWindows CEシステム構成における主要なシステム モジュールとコンポーネントのメモリ要件を示します。また、Windows CE用のツールを使って、ほかの構成の場合のメモリ要件を探る方法も説明もします。

Microsoftは、Windows CE version 2.0用に、これらのモジュールとコンポーネントについて基本的な構成を作成し、テストしました。構成としては、ユーザー入力装置が最小限で、表示機能のない基本システムから、Handhelp PC(H/PC)のようにMicrosoft Windowsの完全な外観と操作性を提供するものまで用意しました。

それぞれの構成は、その下位の構成の上に構築されます。次の表は、本稿で取り上げる、テストされた構成です。

構成 説明
最小限の入力システム(MinInput) カーネル、基本ファイル システム、レジストリ、基本ユーザー入力サポート機能。基本ユーザー入力サポート機能には次のものが含まれます。メッセージ キュー、タッチ パッド、キーボード入力装置、オーディオ、パワー、発光ダイオード通知(LED)、アイドル
最小限のグラフィックス表示インターフェイス (MinGDI) MinInputと最小限のGDI(基本描画プリミティブ、デバイス コンテキスト)
最小限の通信(MinComm) MinInputと通信スタック (Transfer Control Protocol/Internet Protocol[TCP/IP]、Point-to-Point Protocol[PPP]、telephony application programming interface[TAPI]、Serial, Network Device/Driver Interface Specification [NDIS]、Infrared Data Association[IRDA])
Windowsユーザー インターフェイス(UI)構成 (HPC2Apps) MinCommとすべてのウィンドウ関連API関数(CreateWindowなど)。これは、H/PC上で使用されているバージョン

システムのメモリ使用

一般的なWindows CEデバイスには、ROMとRAMメモリがあります。デバイスは、バックアップ バッテリーを使用したリフレッシュによって電源が落とされたときでも、RAMの内容を保持します。

システム メモリは、次の表のように分類できます。

メモリ 説明
ROM Windows CEの実行形式と他のシステム ファイルが含まれています。これらのファイルの.text(コード)と読み出し専用データ セクションは、その場実行(XIP)のために解凍処理されます。
RAM-記憶メモリ ファイル システム(レジストリとWindows CE データベースを含む)が含まれています。読み出し/書き込みデータ セクションが含まれます。
RAM-プログラム メモリ 作業用RAM

ROMには、システムの実行形式、ダイナミック リンク ライブラリ(DLL)とMicrosoft Pocket Wordなどのバンドル アプリケーションを含む、その場実行(XIP)される解凍処理されたファイルが含まれています。これらのファイルは、ページ境界の先頭から始まります。またROMには、フォント、オーディオとビットマップなど、これらのアプリケーションによって使用される各種付属ファイルも含まれています。付属ファイルのほとんどは、(いくつかのフォントを除いて)圧縮されています。実行形式とDLLのコードと読み取り専用セクションは、その場実行できるように解凍処理されています。読み出し/書き込みセクションが圧縮されているのは、それらが解凍されてRAMに置かれるからです。

容量を節約するために、これら小さい付属ファイルと圧縮された読み出し/書き込みセクションの多くは、メモリの「穴」に配置されます。「穴」とは、コードまたは読み出し専用メモリ セクションがROMに置かれた後、最後のページに残った空き領域のことです。

また、ROMで実行形式とDLLを圧縮することもできます。そのような実行形式が実行されていると、オンデマンド ページング機能が、必要なページを解凍処理し、RAMにロードします。

RAMは、記憶メモリとプログラム メモリという2つの部分に分けられています。記憶メモリには、レジストリ、ファイル システム、データベースが含まれます。ファイル システムには、ユーザーがインストールまたは作成したアプリケーションとデータ ファイルがあります。ファイル システムのファイルはすべて必ず圧縮されます。プログラム メモリは、システムと、実行中のアプリケーションによって使用されます。ユーザーは、再起動せずに、いつでも記憶メモリとプログラム メモリのRAMの分割を調節できます。

ユーザーがインストールしたアプリケーションは、ファイルシステムに圧縮された状態で常駐します。コードとデータは、実行するためにプログラム メモリに解凍処理される必要があります。オンデマンド ページング処理がサポートされています。ユーザーによってインストールされたアプリケーションが起動するときに、プログラム メモリに解凍してロードしなければならないのは、アプリケーションのごく一部だけです。

通常、実行形式は.dataセクションのほかに、ヒープ データとスタック データ用にプログラム メモリの一部を消費します。ヒープ データとスタック データは、通常動的に拡大縮小します。

Windows CE version 2.0のメモリ使用

次の表は、SH3マイクロプロセッサ搭載のHitachi D9000 Development Platform上でのメモリ使用を示しています。RAMとスタック値は、起動後、Memtoolユーティリティがシステム ステータスを調べた時点で得られたものです。これらの数字は、次のように計算されます。

  • ROM(コードと読み出し専用データ):
  • RAM:
  • スタック:

MemtoolとPpshユーティリティは、各プロセスのRAMの読み出し専用データを表示しますが、このメモリは、しばしばカーネルによって割り当てられる共有メモリを示します。

この共有メモリは、物理的にはカーネルによって使用される1ページのみを消費します。そのために、サイズが1の読み出し専用ページを持つモジュールは、モジュールのRAM要件には数えられません。読み出し専用ページのサイズが1以上のカーネルとモジュールは例外となります。これらの例外については、読み出し専用と読み出し/書き込みセクションの合計がRAM要件となります。

MinInput

MinInputシステムは、最小限入力システムを表します。これには、カーネル、基本ファイル システム、レジストリと基本ユーザー入力サポート機能が含まれます。基本ユーザー入力サポート機能には次のものが含まれます。メッセージ キュー、タッチ パッド、キーボード入力デバイス、オーディオ、パワー、通知LED、アイドル。

次の表は、再販用MinInput構成のシステム起動直後の数値をキロバイト(K)単位で示したものです。

モジュール ROM(K) RAM(K) Stack(K)
Nk.exe 119 5 4
Filesys.exe 57 6 1
Gwes.exe 60 9 3
Coredll.dll 94

またこの構成は、ROMに次のDLLも含みます。

モジュール ROM(K) Toolhelp.dll 2 Keybddr.dll 8 Touch.dll 12

MinGDI

MinGDI システムは、GDIを持つ最小限のシステムのことです。最小限のGDIには、MinInputシステムのすべてのコンポーネントがあり、基本描画プリミティブとデバイス コンテキストが追加されています。

次の表は、再販用MinGDI構成のシステム起動直後の数値を示したものです。

モジュール ROM(K) RAM(K) Stack(K)
Nk.exe 119 7 4
Filesys.exe 122 7 1
Gwes.exe 282 697 4
Coredll.dll 103

この構成には、MinInput構成で示したDLLに加えて、ROMに次のDLLも含まれています。

モジュール ROM(K)
Ddi.dll 29
Wavedev.dll 15

MinComm

MinComm構成は、最小限通信機能をもつシステムを表します。MinCommシステムには、MinInputシステムのすべてのコンポーネントが含まれており、通信スタック(TCP/IP、PPP、TAPI、 Serial、NDIS、IRDA)が追加されています。

次の表は、再販用MinComm構成のシステム起動直後の数値を示したものです。

モジュール ROM(K) RAM(K) Stack(K)
nk.exe 119 31 4
filesys.exe 86 9 1
gwes.exe 45 12 1
device.exe 15 67 8
coredll.dll 128

この構成には、MinInput構成で示したDLLに加えて、ROMに次のDLLも含まれています。

モジュール ROM(K)
ppp.dll 64
cxport.dll 6
ircomm.dll 7
winsock.dll 18
secur32.dll 19
schannel.dll 111
ntlmssp.dll 14
afd.dll 39
arp.dll 19
ndis.dll 42
ne2000.dll 21
tcpstk.dll 98
irdastk.dll 55
tapi.dll 17
unimodem.dll 21
redir.dll 74
netbios.dll 25
wininet.dll 105
pcmcia.dll 29
serial.dll 26

HPC2Apps

HPC2Apps構成は、Handheld PCに見られる完全なシステムを表します。HPC2Apps構成は、MinCommシステムのすべてのコンポーネントを含み、(CreateWindowなどの)ウィンドウ関連のAPI関数を追加したものです。

モジュール ROM(K) RAM(K) Stack(K)
nk.exe 119 K 46 4
filesys.exe 122 K 9 4
gwes.exe 508 K 724 7
device.exe 15 K 78 10
coredll.dll 122

この構成には、MinComm構成で示したDLLに加えて、ROMに次のDLLも含まれています。

モジュール ROM(K)
fatfs.dll 54
prnport.dll 5
pcl.dll 24
atadisk.dll 9
sramdisk.dll 7
waveapi.dll 68
ole32.dll 150
oleaut32.dll 183
dhcp.dll 13
hwxusa.dll 86
netui.dll 19

ROM使用の表示

Microsoft Windows CE ROM Image Builderユーティリティ、Romimage.exeの出力を調べることによって、ファイルがどのようにROMに配置されているかを正確に参照することが可能です(本稿の数字は、Image Builderユーティリティのログ ファイルから得たものです)。

ファイルは、セクションに分けられROMに配置されています。このセクションは、Windows CE開発ツールによって次のように特徴づけられています。

セクション 説明
.text コード
.rsrc リソース データ
.data データ
.pdata コード セクションの各関数のデバッグと例外処理情報
.CRT 特別セクション-C++構造体
.KDATA 特別セクション-カーネル(Nk.exe)にのみ存在

Romimageは、コマンド ライン ユーティリティです。典型的なRomimagセッションで出力される最初の数行は、プログラムのバナー、ページ サイズ、MODULESセクションの始まりを表示します。

  
Windows CE ROM Image Builder  v1.0  Copyright Microsoft 1995.
Copying d:\WINCE\release\odo2bpp.dll to d:\WINCE\release\ddi.dll for debugger.
Copying d:\WINCE\release\odo2bpp.pdb to d:\WINCE\release\ddi.pdb for debugger.
Setting PageSize to 1024
DumpSymbols: pTOC found at 00000e50
MODULES Section
Module       Section  Start     Length  psize   vsize   Filler
------------ -------- --------- ------- ------- ------- ------
nk.exe       .text    8c600400h  116736  116736  116268
nk.exe       .pdata   8c61cc00h    4096    4096    3864
coredll.dll  .text    8c61dc00h  119808  119296  118987
coredll.dll  .rsrc    8c63b000h    1024    1024     528
...

MODULESセクションの最初のエントリ、Nk.exeは、サイズ116268 = 0x1c62cバイトです。実際のサイズは、次の1024バイトのページ境界、16736 = 0x1c800まで丸められ、ROMに格納されています。これは、付属ファイル用に利用可能な468バイトの穴を残します。同様に、Coredll.dllの.rsrcセクションを含んでいる最後のページの終りにある、アドレス0x8c63b210から496バイトの穴が利用できます。

すべての.text(コード)セクション配置後、Romimageは1ページより小さいデータ セクションをこれらの穴に配置し始めます。たとえば、同じRomimageログは、MODULESの後半に次の情報を含みます。

  
Module       Section  Start     Length  psize   vsize   Filler
------------ -------- --------- ------- ------- ------- ------
...
coredll.dll  .data    8c61ca2ch       4       4     200 FILLER
coredll.dll  .pdata   8cb32800h    4868    4866    8064
filesys.exe  .data    8cb33b04h   12236   12234   21376
filesys.exe  .pdata   8cb36ad0h    2152    2149    2640
gwes.exe     .data    8cb37338h   10796   10794   17828
gwes.exe     .pdata   8cb39d64h   12456   12456   15768
device.exe   .data    8c61ca30h     213     213     276 FILLER
device.exe   .pdata   8c63b210h     341     341     424 FILLER
fatfs.dll    .data    8c659c84h     366     366     504 FILLER
fatfs.dll    .pdata   8cb3ce0ch    1324    1322    1624
shell.exe    .data    8cb3d338h    1608    1605    2864
shell.exe    .pdata   8c61cb05h     183     183     208 FILLER
...

Coredll.dllの最初の.dataセクションは4バイトで、最初の利用可能な穴、0x8c600400 + 0x1c62c = 0x8c61ca2cに配置されます。4バイト消費されるので、次の穴埋め開始アドレスは0x8c61ca30に移動し、穴が464バイトに縮小します。

1ページより小さい次の.dataセクションは、Device.exe用で、213 = 0xd5バイト必要です。これは、最初の穴の残容量以内に収まる程度に十分に小さいです。そこに配置され、アドレスは0x8c61cb05に変わり、穴は251バイトに縮小します。

  
device.exe   .data    8c61ca30h     213     213     276 FILLER

Device.exeの.pdateセクション、341バイトは、穴の残容量より大きいです。そのため、Coredll.dllリソース セクションの最後のページに続く0x8c63b210から始まるに別の穴に配置されます。

  
device.exe   .pdata   8c63b210h     341     341     424 FILLER

最初の穴の残容量251バイトより小さい次の.data または.pdataセクションは、デバック シェル、Shell.exeの.dataセクション、183バイトです。最初の穴において次に利用可能なアドレス0x8c61cb05に配置されます。

  
shell.exe    .pdata   8c61cb05h     183     183     208 FILLER

Romimageツールは、すべてのセクションが配置されるまでこれを続けます。使われなかった残りの穴も、レポートの一部として次のように表示されます。

  
Unfilled ROM Holes (Address,Length):
8c9cfbf8h       8 8caef3f8h       8 8cb253f8h       8 8cb2bff8h       8
8c769bf9h       7 8c8d4ffah       6 8c8f37fah       6 8c98dffah       6
8cb16ffah       6 8cb1d7fah       6 8cb327fah       6 8c61dbfbh       5
8c6e6ffbh       5 8c763ffbh       5 8c855ffbh       5 8c935bfbh       5
8c9877fbh       5 8c7537fch       4 8c765bfch       4 8c7bcffch       4
8c7d3bfch       4 8c80dbfch       4 8c82f3fch       4 8c8f27fch       4
8c938ffch       4 8c9c17fch       4 8c9e23fch       4 8ca6e7fch       4
8cacfbfch       4 8cb20bfch       4 8c61cbfdh       3 8c659ffdh       3
8c6e13fdh       3 8c6e23fdh       3 8c6e87fdh       3 8c6ee7fdh       3
8c63b3feh       2 8c74fffeh       2 8c785ffeh       2 8c7b8ffeh       2
8c7c23feh       2 8c9717feh       2 8c99d7feh       2 8cb09ffeh       2
8cb227feh       2 8c63afffh       1 8c65a3ffh       1 8c6ea7ffh       1
8c788fffh       1 8c793fffh       1 8c9727ffh       1 8c9a8bffh       1
8ca83bffh       1 8cacf7ffh       1 8cb047ffh       1 8cb0bfffh       1

実行形式とDLLのサイズと数は、構成によってそれぞれ異なるので、穴埋め部分を識別できるという機能は重要です。構成が異なれば、利用できる穴のサイズが変わり、必要なメモリの合計容量に影響するからです。

モジュールのROM使用量を求めるには、それぞれのモジュールについてRomimageユーティリティ出力に表示されるすべてのセクションの合計を算出します。ただし、穴に埋め込まれるセクションは除きます。穴埋めセクションは、利用可能な穴に挿入されるので、モジュールに必要なメモリを増やしません。

仮想メモリの表示

Memtoolユーティリティを使用して、仮想メモリのすべてのページを調べることができます。Memtoolは、各プロセスで利用できる32メガバイト(MB)スロットの完全なメモリ マップを提供します。メモリ マップは、コードとデータがROMまたはRAMにあるかどうかを示します。

またMemtoolは、現在のスタック使用のサマリも表示します。スタックの大きさは、必要に応じて拡大縮小して動的に変わります。表示されるスタックのサイズは、必要最大容量を示さないこともあります。これらは、Memtoolユーティリティによって調べられた時点でのスタックの状態を示します。

たとえば、Filesys.exeプロセスのメモリ マップの最初の数行は、様々な使用の種類を示します。各シンボルは、メモリのページを表し、そのページがどのように使用されているかを示します。

  
Memory usage for Process 8c056d2c: 'filesys.exe' pid 1
Slot base 04000000  Section ptr 8cfe4c00
    04000000(1): ----------------------r-----------------------------------------
    04010000(0): -CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
    04020000(0): CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
    04030000(0): CCCCCCCCCCWWWWWWWWWWWWWWWWWWWWW---R
    04040000(0): -------------------------------------------------SSS----SSSS
    04050000(0): PPPPOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO

ハイフン文字(-)は、ページが予約されていることを示します。小文字のrはRAMにあるデータを、大文字のCはROMにあるコードを、WはRAMの読み出し/書き込みデータを、RはROMのデータを、Sはスタックを、Pは(カーネルを通して割り当てられていないがGwesやデバイス ドライバによってマップされている)周辺装置のメモリを、Oはオブジェクト ストアを示します。これらのシンボルに加えて、小文字のcはRAMから実行されているコードを示します。

Memtoolユーティリティは、メモリ マップに続いて、サマリ情報を表示します。PpshユーティリティのMIコマンドを似たような情報を表示できます。以下はその表示例です。

  
Memory usage for Process 8c036d2c: 'filesys.exe' pid 1
Slot base 04000000  Section ptr 8c5e7000
Page summary: code=207(0) data r/o=2 r/w=7 stack=1 reserved=13963

ページ サマリの部分(Page summary)で、codeの横に表示されている値は、ROMのページ数を示します。かっこ内の数字は、RAMのページ数を示します。dataの部分は、それぞれ読み出し専用(r/o)と読み出し/書き込み(r/w)ページを示します。stackの横の値は、スタックによって使用されているページ数を示します。

他のマイクロプロセッサとプラットフォームの必要メモリに関する情報を得るには、ROM Image BuilderとPpshまたはMemtoolユーティリティの出力を調べてください。これらのユーティリティについての完全なドキュメントは、Microsoft Windows CE Embedded Toolkit for Visual C++(r) 5.0に含まれています。

関連情報

Microsoft Windows CE Embedded Toolkit for Visual C++ 5.0については、Microsoft Windows CE Webサイト(https://www.microsoft.com/windowsce/developer/prodinfo/vcceembed.htm)を参照してください。またこのツールキットは、MSDNライブラリのユニバーサル サブスクリプションのメンバーにも配布されます。

また、次の記事も参照してください。すべてMSDN Libraryで入手できます。

"Embedded Development with Microsoft Windows CE 2.0," Franklin Fite Jr.、Randy Kath著
"Introducing the Windows CE Embedded Toolkit for Visual C++ 5.0," David Pellerin著
"Microsoft Windows CE Display Drivers and Hardware," Jason Black、Jon Christiansen著
"Microsoft Windows CE Graphics Features," Jon Christiansen著
"The Microsoft Windows CE Communications Model," Guy Smith著
"Real-Time Systems with Microsoft Windows CE," John Murray著
"The Win32 Programming Model: A Primer for Embedded Software Developers," David Pellerin著

本ドキュメントの内容は、ここで取り上げた問題についての発行日現在のMicrosoft Corp.の見解です。Microsoftは移り変わる市場の状況に対応していかねばならないため、本ドキュメントはMicrosoftの責任の一部として解釈されるべきものではなく、Microsoftはここで示した情報の発行日以後の精度を保証しません。この報告書は情報提供だけを目的とするものです。

MICROSOFTは本ドキュメントで明示あるいは黙示を問わず一切の補償を行いません。