Windows CE 的内存使用

类别:VC语言 点击:0 评论:0 推荐:

介绍

    Microsoft®Windows® CE是组件化的操作系统,它可根据目标设备或平台的不同特点进行定制。原始设备制造商(OEM)或嵌入系统开发者可以选择所需的系统模块和组件,将其提供给用于目标平台的操作系统。所选择的模块和组件确定了它的内存需求情况。
    一个模块表示一个完整的功能区域,在系统软件中可将其表示出也可以不将其表示出。如果不需要该功能,那么可以将整个模块忽略。例如,用一个名为“serial”的简单的模块提供出所有串行端口的功能,可以将其包括在系统中也可以不包括。
    一些大的模块可以进一步分成几个组件。这使得OEM厂商可以通过仅仅包含OEM设备的需要的组件,定制出这些模块更小的版本。例如,文件系统模块包括RAM文件系统、ROM文件系统、注册表和数据库几个组件。OEM可以(按照一定的限制)组合这些文件系统的组件使之满足目标系统的需要。
    为了帮助OEM和嵌入系统开发者做决定,这对于了解给定模块或组件的内存耗费情况是十分有用的。本文将讲述Windows CE 2.0操作系统是如何使用内存的,并列出对于所选的Windows CE系统配置中主要系统模块和组件的内存需求情况。同时也将讲述如何使用Windows CE工具查看其他配置情况下的内存需求情况。
    对于Windows CE 2.0版,微软已经创建并测试了这些模块和组件的几种基本配置。这些配置代表了不同的几组系统性能,从仅带有最小用户输入并且没有显示能力的基本系统,到用于手持PC(H/PC)上的具有Microsoft Windows全部外观和感觉的完整系统。
    每个配置都是建立在前一个配置的基础上的。下列表格列出了在本文中被讨论到的被测试过的配置。

配置

描述

最小输入系统(MinInput)

核心、基本文件系统、注册表和基本用户支持。基本用户支持包括:对消息队列、触摸板、键盘输入设备、声音、电源、发光二极管(LED)提示和机器空转的支持。

最小图形显示接口(MinGDI)

MinInput并加上最小的GDI(基本绘图元、设备上下文)。

最小通信(MinComm)

MinInput并加上通信堆栈(传输控制协议/Internet协议[TCP/IP]、点对点协议、电话应用程序编程接口[TAPI],串行端口、网络设备/驱动接口描述[NDIS]、红外线数据联接[IRDA])。

Windows用户接口(UI)配置(HPC2Apps)

MinComm并加上所有和Window相关的API函数(例如CreateWindow),这就是用于H/PC上的版本。

系统内存的使用

    典型的Windows CE设备包括ROM和RAM内存。当设备被关闭时,设备也可以通过使用充电的后备电池而继续维持RAM中的内容。
    系统内存可以按照下列表格中描述的情况分类。

内存

描述

ROM

包含Windows CE的执行体和其他系统文件。这些文件的文本(代码)和只读数据部分是未被解压到执行位置(XIP)的部分。

RAM——存储内存

包括文件系统(包括注册表和Windows CE数据库)。包括可读/写数据区。

RAM——程序内存

工作RAM.

    ROM包含未解压到执行位置(XIP)的文件,包括系统执行体、动态链接库(DLLs)和被捆绑的应用程序如Microsoft Pocket Word。这些文件都起始于页面的边界。ROM还包括这些应用程序所使用的各种文件,如字体、声音和位图。这些文件中的大多数被压缩了(除了一些字体例外)。代码和执行体的只读部分以及DLLs被解压到启用的执行位置。由于可读/写部分在指定的RAM,它们将在那里被压缩。
    为了节省空间,这些小文件和被压缩的可读/写区中的许多被放置在内存的缝隙中。这些缝隙是放置在ROM中的代码或只读内存区的最后一页省下的空间。
    压缩ROM中的执行体或DLL也是可能的。当这类执行体运行时,请求换页程序将所虚页面解压并将它们装入RAM。
    RAM被分成两个部分:存储内存和程序内存。存储内存包括注册表、文件系统和数据库。文件系统包括由用户安装或创建的应用程序和数据文件。在文件系统中的所有文件都是被压缩的。程序内存是由系统使用的并用于运行应用程序。用户在任何时刻不需重新启动,就可以重新调整对存储内存和程序内存的划分。
    用户安装的应用程序压缩驻留在文件系统中。代码和数据需要被解压到程序内存来执行。请求换页被支持——当一个用户安装的应用程序被启动时,仅有一小部分应用程序需要被解压到程序内存。
    除了数据部分,每个执行体通常都耗费一定量的程序内存用于它的堆栈数据。堆栈通常可以动态增加或减少。

Windows CE Version 2.0 的内存使用

    下列表格显示了带有SH3微处理器的HitachiD9000开发平台上的内存使用情况。RAM和栈的数值是在启动后Memtool实用程序检查系统状态时取得的。这些数据是按照下列方式计算出的:
ROM (代码和只读数据)。列于Romimage实用程序输出模块的所有部分的总合。 RAM通过Memtool实用程序和Ppsh实用程序内存信息(mi)命令在页面总计处列出的可读写数据。 Stack通过Memtool实用程序和Ppsh实用程序内存信息(mi)命令在页面总计处列出对于栈的数值。

尽管Memtool和Ppsh实用程序显示出每个进程在RAM中只读数据,但是这个内存常常仅代表核心分配出的共享内存。这个共享内存物理上仅消耗核心所使用的一个页面。因此,带有尺寸为1的只读页面的模块并没有计算到模块RAM的需求。额外部分包括核心和只读页面尺寸大于1的模块。由于这些额外部分,RAM的需求可以算成是只读和可读/写部分的总和。

MinInput

    MinInput系统代表一个具有最小输入的系统。它包括核心、基本文件系统、注册表和基本用户的输入支持。基本用户的输入支持包括:对消息队列的支持、触摸面板、键盘输入设备、声音、电源、提示LED和空转控制。
    下列表格是以千字节为单位(K)显示出在系统刚刚启动后,MinInput的详细配置值。

模块

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中还包括了下列DLLs。

模块

ROM (K)

Toolhelp.dll

2

Keybddr.dll

8

Touch.dll

12

MinGDI

    MinGDI系统代表一个带有GDI的最小系统。MinGDI系统包括了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配置中列出的DLLs外,该配置的ROM中还包括了下列DLLs。

模块

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配置中列出的DLLs外,该配置的ROM中还包括了下列DLLs。

模块

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系统中的所有组件,并添加了所有与Windows相关的API函数(如CreateWindow)。

模块

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配置中列出的DLLs外,该配置的ROM中还包括了下列DLLs。

模块

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是一个命令行工具。从一个典型的Romimage部分输出的头几行包括:程序的标题、页面大小和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 at00000e50
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字节的边界上,116736 = 0x1c800,并且被放置到ROM中。这便留下了一个468字节的“洞”,可以提供给其他文件使用。同样,在0x8c63b210地址处有一个496字节的“洞”,它出现在Coredll.dll .rsrc 部分的最后一个页面的末尾。
    在放置完所有的.text(代码)部分后,Romimage开始将小于一页的数据部分放置到这些“洞”中。例如,在稍后的MODULES部分中,相同的Romimage日志包含了下列信息:

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字节。
下一个小于一页的.data数据部分是Device.exe的数据部分,它需要213 = 0xd5字节,而且在第一个“洞”剩余的空间足够容纳它。它被放置到此处,将地址变为0x8c61cb05,将该“洞”缩小为251字节。
device.exe   .data    8c61ca30h     213     213     276 FILLER
Device.exe的.pdata部分为341字节,比这个“洞”剩余的空间大,因此它被放置到另一个“洞”—— Coredll.dll资源部分最后一个页面上的“洞”,起始位置是0x8c63b210。
device.exe   .pdata   8c63b210h     341     341     424 FILLER
接下来的.data或.pdata部分都比第一个“洞”剩余的251字节小,其中调试器命令解释器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

    识别FILLER部分的能力是十分重要的,因为执行体和DLLs的大小和数量对于不同的配置有所不同。这将影响可使用的“洞”的大小,并影响所需的全部内存量。
    要确定每个模块的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) datar/o=2 r/w=7 stack=1 reserved=13963
    在页面摘要中,code后面的值表示ROM中的页面数。圆括号中的数字表示了RAM中的页面数。数据页面中分别表示了只读或读/写页面数。Stack后面的值表示了堆栈所用的页面数。
    要得到其他微处理器和其他平台上的内存需求信息,可以使用ROM Image Builder、Ppsh或Memtool工具来查看它们的输出信息。这些工具的完整文档可以在Microsoft Windows CE Embedded Toolkit for Visual C++® 5.0中找到。

关于此内容的其他信息

关于Microsoft Windows CE Embedded Toolkit for Visual C++ 5.0,可以参阅Microsoft Windows CE Web站点。该工具将提供给MSDN Library的普通订户。

 

本文地址:http://com.8s8s.com/it/it3395.htm